如何向 AVAssetReader copyNextSampleBuffer 添加回调?

问题描述

我正在尝试读取音频帧并使用 AVAssetReader 对其进行解码。我希望能够异步读取帧,并在读取示例缓冲区时添加某种回调。所以在调用之后:

...
[reader startReading];
CMSampleBufferRef sample = [readerOutput copyNextSampleBuffer];

我希望能够从我的回调中引用和处理此示例。那可能吗?如果没有,您能否建议我如何使用来自 AVFoundation/Core Audio 的其他类来做到这一点?

解决方法

-(CMSampleBufferRef)[AVAssetReaderOutput copyNextSampleBuffer] 是同步的,我看不到任何替代方案。

您可以通过执行以下操作为其提供异步接口:

dispatch_async(myDecodingDispatchQueue,^{
  CMSampleBufferRef sampleBuffer;
  while ((sampleBuffer = [readerOutput copyNextSampleBuffer])) {
    dispatch_async(myDispatchQueue,^{
       [myCallbackObject myCallbackWithSampleBuffer:sampleBuffer];
    });
  }
  // examine AVAssetReader.status here to see reason for stopping
}