你的代码:
status = AudioUnitSetProperty(audioUnit,
kAudioSessionProperty_Mode,
kAudioSessionMode_VideoRecording,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
由于代码不正确,因此无法正常工作。音频会话不是音频单元的属性。Audio Session 描述了您的应用程序在硬件资源方面的一般行为,以及它如何与其他应用程序和系统其他部分对这些相同资源的其他需求进行协作。这是控制输入和输出硬件的最佳机会,但不会让您完全控制,因为 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 行为)和硬件限制。