如何向 AVAssetReader copyNextSampleBuffer 添加回调?

Posted

技术标签:

【中文标题】如何向 AVAssetReader copyNextSampleBuffer 添加回调?【英文标题】:How to add a callback to AVAssetReader copyNextSampleBuffer? 【发布时间】:2021-05-30 16:24:05 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

-(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

【讨论】:

以上是关于如何向 AVAssetReader copyNextSampleBuffer 添加回调?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AVAssetReader 和 AVAssetWriter 创建 AAC 文件?

AVAssetReader 采样率

如何使用 AVAssetReader 在 iOS 上正确读取解码的 PCM 样本——目前解码不正确

使用 AVAssetReader 绘制波形

AVAssetReader 初始化失败?

使用 AVAssetReader 读取多个轨道