1

AudioToolboxフレームワークとLameを使用して、マイクからMP3に生のPCMデータをエンコードしようとしています。そして、すべてが正常に実行されているように見えますが、エンコードされたストリームに存在する「クリック」と「歪み」にこの問題があります。AudioQueueを正しくセットアップし、エンコードされたバッファーを正しいワットで処理するかどうかもわかりません...オーディオ録音をセットアップするためのコード:

    AudioStreamBasicDescription streamFormat;
    memset(&streamFormat, 0, sizeof(AudioStreamBasicDescription));
    streamFormat.mSampleRate = 44100;
    streamFormat.mFormatID = kAudioFormatLinearPCM;
    streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger|kLinearPCMFormatFlagIsPacked;
    streamFormat.mBitsPerChannel = 16;
    streamFormat.mChannelsPerFrame = 1;
    streamFormat.mBytesPerPacket = 2;
    streamFormat.mBytesPerFrame = 2;
    streamFormat.mFramesPerPacket = 1;
    streamFormat.mReserved = 0;        

    AudioQueueNewInput(&streamFormat, InputBufferCallback, (__bridge void*)(self), nil, nil, 0, &mQueue);
    UInt32 bufferByteSize = 44100;
    memset(&mEncodedBuffer, 0, sizeof(mEncodedBuffer)); //mEncoded buffer is 
                                                        //unsigned char [72000]
    AudioQueueBufferRef buffer;
    for (int i=0; i<3; i++) {
         AudioQueueAllocateBuffer(mQueue, bufferByteSize, &buffer);      
         AudioQueueEnqueueBuffer(mQueue, buffer, 0, NULL);
    }
    AudioQueueStart(mQueue, nil);

次に、AudioQueueコールバック関数がlame_encode_bufferを呼び出し、エンコードされたバッファーをファイルに書き込みます。

void InputBufferCallback (void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription* inPacketDesc) {
      memset(&mEncodedBuffer, 0, sizeof(mEncodedBuffer));
      int encodedBytes = lame_encode_buffer(glf, (short*)inBuffer->mAudioData, NULL, inBuffer->mAudioDataByteSize, mEncodedBuffer, 72000);
      //What I don't understand is that if I write the full 'encodedBytes' data,  then there are A LOT of distortions and original sound is seriously broken 
      NSData* data = [NSData dataWithBytes:mEncodedBuffer length:encodedBytes/2]; 
      [mOutputFile writeData:data];
}

その後、AVAudioPlayerでLameエンコードされたデータを含むファイルを再生しようとすると、元のサウンドがはっきりと聞こえますが、クリック音や歪みがあります。

誰かがここで何が悪いのかアドバイスできますか?

4

1 に答える 1

2

あなたのコードは、コールバックが与えられた実際のオーディオ データの量である inNumPackets に注意を払っていないようです。

また、オーディオ コールバック内でエンコーダーの実行などの長い操作を実行すると、十分な速度が得られず、応答要件に違反する可能性があります。長い関数呼び出しは、コールバックの外で行う必要があります。

于 2012-06-04T21:06:04.480 に答える