SwiftUI — добавление управления скоростью воспроизведения в AVPlayer

Я использую AVPlayer в своем текущем проекте SwiftUI. Я пытаюсь реализовать контроль скорости воспроизведения, аналогичный тому, что Apple имеет в своем видеоплеере для приложения разработчика (как на данном снимке экрана), но пока не нашел ответов. Любые выводы по этому вопросу будут высоко оценены.

Вот мой код для видеоплеера.

import AVKit

struct pipPlayer: UIViewControllerRepresentable {
    var videoUrl: URL = URL(string: "Video Link")!

    // Create the player and set the basic controls
    func makeUIViewController(context: UIViewControllerRepresentableContext<pipPlayer>) -> AVPlayerViewController {
        let controller = AVPlayerViewController()
        let player1 = AVPlayer(url: videoUrl)
        controller.player = player1
        controller.allowsPictureInPicturePlayback = true
        controller.player!.play()
        return controller
    }

    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<pipPlayer>) {
    }
}

person Amol Kumar    schedule 30.03.2021    source источник
comment
У меня была такая же проблема несколько месяцев назад. Я не нашел способа сделать это изначально, поэтому в итоге я скрыл собственные элементы управления AVPlayerViewController и создал свои собственные элементы управления с нуля. Но это действительно плохое решение, потому что встроенные элементы управления имеют множество функций, и для их полной замены потребуется много времени.   -  person nikano    schedule 09.06.2021
comment
Связано: stackoverflow.com/q/36848244/3151675   -  person Tamás Sengel    schedule 11.06.2021


Ответы (1)


Вы можете использовать updateUIView для обновления скорости воспроизведения.

struct AVPlayerView: UIViewRepresentable {

    private let player: AVPlayer
    let playbackRate: Float

    init(videoUrl: URL, playbackRate: Float) {
        self.player = AVPlayer(url: videoUrl)
        self.playbackRate = playbackRate
    }

    func makeUIView(context: UIViewRepresentableContext<AVPlayerView>) -> UIView {
        let controller = AVPlayerViewController()
        controller.player = player
        controller.allowsPictureInPicturePlayback = true
        controller.player?.play()
        return controller.view
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<AVPlayerView>) {
        player.rate = playbackRate
    }
}
person Cuneyt    schedule 31.03.2021
comment
Это правильно. Но я пытаюсь добавить в плеер регулятор скорости воспроизведения, аналогичный тому, что на скриншоте (красный кружок). - person Amol Kumar; 31.03.2021
comment
Я не понимаю, а в чем тут вопрос? У вас проблема с созданием кнопки или с размещением дна, или у вас проблемы с логикой? Если у вас есть проблема с несколькими вещами, вам нужно будет задать новый вопрос для каждой из них. - person Cuneyt; 07.04.2021
comment
Что ж, я пытаюсь добавить кнопку скорости воспроизведения видео в AVPlayer (вы можете обратиться к красному кругу на скриншоте выше). И пока не нашел решения. - person Amol Kumar; 08.04.2021
comment
@AmolKumar Я обновил свой ответ, пожалуйста, посмотрите. - person Cuneyt; 09.04.2021
comment
У кого-нибудь есть решение? Пытаюсь решить и это. - person zumzum; 21.04.2021