繁体   English   中英

使耳机麦克风与iOS上的AVAudioRecorder配合使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM