繁体   English   中英

帧更改的AVPlayer回调(观察者)

[英]AVPlayer Callback (Observer) for Frame Changed

有没有办法在AVPlayer上设置观察者/回调以在帧变化时得到通知?

我知道addBoundaryTimeObserveraddPeriodicTimeObserver但是这些是需要我估计帧速率等的近似值。

有一条说明:

一般状态观察:您可以使用键值观察(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM