Как воспроизвести видео на watchOS с помощью resizeAspectFill?

Воспроизведение видео в приложении 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)
    }
}

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


WKВидеоГравитация

Константы, указывающие на появление видеоконтента.

case resizeAspectFill

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

Это идеально. Давай попробуем.


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

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

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


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

WKMediaPlayerControllerOptionsAutoplayKey

WKMediaPlayerControllerOptionsStartTimeKey

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

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


person Zelko    schedule 15.01.2019    source источник
comment
Не могли бы вы поделиться своим кодом?   -  person Mosbah    schedule 17.01.2019
comment
Добавлен код для контекста   -  person Zelko    schedule 22.01.2019
comment
@Zelko, ты пробовал мой ответ. в моем работает идеально. обратитесь к этому руководству, пожалуйста, youtube.com/watch?v=jyRdPUmhLtQ и techotopia.com/index.php/   -  person Sagar koyani    schedule 24.01.2019
comment
Спасибо, но это не сработало.   -  person Zelko    schedule 25.01.2019
comment
Вы когда-нибудь находили решение?   -  person iVentis    schedule 27.08.2019
comment
Пока нет... Может когда-нибудь   -  person Zelko    schedule 03.09.2019


Ответы (2)


API-интерфейсы Apple на часах глючат, это явно не работает, вы можете открыть радар, если хотите.

Альтернативой является использование 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
    }
}
person Mosbah    schedule 17.01.2019

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

Установите для параметра Video Gravity значение Изменить размер.

Ваш инспектор атрибутов должен выглядеть так, как показано ниже.

введите здесь описание изображения

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

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)
}}
person Sagar koyani    schedule 23.01.2019
comment
Спасибо, но независимо от того, где он установлен (раскадровка или код), все не работает. - person Zelko; 24.01.2019
comment
Спасибо. Да, Resize Aspect — это поведение по умолчанию. Это прекрасно работает. Проблема связана с другими параметрами, в частности с изменением размера заливки. - person Zelko; 25.01.2019