Как вы воспроизводите видео на watchOS с помощью resizeAspectFill? - PullRequest
0 голосов
/ 15 января 2019

Воспроизведение видео в приложении watchOS.

WKInterfaceMovie - Элемент интерфейса, позволяющий воспроизводить видео и аудиоконтент в приложении watchOS.


Работает как положено. Видео играет. Как насчет масштабирования до заполнения экрана ?

  1. В раскадровке есть визуальная опция. Выбор Resize Aspect Fill игнорируется.

Screenshot of 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)
    }
}

Базовая настройка в Xcode. Видео загружается при нажатии на кнопку воспроизведения. Играет после загрузки. Не заполняет экран.


WKVideoGravity

Константы, указывающие на внешний вид видеоконтента.

case resizeAspectFill

Содержание изменено, чтобы заполнить границы прямоугольник полностью, сохраняя при этом исходное соотношение сторон содержание. Эта опция приводит к обрезке краев видео в ось, которую он превышает.

Это прекрасно. Давайте попробуем.


Это не работает.

Независимо от videoGravity (в раскадровке или коде) видео воспроизводится с измененным размером до и заполняет экран только при двойном нажатии.

Чего мне не хватает?


Кроме того, если я исследую метод presentMediaPlayerController с помощью параметров Media Player, я заметил странное поведение:

WKMediaPlayerControllerOptionsAutoplayKey

WKMediaPlayerControllerOptionsStartTimeKey

WKMediaPlayerControllerOptionsVideoGravityKey ? (Сбой и откат к поведению по умолчанию)

В целом, похоже, что он сломан. Я бы хотел обойти эту проблему, если у кого-то есть идеи.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы не должны устанавливать значение видеогравитации программно.Хотя они предоставляют его в инспекторе атрибутов.

Установите Гравитация видео на Изменить размер

Инспектор атрибутов должен выглядеть как снимок экрана ниже.

enter image description here

И ваш код будет таким, как показано ниже.

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)
}}
0 голосов
/ 17 января 2019

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
    }
}
...