1

この関数 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 の問題が存在するため、変換できません。ご意見をいただければ幸いです

前もって感謝します

4

1 に答える 1

3

AudioConverterConvertBuffer()まず、入力バイトサイズと出力バイトサイズが異なるものを変換するために使用することはできません。を使用する必要がありますAudioConverterFillComplexBuffer()。これには、あらゆる種類のサンプルレート変換の実行、またはチャネルの追加/削除が含まれます。

に関するAppleのドキュメントをAudioConverterConvertBuffer()参照してください。これはAppleのCoreAudioメーリングリストでも議論されましたが、今のところリファレンスが見つからないのではないかと思います。

第二に、これができたとしても(それはできません)、実際にはバイト数の半分を必要としますが(チャネル数を2から減らすため)、入力に割り当てられたのと同じバイト数を出力に渡します。 1)に。

私は実際にAudioConverterConvertBuffer()現在使用に取り組んでおり、ステレオを再生する必要がある間、テストファイルはモノラルです。私は現在、データの最初のチャンクのみの変換を実行するコンバーターで立ち往生しています。これをうまく機能させることができたら、コードを投稿することを忘れないようにします。投稿しない場合は、コメントで突いてください。

于 2011-07-08T11:49:18.583 に答える