1

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

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

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

4

1 回答 1

1

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

同步复制输出的下一个样本缓冲区。

并记录在无法读取更多样本时copyNextSampleBuffer返回将设置为https://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebufferNULLEOF statusAVAssetReaderStatusCompleted

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

于 2020-12-05T09:09:25.477 回答