Iphone 带insz错误的音频转换器转换器缓冲区问题

Iphone 带insz错误的音频转换器转换器缓冲区问题,iphone,audio,formatting,pcm,Iphone,Audio,Formatting,Pcm,这个函数AudioConverterConvertBuffer有问题。基本上我想从这个格式转换 _ streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked |0 ; _streamFormat.mBitsPerChannel = 16; _streamFormat.mChannelsPerFrame = 2; _streamFormat.mByt

这个函数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;
改为这种格式

  _

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;
AudioBufferList AudioBufferList;
CMBlockBufferRef块缓冲区;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampBuffer、NULL和audioBufferList、sizeof(audioBufferList)、NULL、NULL、0和blockBuffer);

对于(int y=0;y首先,您不能使用
AudioConverterConvertBuffer()
转换输入和输出字节大小不同的任何内容。您需要使用
AudioConverterFillComplexBuffer()
。这包括执行任何类型的采样率转换,或添加/删除通道

看,苹果公司的CoreAudio邮件列表中也讨论过这一点,但我恐怕现在找不到参考资料

第二,即使这可以做到(它不能做到),您也在传递分配给输出的字节数与分配给输入的字节数相同,尽管实际上需要一半的字节数(由于通道数从2减少到1)

我实际上正在使用
AudioConverterConvertBuffer()
现在,测试文件是单声道的,而我需要播放立体声。我目前只能用转换器转换第一块数据。如果我能做到这一点,我会尽量记住发布代码。如果我不发布,请在评论中给我点评