9

我习惯于跟踪来自麦克风的音频 i/o 流的代码。我想要做的是想要选择后置麦克风进行录音。我已阅读将 kAudioSessionProperty_Mode 设置为 kAudioSessionMode_VideoRecording 可以完成这项工作,但我不确定如何在我的代码中使用它。任何人都可以帮助我成功设置此参数。

我有这些用于设置属性的行

status = AudioUnitSetProperty(audioUnit,
                              kAudioSessionProperty_Mode,
                              kAudioSessionMode_VideoRecording,
                              kOutputBus,
                              &audioFormat,
                              sizeof(audioFormat));
checkStatus(status);

但它不工作。

4

3 回答 3

6

在苹果开发者库中点击这里

你可以看到一个具体的方法

struct AudioChannelLayout {
   AudioChannelLayoutTag     mChannelLayoutTag;
   UInt32                    mChannelBitmap;
   UInt32                    mNumberChannelDescriptions;
   AudioChannelDescription   mChannelDescriptions[1];
};
typedef struct AudioChannelLayout AudioChannelLayout;

您可以将 AudioChannelDescription 更改为 2 以使用辅助麦克风

于 2013-06-24T11:30:06.233 回答
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]>"

只有一个麦克风出现在列表中。因此,要回答您的问题,(还)无法完成。

于 2013-06-21T21:44:51.987 回答
4

你的代码:

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 行为)和硬件限制。

于 2013-06-28T00:05:22.857 回答