我习惯跟随code流来自麦克风的i / o音频流。我想要做的是选择后置麦克风进行录制。我已经读过将kAudioSessionProperty_Mode设置为kAudioSessionMode_VideoRecording可以完成工作,但我不知道如何在我的代码中使用它。任何人都可以帮助我成功设置此参数。
我有这些行来设置属性
status = AudioUnitSetProperty(audioUnit, kAudioSessionProperty_Mode, kAudioSessionMode_VideoRecording, kOutputBus, &audioFormat, sizeof(audioFormat)); checkStatus(status);
但它不起作用。
答案 0 :(得分:6)
在Apple开发人员库click here
中你可以看到一个特定的方法
struct AudioChannelLayout {
AudioChannelLayoutTag mChannelLayoutTag;
UInt32 mChannelBitmap;
UInt32 mNumberChannelDescriptions;
AudioChannelDescription mChannelDescriptions[1];
};
typedef struct AudioChannelLayout AudioChannelLayout;
您可以将AudioChannelDescription更改为2以使用辅助麦克风
答案 1 :(得分:5)
我做了一些搜索和阅读。终于在AVCaptureDevice类参考中结束了。这里的关键命令是NSLog(@"%@", [AVCaptureDevice devices]);
。我用附带的iPhone运行了这个,得到了这个:
"<AVCaptureFigVideoDevice: 0x1fd43a50 [Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]>",
"<AVCaptureFigVideoDevice: 0x1fd47230 [Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1]>",
"<AVCaptureFigAudioDevice: 0x1fd46730 [Microphone][com.apple.avfoundation.avcapturedevice.built-in_audio:0]>"
列表中只显示一个麦克风。所以要回答你的问题,它还不能完成。
答案 2 :(得分:4)
您的代码:
status = AudioUnitSetProperty(audioUnit,
kAudioSessionProperty_Mode,
kAudioSessionMode_VideoRecording,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
由于代码不正确而无法正常工作。 Audio SESSIONS不是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 Class Reference)
这表明使用麦克风时摄像机需要处于活动状态,从前到后选择摄像机是系统用来选择合适麦克风的参数。可能是使用后置麦克风(例如your example)的无视频应用程序实际上是从后置摄像头获取视频输入流而没有对其进行任何操作。我无法测试这个,因为我无法访问iPhone 5.我确实看到你提到的“Babyscope”应用程序有一个完全不同的app在ios5和ios4上运行。
Kuriakose的回答具有误导性:AudioChannelLayout
是音轨的描述,它对捕获中使用的音频硬件没有影响。 Sangony的答案只是告诉我们Apple并不希望我们完全控制硬件。 iOS上的大部分音频管理都试图让我们远离直接控制,以适应用户期望(应用之间的音频i / o行为)和处理实时信号时的硬件限制。