2

iOSカメラからのフレーム(CVPixelBuffer)を保持するために使用するアプリがあります。デリゲート メソッドを使用します -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

iOS の最近の更新以降、以前のフレームが解放されない場合、デリゲート メソッドを介してフレームが到着することはなくなりました。今CVPixelBufferUnlockBaseAddressCVPixelBufferRelease新しいフレームが来る前に、保存されたフレームで呼び出される必要があります。

それはなぜですか?ハードウェアの最適化があったと思いますが、詳細は見つかりませんでした。

4

1 に答える 1

3

このデリゲート メソッドのドキュメントには、まさにこの状況が詳しく説明されています。

最適なパフォーマンスを維持するために、一部のサンプル バッファは、デバイス システムやその他のキャプチャ入力で再利用する必要がある場合があるメモリのプールを直接参照します。これは、メモリ ブロックが可能な限りコピーされない非圧縮デバイス ネイティブ キャプチャの場合によく見られます。複数のサンプル バッファがこのようなメモリ プールを長時間参照すると、入力は新しいサンプルをメモリにコピーできなくなり、それらのサンプルは削除されます。

提供された CMSampleBufferRef オブジェクトを長時間保持することでアプリケーションがサンプルを削除しているが、サンプル データに長期間アクセスする必要がある場合は、データを新しいバッファにコピーしてからサンプル バッファを解放することを検討してください (以前は保持されていた) ため、参照するメモリを再利用できます。

これは驚くべきことではありません。ビデオ キャプチャ システムは、フレームごとに新しいメモリを割り当てるのに時間を費やしたくありません。特に大きなブロックのメモリ割り当ては、非常にコストがかかります。

于 2015-11-04T15:07:27.133 に答える