2016-02-02 4 views
1

Я конвертирую файл MP3 в raw PCM, и мне нужно сохранить его как просто raw PCM. (Обратите внимание, что я использую Java/RoboVM портировать прошивку.)Как сохранить только raw PCM в файл с SDK IOS (Core Audio)?

Я использую пакет CoreAudio, и соответствующая часть моего кода выглядит следующим образом:

// Define the output PCM format. 
AudioStreamBasicDescription outputFormat = new AudioStreamBasicDescription(); 
outputFormat.setFormat(AudioFormat.LinearPCM); 
outputFormat.setFormatFlags(AudioFormatFlags.Canonical); 
outputFormat.setBitsPerChannel(16); 
outputFormat.setChannelsPerFrame(1); 
outputFormat.setFramesPerPacket(1); 
outputFormat.setBytesPerFrame(2); 
outputFormat.setBytesPerPacket(2); 
outputFormat.setSampleRate(22050); 

// ... 

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile); 

Я затем запустить через петлю , чтение из файла MP3 и запись в выходной файл.

После импорта этого необработанного файла в Audacity я заметил, что он всегда имеет всплеск в начале, что указывает на то, что он не является исходным файлом PCM, а вместо него находится внутри оболочки с заголовком (будь то WAV или CAF-заголовки , и т.д).

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


Проблема возникает здесь:

outputFile = ExtAudioFile.create(outputFileURL, AudioFileType.CAF, outputFormat, null, AudioFileFlags.EraseFile); 

Там не много вариантов для AudioFileType, я попытался WAVE и CAF. Идеально было бы PCM или RAW вариант, но нет. Есть ли конкретный AudioFileType, который я должен выбрать, или мне нужно пойти по этому пути?

ответ

0

Рамка extended audio file services не поддерживает «необработанный» формат PCM.

Для приложения, чтобы понять формат PCM он должен знать материал данных, как:

  • Сколько каналов есть
  • перемежаются они или нет
  • Что частота дискретизации
  • Являются ли данные с плавающей запятой или нет?
  • Какова глубина бит
  • и т. Д.

Фактически, на iOS и OS XAudioStreamBasicDescription - это структура, которая сообщает вам, что требуется для интерпретации потока PCM. По этой причине формат «raw PCM» на самом деле не работает, ему нужны хотя бы некоторые метаданные. Наиболее близкие форматы к необработанному PCM: WAV, AIFF и CAF. Если они не служат вашим целям, вам придется создать пользовательский формат файла. Но это не должно быть сложно.


API extended audio file services вполне настраиваемый. После открытия аудиофайла для чтения (ExtAudioFileOpenURL) вы можете установить различные свойства на дескрипторе ExtAudioFileRef.

В вашем случае рассмотрите установку kExtAudioFileProperty_ClientDataFormat.Это свойство управляет форматом данных PCM, считанных из файла. Поскольку ExtAudioFileRead декодирует входной файл, он преобразует данные, которые он отправляет обратно, в указанный вами формат. Существуют некоторые ограничения для этого метода. IIRC, он не поддерживает преобразование частоты дискретизации и тому подобное.

Когда вы читаете правильно декодированные данные, вы можете использовать что-то вроде NSOutputStream, чтобы записать формат «raw PCM» по вашему выбору непосредственно в файл без метаданных вообще.