在不进行轮询的情况下使用 AVAssetReader 和 copyNextSampleBuffer

Using AVAssetReader and copyNextSampleBuffer without polling

我正在使用 AVAssetReader 在辅助线程上从文件中读取音频数据。我见过的每个代码示例的核心都是这样的循环:

    while (assetReader.status == AVAssetReaderStatusReading) 
    {    
        // ...
        buffer = [theAssetReaderTrackOutput copyNextSampleBuffer];
        // ...
    }

(或 Swift 等价物)。我的问题是,copyNextSampleBuffer 是在等待来自 AVAsset 的数据时阻塞,还是在数据尚不可用时 return NULL 阻塞?如果是后者,那么我们有一个轮询循环,这是不好的做法,在反复检查 status 的同时燃烧 CPU 个循环。 copyNextSampleBuffer 的文档没有说明它是否在等待时阻塞线程。我也不知道它是否尝试 return 立即使用它可用的任何数据,或者 fails/blocks 除非它有足够的数据用于某个最小大小的缓冲区。

这个案例实际上是有记录的(总是令人惊喜)。 copyNextSampleBuffer 的头文件说

Copies the next sample buffer for the output synchronously.

并且 copyNextSampleBuffer 记录为 return NULL 当在 EOF 上无法读取更多样本时 status 将设置为 AVAssetReaderStatusCompleted https://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebuffer

https://developer.apple.com/documentation/avfoundation/avassetreaderstatus?language=objc