Мое приложение читает аудио и воспроизводит его в настройках производителя / потребителя. Поток потребителя запрашивает новые образцы для визуализации на оборудование. Поток производителя считывает аудиоданные с диска в его буфер с помощью AVAssetReader. Поток производителя работает в цикле, проверяя, нужно ли читать больше образцов. Размер буфера производителя равен 4 секундам аудио.
Когда я инструктирую мое приложение для буферизации звука, сэмплы успешно читаются без ошибок. Когда я запускаю поток моего продюсера, чтобы начать рендеринг аудио, 4-секундный буфер воспроизводится идеально, затем тишина Дальнейшие исследования показывают, что мой считыватель ресурсов не запускается в начале воспроизведения, поэтому никаких отсчетов, которые считываются после начальной буферизации, больше нет:
CMSampleBufferRef ref = [readaudiofile copyNextSampleBuffer];
if (ref == NULL && filereader.status == AVAssetReaderStatusFailed) {
NSLog(@"reader failed: %@", filereader.error);
}
// this produces:
// {NSLocalizedFailureReason=An unknown error occurred (-12785),
// NSUnderlyingError=0x161f60 "The operation couldn’t be completed.
// (OSStatus error -12785.)", NSLocalizedDescription=The operation
// could not be completed}
Код потока моего производителя идентичен примеру функционального кода MusicLibraryRemoteIODemo . Код моего потребительского потока отличается, но я сравнил две строки за строкой в течение пары дней и, похоже, не могу найти заминку. Любая идея, что может быть причиной сбоя чтения AVAssetReader?
В этом посте описаны аналогичные решения, и в нем сделан вывод, что аудиосеанс необходимо правильно настроить (хотя и не сказано, как). Есть ли какая-либо связь между конфигурацией AVAudioSesion и поведением AVAssetReader?