【问题标题】:How to get AVPlayer to redraw current AVItem videoComposition when paused暂停时如何让 AVPlayer 重绘当前的 AVItem videoComposition
【发布时间】:2018-09-14 21:29:35
【问题描述】:

我正在为 macOS 构建一个简单的视频编辑器:电影文件作为 AVAsset 加载,由 AVVideoComposition 中的一系列 CIFilter 转换,并由 AVPlayer 播放。我展示了 CIFilters 的一些参数的 UI 控件。

当视频播放时,一切都很好,我滑动滑块并改变效果!但是当视频暂停时,在 UI 中的控件发生更改后,AVPlayerView 不会重绘。

如何鼓励 AVPlayerView 在暂停时重绘其当前项目的 videoComposition 的内容?

class ViewController: NSViewController {

    @objc @IBAction func openDocument(_ file: Any) { ... }

    @IBOutlet weak var moviePlayerView: AVPlayerView!

    var ciContext:CIContext? = CIContext(mtlDevice: MTLCreateSystemDefaultDevice()!)

    var sliderValue: Double = 0.0

    @IBAction func sliderMoved(_ sender: NSSlider) {
        self.sliderValue = sender.doubleValue
        // need to update the view here when paused
        self.moviePlayerView.setNeedsDisplay(self.moviePlayerView.bounds)
        // setNeedsDisplay has no effect.
    }

    func loadMovie(file: URL) {
        let avMovie = AVMovie(url: file)
        let avPlayerItem = AVPlayerItem(asset: avMovie)

        avPlayerItem.videoComposition = AVVideoComposition(asset: avMovie) { request in
            let output = request.sourceImage.applyingGaussianBlur(sigma: self.sliderValue)
            request.finish(with: output, context: self.ciContext)
        }

        self.moviePlayerView.player = AVPlayer(playerItem: avPlayerItem)
    }
}

【问题讨论】:

    标签: macos avfoundation avplayer core-image


    【解决方案1】:

    事实证明,重新设置 AVPlayerItem 的 videoComposition 属性将触发项目重绘。即使您将属性设置为它的当前值,这仍然有效:item.videoComposition = item.videoComposition。属性设置器似乎具有未记录的副作用。

    要修复上面的示例代码,请执行以下操作:

    @IBAction func sliderMoved(_ sender: NSSlider) {
        self.sliderValue = sender.doubleValue
        // update the view when paused
        if self.moviePlayerView.player?.rate == 0.0 {
            self.moviePlayerView.player?.currentItem?.videoComposition = self.moviePlayerView.player?.currentItem?.videoComposition
        }
    }
    

    希望有人觉得这很有用!

    【讨论】:

    • 问题是 AVPlayer 在你设置 videoComposition 属性的那一刻开始播放。你是怎么解决的?
    • 好的,我认为使用此解决方法,播放器不会开始播放。如果我将 videoComposition 设置为 first nil 然后是旧值,则播放器开始播放。
    • 我还注意到这种行为在 Catalina Beta 5 (19A526h) 中发生了变化。我已经向 Apple 提交了一个错误。对我来说,将 videoComposition 设置为 nil,然后旧值在 Catalina 中“起作用”,但性能差得令人无法接受,并且控制台记录了许多错误。
    • macOS 10.15 和 iOS 13 可以通过以下方式修复:player.currentItem?.videoComposition = player.currentItem?.videoComposition?.mutableCopy() as? AVVideoComposition
    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2020-05-28
    相关资源
    最近更新 更多