В чем разница между AudioFileOpenURL и ExtAudioFileOpenURL? - PullRequest
2 голосов
/ 21 июня 2011

Если я использую ExtAudioFile в сочетании с удаленным аудиоустройством, я могу использовать ExtAudioFileSetProperty с kExtAudioFileProperty_ClientDataFormat для преобразования аудиоформатов, считанных с диска, в собственный формат устройства (с каноническими тегами au).

Кажется, когда я использую AudioFileOpenURL и связанные методы, я не могу использовать AudioFileSetProperty с kAudioFilePropertyDataFormat таким же образом.

Почему я не могу преобразовать любой аудиофайл в формат данных клиента через этот немного более высокий уровень API?

Ответы [ 2 ]

4 голосов
/ 21 июня 2011

Сначала вышел AudioFile API, и это нижний уровень из двух. ExtAudioFile, по сути, является оберткой вокруг AudioFile и связанного AudioConverter. Это внутренний AudioConverter ExtAudioFile, который предоставляет функции для преобразования в определенный формат клиента.

0 голосов
/ 06 сентября 2016

Как выяснилось, вы можете установить формат вывода на более старом объекте 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 может быть еще более сложным.

...