9

私は、マイクからのオーディオの入出力をストリームするコードに従うことに慣れていました。私がやりたいのは、録音用にリアマイクを選択したいということです。kAudioSessionProperty_Mode を kAudioSessionMode_VideoRecording に設定すると機能することを読みましたが、コードでこれを使用する方法がわかりません。このパラメーターを正常に設定するのに役立つ人はいますか?

プロパティを設定するためのこれらの行があります

status = AudioUnitSetProperty(audioUnit,
                              kAudioSessionProperty_Mode,
                              kAudioSessionMode_VideoRecording,
                              kOutputBus,
                              &audioFormat,
                              sizeof(audioFormat));
checkStatus(status);

しかし、それは機能していません。

4

3 に答える 3

6

アップル開発者ライブラリで ここをクリック

具体的な方法を見ることができます

struct AudioChannelLayout {
   AudioChannelLayoutTag     mChannelLayoutTag;
   UInt32                    mChannelBitmap;
   UInt32                    mNumberChannelDescriptions;
   AudioChannelDescription   mChannelDescriptions[1];
};
typedef struct AudioChannelLayout AudioChannelLayout;

セカンダリ マイクを使用するために AudioChannelDescription を 2 に変更できます。

于 2013-06-24T11:30:06.233 に答える
4

あなたのコード:

status = AudioUnitSetProperty(audioUnit,
                              kAudioSessionProperty_Mode,
                              kAudioSessionMode_VideoRecording,
                              kOutputBus,
                              &audioFormat,
                              sizeof(audioFormat));
checkStatus(status);

コードが正しくないため、機能しません。Audio SESSION は Audio UNITS のプロパティではありません。オーディオ セッションは、ハードウェア リソースを使用したアプリの一般的な動作と、他のアプリやシステムの他の部分による同じリソースに対する他の要求とどのように連携するかを記述します。これは、入力および出力ハードウェアを制御できる最高のチャンスですが、iOS フレームワークでは全体的なユーザー エクスペリエンスが最優先事項であるため、完全に制御できるわけではありません。

アプリには単一のオーディオ セッションがあり、初期化、アクティブ化と非アクティブ化、およびプロパティの取得と設定を行うことができます。ios6 以降、これらのプロパティのほとんどは AVFoundation シングルトン AVAudioSession オブジェクトを使用してアドレス指定できますが、フル アクセスを取得するには、引き続き Core Audio 関数構文を使用する必要があります。

AVFoundation を使用してオーディオ セッション モードを「VideoRecording」に設定するには、次のようにします。

    - (void) configureAVAudioSession
    {
       //get your app's audioSession singleton object
        AVAudioSession* session = [AVAudioSession sharedInstance];

        //error handling
        BOOL success;
        NSError* error;

        //set the audioSession category. 
        //Needs to be Record or PlayAndRecord to use VideoRecording  mode:  

        success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
                                 error:&error]

       if (!success)  NSLog(@"AVAudioSession error setting category:%@",error);

        //set the audioSession mode
        succcess = [session setMode:AVAudioSessionModeVideoRecording error:&error];
        if (!success)  NSLog(@"AVAudioSession error setting mode:%@",error);

        //activate the audio session
        success = [session setActive:YES error:&error];
        if (!success) NSLog(@"AVAudioSession error activating: %@",error);
        else NSLog(@"audioSession active");

    }

Core Audio 機能を使用した同じ機能 (ios5 以下)。checkStatus は、コード サンプルのエラー処理関数です。

    - (void) configureAudioSession
    {
        OSStatus status;

        //initialise the audio session
        status = AudioSessionInitialize ( NULL
                                         //runloop
                                         , kCFRunLoopDefaultMode
                                         //runloopmode
                                         , NULL
                                         //MyInterruptionListener
                                         , (__bridge void *)(self)
                                         //user info
                                         );

        //set the audio session category
        UInt32 category = kAudioSessionCategory_PlayAndRecord;
        status = AudioSessionSetProperty ( kAudioSessionProperty_AudioCategory
                                          , sizeof(category)
                                          , &category);
                                                        checkStatus(status);

        //set the audio session mode
        UInt32 mode = kAudioSessionMode_VideoRecording;
        status = AudioSessionSetProperty(kAudioSessionMode_VideoRecording
                                            , sizeof(mode)
                                            , &mode);
        checkStatus(status);

        //activate the audio session
        status = AudioSessionSetActive(true);
        checkStatus(status);


    }

VideoRecording モードを使用するように言われた理由は、リア マイクを直接選択できる唯一のモードだからです。それは、ビデオ カメラに最も近いマイクを選択することです。

「複数の内蔵マイクを搭載したデバイスでは、ビデオ カメラに最も近いマイクが使用されます。」(Apple のAVSession クラスリファレンスより)

これは、マイクを使用するときはビデオ カメラをアクティブにする必要があることを示唆しており、カメラの前面から背面への選択は、システムが適切なマイクを選択するために使用するパラメーターです。リア マイクを使用するビデオのないアプリ (サンプルなど) は、実際にはリア カメラからビデオ入力ストリームを取得していて、何もしていない可能性があります。iPhone 5 にアクセスできないため、これをテストすることはできません。あなたが言及した「Babyscope」アプリには、ios5 と ios4 で実行するためのまったく異なるアプリがあることがわかります。

Kuriakose からの回答は誤解を招くものです。これはオーディオ トラックAudioChannelLayout説明であり、キャプチャに使用されるオーディオ ハードウェアには影響しません。Sangony からの回答は、Apple が私たちがハードウェアを完全に制御することを本当に望んでいないことを示しています。iOS でのオーディオ管理の多くは、ライブ信号を処理する際のユーザーの期待 (アプリ間のオーディオ I/O 動作) とハードウェアの制限の両方に対応するために、直接制御できないようにする試みです。

于 2013-06-28T00:05:22.857 に答える