你如何使用resizeAspectFill在watchOS上播放视频?

Zel*_*lko 7 video movie ios watchkit watchos

在watchOS应用中播放视频.

WKInterfaceMovie - 一个界面元素,可让您在watchOS应用程序中播放视频和音频内容.


按预期工作.视频播放.如何缩放它以填满屏幕

  1. 故事板中有一个可视化选项.选择调整大小宽高比填充将被忽略.

Xcode的屏幕截图

  1. 有一个功能: func setVideoGravity(_ videoGravity: WKVideoGravity)

电影的大小调整选项.有关可能值的列表,请参阅WKVideoGravity类型.


import WatchKit
import Foundation

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var movieView: WKInterfaceMovie!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        setupVideoPlayer()
    }

    func setupVideoPlayer() {
        guard let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4") else {
            return
    }

        movieView.setMovieURL(videoURL)
        movieView.setVideoGravity(.resizeAspectFill)
    }
}
Run Code Online (Sandbox Code Playgroud)

Xcode中的基本设置.轻触播放按钮时视频加载.加载后播放.不填充屏幕.


WKVideoGravity

表示视频内容外观的常量.

case resizeAspectFill
Run Code Online (Sandbox Code Playgroud)

调整内容的大小以完全填充边界矩形,同时保留内容的原始宽高比.此选项会导致视频边缘超出其裁剪范围.

那很完美.我们来试试吧.


它不起作用.

无论videoGravity(在故事板或代码中),视频播放都会调整大小以适应,只有在我点按两次时才会填满屏幕.

我错过了什么?


另外,如果我presentMediaPlayerController使用Media Player Options 探索该方法,我会注意到一种奇怪的行为:

WKMediaPlayerControllerOptionsAutoplayKey

WKMediaPlayerControllerOptionsStartTimeKey

WKMediaPlayerControllerOptionsVideoGravityKey (失败并回退到默认行为)

总的来说,它似乎已被打破.如果有人有想法,我会喜欢解决方法.

Mos*_*bah 0

手表上的 Apple API 有问题,这显然不起作用,如果您愿意,可以打开雷达。

另一种方法是使用 WKInterfaceInlineMovie ?您可以将视频格式化为所需的宽高比(使用 ffmpeg 或其他工具),请参阅此处修改自 Apple 示例的代码

class MovieDetailController: WKInterfaceController {
    @IBOutlet var inlineMovie :WKInterfaceInlineMovie!
    @IBOutlet var tapGestureRecognizer :WKTapGestureRecognizer!
    var playingInlineMovie :Bool = false

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        // Setup the `inlineMovie` interface object with the URL to play.
        inlineMovie.setMovieURL(movieURL!)

        // Provide a poster image to be displayed in the inlineMovie interface object prior to playback.
        inlineMovie.setPosterImage(WKImage (imageName: "Ski1"))
        inlineMovie.setVideoGravity(.resize)

        // Movie playback starts
        playingInlineMovie = false
    }

    @IBAction func inlineMovieTapped(sender : AnyObject) {
        if playingInlineMovie == false {
            inlineMovie.play()
        } else {
            inlineMovie.pause()
        }

        playingInlineMovie = !playingInlineMovie
    }
}
Run Code Online (Sandbox Code Playgroud)