あなたのコード:
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 動作) とハードウェアの制限の両方に対応するために、直接制御できないようにする試みです。