Использование AVAssetReader и copyNextSampleBuffer без опроса

Я использую AVAssetReader для чтения аудиоданных из файла во вторичном потоке. В основе каждого примера кода, который я видел, есть такой цикл:

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

(или эквивалент Swift). Мой вопрос: блокируется ли copyNextSampleBuffer при ожидании данных от AVAsset, или он возвращает NULL, если данные еще не доступны? Если последнее, то у нас есть цикл опроса, что является плохой практикой, сжигание циклов ЦП при многократных проверках status. В документации для copyNextSampleBuffer не сказано, блокирует ли он поток во время ожидания. Я также не могу сказать, пытается ли он немедленно вернуться с любыми данными, которые у него есть, или терпит неудачу / блокирует, если у него недостаточно данных для буфера определенного минимального размера.


person Zzyzx    schedule 05.12.2020    source источник
comment
copyNextSampleBuffer блокирует и возвращает NULL в EOF.   -  person Rhythmic Fistman    schedule 05.12.2020
comment
Отлично, спасибо. Это где-нибудь задокументировано?   -  person Zzyzx    schedule 05.12.2020
comment
На самом деле это так! Смотрите мой ответ.   -  person Rhythmic Fistman    schedule 05.12.2020
comment
Спасибо. Надо было подумать посмотреть туда. Я вижу, что файл заголовка также документирует значения status, которые нигде не задокументированы.   -  person Zzyzx    schedule 05.12.2020


Ответы (1)


Этот случай действительно задокументирован (всегда приятный сюрприз). Заголовочный файл для copyNextSampleBuffer говорит

Синхронно копирует следующий буфер выборки для вывода.

И copyNextSampleBuffer задокументирован, чтобы возвращать NULL, когда образцы не могут быть прочитаны на EOF status будет установлено значение AVAssetReaderStatusCompleted https://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebuffer

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

person Rhythmic Fistman    schedule 05.12.2020