我一直在这个昨天挣扎,真的很感激帮助。音频单元录制噪音
我有一个多通道混音器音频单元,分配给每个通道的回调函数在调用时填充所需的音频缓冲区。我试图通过将数据写入文件来在相同的回调中进行记录。
此刻音频记录为噪音,如果我不打电话给AudioUnitRender,如果我确实打电话给我,我会得到两个错误。错误10877和错误50.
回调的记录代码看起来像这样
if (recordingOn)
{
AudioBufferList *bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));
SInt16 samples[inNumberFrames];
memset (&samples, 0, sizeof (samples));
bufferList->mNumberBuffers = 1;
bufferList->mBuffers[0].mData = samples;
bufferList->mBuffers[0].mNumberChannels = 2;
bufferList->mBuffers[0].mDataByteSize = inNumberFrames*sizeof(SInt16);
OSStatus status;
status = AudioUnitRender(audioObject.mixerUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
bufferList);
if (noErr != status) {
printf("AudioUnitRender error: %ld", status);
return noErr;
}
ExtAudioFileWriteAsync(audioObject.recordingFile, inNumberFrames, bufferList);
}
是不是正确的在每个通道的回调将数据写入或者我应该把它连接到远程I/O单元?
我使用LPCM和ASBD的记录文件(CAF)是
recordingFormat.mFormatID = kAudioFormatLinearPCM;
recordingFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsPacked;
recordingFormat.mSampleRate = 44100;
recordingFormat.mChannelsPerFrame = 2;
recordingFormat.mFramesPerPacket = 1;
recordingFormat.mBytesPerPacket = recordingFormat.mChannelsPerFrame * sizeof (SInt16);
recordingFormat.mBytesPerFrame = recordingFormat.mChannelsPerFrame * sizeof (SInt16);
recordingFormat.mBitsPerChannel = 16;
我真的不知道我在做什么错。
在写入文件之前,立体声如何影响记录数据的处理方式?
我真的很感激帮助。这些音频问题的意见越来越少。好吧,我会补充一点,看看它是如何发展的。所以在这个添加的录音回调中,我可以将&ioData传递给writeAsync调用?关于回调中的分配,是的,它真的很糟糕,我的头目前一团糟,需要一步一步分解。我也在回调中做这个[[NSNotificationCenter defaultCenter] postNotificationName:MixerAudioObjectSampleFinishedPlayingNotification object:nil];以便通过kMultiChannelMixerParam_Enable将完成的通道设置为无声。这是不好的权利? – jarryd 2012-07-18 12:39:06
是的,那很糟糕。常用的方法是在主线程中进行轮询并收听/观看数据。并且该数据应该是一个c结构或C++对象。是的,ioData在缓冲区列表中具有渲染的音频。 – 2012-07-19 23:15:53