[英]AVPlayer Callback (Observer) for Frame Changed
有没有办法在AVPlayer
上设置观察者/回调以在帧变化时得到通知?
我知道addBoundaryTimeObserver
和addPeriodicTimeObserver
但是这些是需要我估计帧速率等的近似值。
有一条说明:
一般状态观察:您可以使用键值观察(KVO)来观察许多玩家动态属性的状态变化,例如其currentItem或其回放速率。 您应该在主线程上注册和取消注册KVO更改通知。 这避免了在另一个线程上进行更改时接收部分通知的可能性。 即使在另一个线程上进行了更改操作,AV Foundation也会在主线程上调用observeValue(forKeyPath:of:change:context :)。
但AVPlayerItem
上的currentTime
是一个方法,而不是属性,所以我不能使用KVO。
您可以将AVPlayerItemVideoOutput
添加到AVPlayerItem
并使用hasNewPixelBufferForItemTime
定期轮询输出,它将告诉您新帧的到达。 但是,您需要使用copyPixelBufferForItemTime
获取帧,因此您可能应该立即释放它。 以下是设置AVPlayerItemVideoOutput的示例。 这是轮询,所以你可以意识到迟到甚至错过帧更改。
您还可以快速预处理视频文件(如果它是文件)而不解压缩帧,以确定帧显示时间戳。 您可以一次一个地提供这些时间戳,以添加addBoundaryTimeObserver
来决定何时越过帧边界。 这是解析视频文件的示例。
AVSampleBufferDisplayLayer
,它是一个较低级别的AVPlayerLayer
,可以让你为它提供视频帧CMSampleBuffer
看起来像一个很有前途的方法来找出帧何时发生变化,但它似乎没有告诉你何时它显示了一个样本缓冲区你给它。 我也不认为AVSampleBufferDisplayLayer
处理音频。
您还可以重新实现AVPlayer
播放系统 - 然后您将痛苦地(并且准确地)了解帧更改(以及音频更改和opengl / metal)。 当然,这里不需要那种努力。 您准备实施什么样的功能?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.