[英]Getting headset mic to work with AVAudioRecorder on iOS
插入麦克风后,我的应用程序将继续从内置麦克风进行录音(我想使用插入的麦克风)。 我在用:
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];
我希望避免队列服务或其他更简单的事情。
经过一些研究(使用Apple文档),我也找不到使用队列的方法...
经过进一步的研究,我完全不知道该怎么做。 在任何Apple文档或任何常量等中都没有提及它。有一个名为“ FiRe”的应用程序可以做到这一点,所以我知道这是可能的。
我意识到这是一个古老的问题,但想必总会有人从中受益。
也许我不是真的了解您的问题。 您是否希望能够使用内置麦克风进行录音,然后在插入耳机时无缝切换为从耳机录音? 还是您只是在努力从耳机录制?
我自己使用此代码调试路由问题。 只需玩弄您的应用程序,插入耳机,然后查看控制台中注销的内容。 您应该确保所连接的耳机导致“ HeadsetInOut”路由更改。 如果仅是“耳机”,它将在耳机中播放声音,但会通过内置麦克风进行录音。
使用AudioQueues从头戴式耳机进行录音,我完全没有问题。
void interruptionListener( void * inClientData,
UInt32 inInterruptionState)
{
if (inInterruptionState == kAudioSessionBeginInterruption) {
// handle interruption
}
else if (inInterruptionState == kAudioSessionEndInterruption) {
// handle interruption
}
}
void propListener( void * inClientData,
AudioSessionPropertyID inID,
UInt32 inDataSize,
const void * inData)
{
FooBar *self = (__bridge FooBar*)inClientData;
if (inID == kAudioSessionProperty_AudioRouteChange) {
CFDictionaryRef routeDictionary = (CFDictionaryRef)inData;
CFNumberRef reason = (CFNumberRef)CFDictionaryGetValue(routeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));
SInt32 reasonVal;
CFNumberGetValue(reason, kCFNumberSInt32Type, &reasonVal);
if (reasonVal != kAudioSessionRouteChangeReason_CategoryChange) {
// Check the old route
CFStringRef oldRoute = (CFStringRef)CFDictionaryGetValue(routeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_OldRoute));
if (oldRoute) {
NSLog(@"Changed audio route from route:");
CFShow(oldRoute);
} else {
NSLog(@"Error getting old audio route.\n");
}
CFStringRef newRoute;
UInt32 size; size = sizeof(CFStringRef);
OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute);
if (error) {
NSLog(@"Error getting new audio route: %ld\n", error);
}
else {
NSLog(@"Changed audio route to:\n");
CFShow(newRoute);
if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), 0) == kCFCompareEqualTo)
{
// you can do some recording, yay.
}
}
if (reasonVal == kAudioSessionRouteChangeReason_OldDeviceUnavailable)
{
NSLog(@"kAudioSessionRouteChangeReason_OldDeviceUnavailable");
}
}
}
}
-(id) init
{
self = [super init];
if (self) {
OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, (__bridge void *)(self));
if (error)
{
NSLog(@"Error initializing audio session: %ld\n", error);
} else {
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, (__bridge void *)(self));
if (error) {
NSLog(@"Error adding audio session property listener (route change): %ld\n", error);
}
UInt32 inputAvailable = 0;
UInt32 size = sizeof(inputAvailable);
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) {
NSLog(@"Error getting input availability: %ld\n", error);
}
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, (__bridge void *)(self));
if (error) {
NSLog(@"Error adding audio session property listener (input availability): %ld\n", error);
}
// Activate the session
error = AudioSessionSetActive(true);
if (error) {
NSLog(@"Failed to activate audio session: %ld\n", error);
}
}
}
return self;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.