Генерация буфера LPCM в памяти для AVAudioPlayer initWithData - PullRequest
6 голосов
/ 28 марта 2010

Я хочу генерировать звуковую волну программно и воспроизводить ее с помощью AVAudioPlayer. У меня есть код для кодирования моего сигнала в виде линейного PCM, 44100 Гц, моно, 8 бит на семпл.

Мне не ясно, какой тип конверта мне нужно обернуть вокруг этого буфера, чтобы AVAudioPlayer распознал его как PCM.

Ответы [ 3 ]

5 голосов
/ 01 апреля 2010

PCM - это просто цифровое представление аналогового аудиосигнала. К сожалению, он не содержит никаких метаданных об аудиоканалах, битовой глубине или частоте дискретизации - все это необходимо для правильного считывания указанных данных PCM. Я бы предположил, что AVAudioPlayer примет эти данные PCM, обернутые в объект NSData, до тех пор, пока вы сможете установить эти переменные вручную в объекте AVAudioPlayer. К сожалению, эти переменные доступны только для чтения, поэтому, несмотря на то, что в документации говорится, что AVAudioPlayer может обрабатывать все, что может обрабатывать Core Audio, он не может обрабатывать необработанные данные LPCM.

Как заявил zoul, я бы предположил, что самый простой способ сделать это - добавить WAV-заголовок, поскольку он информирует AVPlayer о необходимых выше переменных. Его размер составляет 44 байта, его легко смоделировать, и он хорошо определен - я использовал то же самое определение , которое было дано выше, для реализации кодирования и декодирования wav-заголовка. Кроме того, он просто добавляется к вашим неизмененным данным LPCM.

4 голосов
/ 28 марта 2010

Может быть, добавление WAV-заголовка поможет?

0 голосов
/ 17 мая 2019

Я опубликовал пример Swift 5 (в виде GitHub Gist) преобразования буфера сэмплов аудио-плавающего файла в файл WAV для использования с AVAudioPlayer initWithData, здесь: https://gist.github.com/hotpaw2/4eb1ca16c138178113816e78b14dde8b

...