2017-05-10 10 views
1

AVPlayerにオブザーバ/コールバックを設定して、フレームが変更されたときに通知を受け取る方法はありますか?フレームのAVPlayerコールバック(オブザーバ)が変更されました

一般的な状態の観察::あなたが使用することができ、私はaddBoundaryTimeObserveraddPeriodicTimeObserverの両方を認識してい

しかし、これらは、フレームレートを推定するために私を必要と近似など

ているノートがあることがあります現在のアイテムやその再生レートなど、多くのプレーヤーの動的プロパティの状態変化を観察するためのキー値観測(KVO)。メインスレッドでKVO変更通知を登録および登録解除する必要があります。これにより、別のスレッドで変更が行われている場合に部分的な通知を受け取る可能性がなくなります。 AV Foundationは、変更操作が別のスレッドで行われた場合でも、メインスレッドでobserveValue(forKeyPath:of:change:context :)を呼び出します。 AVPlayerItem

しかしcurrentTime私はそのためにKVOを使用することはできませんので、この方法ではなく、プロパティです。

答えて

0

あなたのAVPlayerItemAVPlayerItemVideoOutputを追加して、定期的に新しいフレームの到着を教えてくれますhasNewPixelBufferForItemTimeで出力をポーリングすることができます。しかし、copyPixelBufferForItemTimeでフレームを取得する必要があるので、すぐにそれをリリースする必要があります。以下は、AVPlayerItemVideoOutputの設定例です。これはポーリングであるため、フレームの変更が遅れたり、欠落したりすることがあります。

また、フレームを解凍せずにビデオファイル(がファイルの場合は)を素早く前処理して、フレームのプレゼンテーションタイムスタンプを判別することもできます。これらのタイムスタンプを一度に1つずつaddBoundaryTimeObserverに送り、フレーム境界を越えたタイミングを判断できます。 parsing a video fileの例を示します。あなたはそれをビデオフレームを養うことができます

低いレベル AVPlayerLayerある

AVSampleBufferDisplayLayerCMSampleBufferは、フレームの変化を知るための有望な方法のようにに見えるが、あなたのときことを教えていないようですサンプルバッファの1つが表示されています。そして、私はAVSampleBufferDisplayLayerもオーディオを扱うとは思わない。

AVPlayer再生システムを再実装することもできます。フレームの変更(およびオーディオの変更、およびOpenGL /メタル)を痛いほど(正確に)認識することができます。確かに、そのような努力はここでは必要ない。どのような機能を正確に実装しようとしていますか?

+0

指定されたフレームに対応する画面のオーバーレイを上書きしようとしています。オーバレイは特定のフレームに対応しているので(スクラバーのような所与のタイムスタンプとは対照的に)、フレームが変化したときにオーバーレイを更新したい。 –

関連する問題