AudioConverterConvertBuffer проблема с ошибкой insz - PullRequest
0 голосов
/ 10 января 2011

У меня проблема с этой функцией 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 есть ... поэтому она не может быть преобразована. Буду признателен за любой вклад

Заранее спасибо

1 Ответ

2 голосов
/ 08 июля 2011

Во-первых, вы не можете использовать AudioConverterConvertBuffer() для преобразования чего-либо, где размер входного и выходного байтов различен. Вам нужно использовать AudioConverterFillComplexBuffer(). Это включает в себя выполнение любых преобразований частоты дискретизации или добавление / удаление каналов.

См. Документация Apple по AudioConverterConvertBuffer(). Это также обсуждалось в списках рассылки Apple CoreAudio, но, боюсь, я не могу сейчас найти ссылку.

Во-вторых, даже если это можно сделать (чего не может), вы передаете то же количество байтов, выделенных для вывода, что и для ввода, несмотря на то, что фактически требуется половина количества байтов (из-за уменьшения количества каналы от 2 до 1).

На самом деле я сейчас работаю над использованием AudioConverterConvertBuffer(), и тестовые файлы монофонические, а мне нужно играть в стерео. В настоящее время я застрял с конвертером, выполняющим преобразование только первой порции данных. Если мне удастся заставить это работать, я постараюсь не забыть опубликовать код. Если я не публикую это, пожалуйста, напишите мне в комментариях.

...