您的代码:
status = AudioUnitSetProperty(audioUnit,
kAudioSessionProperty_Mode,
kAudioSessionMode_VideoRecording,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
由于代码不正确,因此无法正常工作等。音频会话不是音频单元的属性。音频会话通过硬件资源描述您应用的一般行为,以及它如何与其他应用和系统其他部分对这些资源的其他需求进行合作。这是控制输入和输出硬件的最佳机会,但并不能完全控制,因为iOS框架将整体用户体验作为最重要的优先事项。
您的应用程序有一个音频会话,您可以初始化,激活和停用以及获取和设置属性。由于ios6大多数这些属性都可以使用AVFoundation单例AVAudioSession对象来解决,但要获得完全访问权限,您仍然需要使用Core Audio函数语法。使用核心音频功能(的iOS5及以下)
- (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");
}
同样的功能:
要设置使用AVFoundation,你会做这样的事情音频会话模式“录像”。 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);
}
你已经被告知使用录像模式的原因是因为它是给你的直接选择后面麦克风任何希望的唯一模式。它所做的是选择离摄像机最近的麦克风。
“在具有多个内置麦克风的设备上,使用最接近摄像机的麦克风。“(从苹果公司的AVSession Class Reference)
这表明,摄像机需要使用麦克风时要活跃,从前到后摄像头的选择是系统用来选择合适的麦克风参数。这可能是因为使用后置麦克风的视频免费应用(如your example)实际上是从后置摄像头获得视频输入流,而没有对其进行任何操作。我无法测试此功能,因为我无法访问iPhone 5.我确实看到你提到的“Babyscope”应用程序有一个完全不同的应用程序,用于在ios5上运行,而不是在ios4上。
Kuriakose的回答有误导性:AudioChannelLayout
是说明的audo音轨,它对捕捉中使用的音频硬件没有影响。 Sangony的回答告诉我们,苹果公司并不希望我们完全控制硬件。它在iOS上的大部分音频管理都是为了让我们远离直接控制,以便在处理现场信号时兼顾用户对于应用程序间音频I/O行为的期望和硬件限制。
你有没有工作的代码? – Abizern
@Abizem我编辑了我的答案。 –
看看这个Apple技术说明:http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony