Захват аудио в файл ExtAudioFileWrite

Я пытаюсь записать необработанные данные буфера в аудиофайл. Нравится:

dstFormat.mSampleRate = 224000; 
dstFormat.mFormatID = kAudioFormatMPEG4AAC;
dstFormat.mChannelsPerFrame = 1;
dstFormat.mBitsPerChannel = 16;
dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame;
dstFormat.mFramesPerPacket = 1;
dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger;      
OSStatus result = ExtAudioFileCreateWithURL((CFURLRef) inURL,
                                            kAudioFileM4AType,
                                            &dstFormat,
                                            0,
                                            kAudioFileFlags_EraseFile,
                                            &audioFileRef)

Я подключился к функции со следующими параметрами: AudioUnit inUnit, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData

Внутри я пытаюсь записать данные в файл, но возникает ошибка неверного параметра -50. результат = ExtAudioFileWrite (audioFileRef, inNumberFrames, ioData);

Если я заменю параметр ioData своим:

 AudioBufferList *bufferList = (AudioBufferList*) malloc(sizeof(AudioBufferList));
    bufferList->mNumberBuffers = 1;// ioData->mNumberBuffers;
    for(UInt32 i=0;i<bufferList->mNumberBuffers;i++)
    {
        bufferList->mBuffers[i].mNumberChannels = 1; 
        bufferList->mBuffers[i].mDataByteSize = ioData->mBuffers[i].mDataByteSize; //ioData->mBuffers[i].mDataByteSize; // (1024*2) * dstFormat.mBytesPerFrame;
        bufferList->mBuffers[i].mData = ioData->mBuffers[i].mData;
    }

.. Я получаю файл размером около 260 МБ за первую секунду. Что здесь не так?


person Dimitar Marinov    schedule 13.04.2012    source источник


Ответы (2)


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

Если вы захватываете необработанные данные, то зачем устанавливать идентификатор формата m4a, а затем устанавливать флаги формата для использования линейного PCM? Я также не уверен, как вы пришли к частоте дискретизации 224 кГц, но это доставит вам неприятности и, по крайней мере, частично объясняет, почему размер выходного файла такой большой.

Я бы посоветовал немного погуглить, чтобы увидеть несколько примеров структуры описания потока, поскольку это немного сложно. Этот вопрос также может помочь вам встать на правильный путь:

CoreAudio - kAudioFileUnsupportedDataFormatError

person Nik Reiman    schedule 13.04.2012
comment
спасибо мужик, я уже исправил проблему, но ты дал мне хороший ответ - person Dimitar Marinov; 13.04.2012
comment
Рад слышать, что у вас это работает. В чем именно была проблема? Вы должны опубликовать рабочий код. :) - person Nik Reiman; 13.04.2012
comment
stackoverflow.com/questions/3815231 / этот пост мне очень помог - person Dimitar Marinov; 14.04.2012

Только пару дней назад разобрался, как писать в формат AAC. Подробности + код здесь: Запись в AAC из RemoteIO: данные записываются, но файл не воспроизводится

Я тестировал это только на iOS 5 в iPad Simulator + iPad 2. Производительность отличная, и я очень уважаю возможности Core Audio, но, черт возьми ... Apple могла бы задокументировать это немного больше.

person spring    schedule 13.04.2012