Apple Developer より
サンプルバッファデリゲートと、コールバックが呼び出されるキューを設定します。
iOS 4.0以降
macOS 10.7以降
Mac Catalyst 13.0以降
AVFoundation
宣言
func setSampleBufferDelegate(_ sampleBufferDelegate: AVCaptureVideoDataOutputSampleBufferDelegate?, queue sampleBufferCallbackQueue: DispatchQueue?)
パラメーター
sampleBufferDelegate
キャプチャ後にサンプルバッファを受信するプロトコル AVCaptureVideoDataOutputSampleBufferDelegate
に準拠したオブジェクト。
sampleBufferCallbackQueue
コールバックが呼び出されるキュー。ビデオフレームが順番に配信されるようにするには、シリアルディスパッチキューを使用する必要があります。
sampleBufferCallbackQueue パラメータは、sampleBufferDelegat
が NULL に設定される場合を除き、NULLに設定してはいけない。
ディスカッション
新しいビデオサンプルバッファーがキャプチャされると、captureOutput(_:didOutput:from:)
により、サンプルバッファーデリゲートに送信されます。すべてのデリゲートメソッドは、指定されたディスパッチキューで呼び出されます。
新しいフレームがキャプチャされたときにキューがブロックされている場合、それらのフレームは、alwaysDiscardsLateVideoFrames
プロパティの値によって決定されたときに自動的にドロップされます。これにより、同じフレームで既存のフレームを処理できるようになります。処理が着信フレームのレートに追いつかない場合、メモリ使用量が増加しますが、それを管理する必要がなくなります。要は、データが捨てられるので、メモリの解放をする必要がなくなるということ。
フレーム処理が常に着信フレームのレートに対応できない場合は、minFrameDuration
プロパティを使用することを検討する必要があります。これにより、通常、フレームドロップのみの場合よりもパフォーマンス特性が向上し、フレームレートの一貫性が向上します。
フレームがドロップされる可能性を最小限に抑える必要がある場合は、受信するサンプルバッファーの外で十分に少ない量の処理が実行されるキューを指定する必要があります。ただし、追加の処理を別のキューに移行する場合は、処理されていないフレームの影響を受けずにメモリ使用量が増加しないようにする必要があります。