1

私は昨日これに苦労しており、本当に助けていただければ幸いです.

マルチチャンネル ミキサー オーディオ ユニットがあり、各チャンネルに割り当てられたコールバックは、呼び出されたときに必要なオーディオ バッファを満たします。データをファイルに書き込んで、同じコールバック内で記録しようとしています。

現時点では、AudioUnitRender を呼び出さないとオーディオがノイズとして記録され、呼び出すと 2 つのエラーが発生します。エラー 10877 およびエラー 50。

コールバックの記録コードは次のようになります

if (recordingOn) 
{
    AudioBufferList *bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));

    SInt16 samples[inNumberFrames]; 
    memset (&samples, 0, sizeof (samples));

    bufferList->mNumberBuffers = 1;
    bufferList->mBuffers[0].mData = samples;
    bufferList->mBuffers[0].mNumberChannels = 2;
    bufferList->mBuffers[0].mDataByteSize = inNumberFrames*sizeof(SInt16);

    OSStatus status;
    status = AudioUnitRender(audioObject.mixerUnit,     
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             bufferList);

    if (noErr != status) {
        printf("AudioUnitRender error: %ld", status); 
        return noErr;
    }

    ExtAudioFileWriteAsync(audioObject.recordingFile, inNumberFrames, bufferList);
}

各チャネルのコールバックにデータを書き込むのは正しいですか、それともリモート I/O ユニットに接続する必要がありますか?

LPCM を使用しており、録音ファイル (caf) の ASBD は

recordingFormat.mFormatID = kAudioFormatLinearPCM;
recordingFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsPacked;
recordingFormat.mSampleRate = 44100;
recordingFormat.mChannelsPerFrame = 2;
recordingFormat.mFramesPerPacket = 1;
recordingFormat.mBytesPerPacket = recordingFormat.mChannelsPerFrame * sizeof (SInt16);
recordingFormat.mBytesPerFrame = recordingFormat.mChannelsPerFrame * sizeof (SInt16);
recordingFormat.mBitsPerChannel = 16;

何が間違っているのかよくわかりません。

ステレオは、ファイルに書き込む前に記録されたデータを処理する方法にどのように影響しますか?

4

2 に答える 2

2

問題がいくつかあります。最終的な「ミックス」を録音しようとしている場合は、AudioUnitAddRenderNotify(iounit,callback,file) を使用して I/O ユニットにコールバックを追加できます。その後、コールバックは単に ioData を受け取り、それを ExtAudioFileWriteAsync(...) に渡します。したがって、バッファも作成する必要はありません。補足: レンダー スレッドでメモリを割り当てるのは良くありません。レンダー コールバックでは、すべてのシステム コールを避ける必要があります。これらの呼び出しが、オーディオ スレッドの非常に厳しい期限内に実行されるという保証はありません。したがって、ExtAudioFileWriteAsync が存在する理由は、これを考慮して、別のスレッドでディスクに書き込むためです。

于 2012-07-18T12:26:35.027 に答える