AVAudioPlayer инициализируется нормально, но отказывается играть - PullRequest
0 голосов
/ 06 декабря 2011

У меня любопытная проблема с классом AVAudioPlayer. Я создаю проигрыватель, получаю не-нулевую ссылку от инициализатора, но сообщение -play возвращает NO, и игрок не играет. Я реализовал методы делегата проигрывателя и -audioPlayerDecodeErrorDidOccur:error: не вызывается. Ошибка от инициализатора не установлена.

Я проверил обычных подозреваемых. Я устанавливаю категорию аудио сеанса, я также активирую ее. Аудиофайл для проигрывателя записывается приложением непосредственно перед воспроизведением. Когда я инициализирую плеер другим звуком (из комплекта приложения), он воспроизводится. Когда я копирую записанный файл в комплект приложения, а затем инициализирую проигрыватель с этой копией, он воспроизводится. Когда я проверяю наличие файла перед его загрузкой, файл находится там, доступен для чтения и имеет ненулевой размер.

Я пробовал симулятор и устройство, без разницы.

Чего мне не хватает?

1 Ответ

0 голосов
/ 07 декабря 2011

Помогло подождать 1/10 секунды между окончанием записи и воспроизведением:

dispatch_time_t moment = dispatch_time(DISPATCH_TIME_NOW, 1e8);
dispatch_after(moment, dispatch_get_main_queue(), ^{
    [statusLabel setText:@"Playing"];
    [self setPlayer:[[AVAudioPlayer alloc]
        initWithContentsOfURL:[self recordingURL]
        error:NULL]];
    [player play];
});

Это, конечно, не правильное решение, поэтому после небольшого поиска я понял, что не правильно завершил запись, оставив файловые буферы незапятнанными до создания проигрывателя. Теперь, когда я очищаю буферы перед вызовом игрока, все работает нормально.

...