我对此函数AudioConverterConvertBuffer有问题。基本上我想从这种格式转换
_
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked |0 ;
_streamFormat.mBitsPerChannel = 16;
_streamFormat.mChannelsPerFrame = 2;
_streamFormat.mBytesPerPacket = 4;
_streamFormat.mBytesPerFrame = 4;
_streamFormat.mFramesPerPacket = 1;
_streamFormat.mSampleRate = 44100;
_streamFormat.mReserved = 0;
此格式
_streamFormatOutput.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked|0 ;//| kAudioFormatFlagIsNonInterleaved |0;
_streamFormatOutput.mBitsPerChannel = 16;
_streamFormatOutput.mChannelsPerFrame = 1;
_streamFormatOutput.mBytesPerPacket = 2;
_streamFormatOutput.mBytesPerFrame = 2;
_streamFormatOutput.mFramesPerPacket = 1;
_streamFormatOutput.mSampleRate = 44100;
_streamFormatOutput.mReserved = 0;
我想做的是基于输入格式从LPCM缓冲区中提取音频通道(左声道或右声道),使其在输出格式中成为单声道。一些要转换的逻辑代码如下
这是为PCM输出文件设置通道图
SInt32 channelMap[1] = {0};
status = AudioConverterSetProperty(converter, kAudioConverterChannelMap, sizeof(channelMap), channelMap);
这是在while循环中转换缓冲区
AudioBufferList audioBufferList;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
for (int y=0; y<audioBufferList.mNumberBuffers; y++) {
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
//frames = audioBuffer.mData;
NSLog(@"the number of channel for buffer number %d is %d",y,audioBuffer.mNumberChannels);
NSLog(@"The buffer size is %d",audioBuffer.mDataByteSize);
numBytesIO = audioBuffer.mDataByteSize;
convertedBuf = malloc(sizeof(char)*numBytesIO);
status = AudioConverterConvertBuffer(converter, audioBuffer.mDataByteSize, audioBuffer.mData, &numBytesIO, convertedBuf);
char errchar[10];
NSLog(@"status audio converter convert %d",status);
if (status != 0) {
NSLog(@"Fail conversion");
assert(0);
}
NSLog(@"Bytes converted %d",numBytesIO);
status = AudioFileWriteBytes(mRecordFile, YES, countByteBuf, &numBytesIO, convertedBuf);
NSLog(@"status for writebyte %d, bytes written %d",status,numBytesIO);
free(convertedBuf);
if (numBytesIO != audioBuffer.mDataByteSize) {
NSLog(@"Something wrong in writing");
assert(0);
}
countByteBuf = countByteBuf + numBytesIO;
但是insz问题在那里...所以它无法转换。我将不胜感激
提前致谢
最佳答案
首先,您不能使用AudioConverterConvertBuffer()
转换输入和输出字节大小不同的任何内容。您需要使用AudioConverterFillComplexBuffer()
。这包括执行任何类型的采样率转换,或添加/删除通道。
参见Apple's documentation on AudioConverterConvertBuffer()
。在Apple的CoreAudio邮件列表中也对此进行了讨论,但是恐怕我现在找不到引用。
其次,即使可以做到这一点(不能这样做),尽管实际上需要一半的字节数(由于将通道数从2减少),但您传递的分配给输出的字节数与输入的传递的字节数相同。至1)。
我现在实际上正在使用AudioConverterConvertBuffer()
,在我需要播放立体声时,测试文件是单声道的。我目前只能使用转换器仅对数据的第一块进行转换。如果我设法使其正常工作,我会尽力记得发布代码。如果我不张贴它,请在评论中戳我。
关于iphone - AudioConverterConvertBuffer问题与insz错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4641861/