0

一言で言えば:RemoteIOを使用してアプリによって生成されたすべてのオーディオをキャプチャ/操作する方法はありますか?

入力スコープのRemoteIOの出力バスに接続することで、スピーカーにオーディオを送信できるレンダリングコールバックを取得できます。しかし、そのコールバックの入力バッファーには、AVPlayerによってアプリの他の場所で生成されているサウンドが含まれていません。すべてのアプリオーディオを操作することさえ可能ですか?

これが私の設定です:

-(void)setup
{
    OSStatus status = noErr;

    AudioComponentDescription remoteIODesc;
    fillRemoteIODesc(&remoteIODesc);
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &remoteIODesc);

    AudioComponentInstance remoteIO;
    status = AudioComponentInstanceNew(inputComponent, &remoteIO);
    assert(status == noErr);

    AudioStreamBasicDescription desc = {0};
    fillShortMonoASBD(&desc);

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_StreamFormat,
                                  kAudioUnitScope_Input,
                                  0,
                                  &desc,
                                  sizeof(desc));
    assert(status == noErr);

    AURenderCallbackStruct callback;
    callback.inputProc = outputCallback;
    callback.inputProcRefCon = _state;

    status = AudioUnitSetProperty(remoteIO,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0,
                                  &callback,
                                  sizeof(callback));
    assert(status == noErr);

    status = AudioUnitInitialize(remoteIO);
    assert(status == noErr);

    status = AudioOutputUnitStart(remoteIO);
    assert(status == noErr);
}
4

1 に答える 1

2

簡単な答え:いいえ、残念ながらそのようには機能しません。AVFoundationを介して作成しているオーディオに任意の処理を追加することはできません(iOS 6以降)。

RemoteIOユニットの目的を誤解しています。RemoteIOを使用すると、オーディオ入力ハードウェアとオーディオ出力ハードウェアの2つにアクセスできます。のように、RemoteIOを使用してマイクから音声を取得したり、スピーカーに音声を送信したりできます。RemoteIOユニットでは、アプリの他の部分(AVFoundationなど)がハードウェアに送信しているオーディオを取得することはできません。これは、AVFoundationがRemoteIOで使用しているのと同じオーディオ経路を使用していないためです。

必要なレベルでオーディオを操作するには、AVFoundationよりも深く掘り下げる必要があります。オーディオキューサービスは次のレイヤーであり、オーディオキュー処理タップの形式でオーディオにアクセスできます。これはおそらく、オーディオの処理を開始する最も簡単な方法です。ただし、まだあまり多くのドキュメントはありません。おそらく現時点で最高のソースはヘッダーAudioToolbox.framework/AudioQueue.hです。これはiOS6でのみ導入されたものであることに注意してください。

それよりも深いのはAudioUnitsです。これは、RemoteIOユニットが存在する場所です。AUFilePlayerを使用してオーディオファイルからサウンドを生成し、そのオーディオを他のAudio Unitにフィードして処理する(または自分で行う)ことができます。これはAVFoundation(控えめな表現)よりもかなりトリッキーで冗長ですが、RemoteIOユニットをすでにセットアップしている場合は、おそらくそれを処理できます。

于 2012-10-29T17:44:48.707 に答える