Как выяснилось, вы можете установить формат вывода на более старом объекте AudioFile. Хитрость (по крайней мере, на Mac, но я уверен, что на iOS будет то же самое) - установить выходной формат AudioUnit, который вы конфигурируете для рендеринга данного аудиофайла, а не объекта файла:
// Set file player AU's output format, it will do format conversion automatically for us
CheckError(AudioUnitSetProperty(_audioFileUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &outputFormat, sizeof(AudioStreamBasicDescription)));
Не забудьте AudioUnitInitialize()
этот аппарат после установки формата вывода и до установки области файла для воспроизведения.
Еще одна вещь: я не думаю, что ExtAudioFile - это вещь более высокого уровня, как говорит @sbooth в другом ответе, на самом деле совсем наоборот. Более старый AudioFile сложнее в использовании, но, в конце концов, он может визуализировать себя и позаботиться о проблемах с многопоточностью, тогда как ExtAudioFile - это просто средство ввода-вывода, которое не может выполнить само рендеринг. Как правило, файловый ввод / вывод не может быть выполнен в аудиопотоке, поэтому ExtAudioFileRead()
должен кэшировать области файла, возможно, с несколькими областями предварительного просмотра, чтобы обеспечить непрерывное воспроизведение, и каким-то образом передавать их потоку рендеринга в потокобезопасный способ. Как вы можете видеть, построение рендера вокруг ExtAudioFile может быть еще более сложным.