AVAssetReader читает аудио, затем не работает - PullRequest
2 голосов
/ 25 апреля 2011

Мое приложение читает аудио и воспроизводит его в настройках производителя / потребителя. Поток потребителя запрашивает новые образцы для визуализации на оборудование. Поток производителя считывает аудиоданные с диска в его буфер с помощью 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?

1 Ответ

3 голосов
/ 06 мая 2011

Я получаю ту же ошибку, я разместил этот ответ также в другой теме

- (void)setupAudio {
    [[AVAudioSession sharedInstance] setDelegate:self];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error:&activationError];

    NSLog(@"setupAudio ACTIVATION ERROR IS %@", activationError);
    [[AVAudioSession sharedInstance] setPreferredIOBufferDuration:0.1 error:&activationError];
    NSLog(@"setupAudio BUFFER DURATION ERROR IS %@", activationError);
}
...