将音频捕获到文件ExtAudioFileWrite

时间:2012-04-13 08:34:50

标签: iphone objective-c core-audio audiounit audiorecord

我正在尝试将原始缓冲区数据捕获到音频文件中。像这样:

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错误。 result = 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;
    }

..我在第一秒获得大约260MB的文件。这有什么不对?

2 个答案:

答案 0 :(得分:1)

我很惊讶iPhone甚至会创建一个带有这些参数的音频文件,但我怀疑是因为你到目前为止只在模拟器中测试过,而不是在硬件上测试过。无论如何,你的流格式是这里的问题。

如果要捕获原始数据,那么为什么要将格式ID设置为m4a,然后将格式标志设置为使用线性PCM?我也不确定你是如何达到224kHz的采样率,但这会让你遇到麻烦,至少部分地解释了为什么输出文件的大小如此之大。

我建议谷歌搜索一下看一下流描述结构的一些例子,因为它有点复杂。这个问题也可能有助于您走上正轨:

CoreAudio - kAudioFileUnsupportedDataFormatError

答案 1 :(得分:1)

我刚刚想出了几天前如何写AAC格式。详细信息+代码: Recording to AAC from RemoteIO: data is getting written but file unplayable

我只是在iPad模拟器+ iPad 2上测试了这个。性能非常好,我非常尊重Core Audio的功能,但是geez ... Apple可以记录一下。

相关问题