【问题标题】:What is kAudioSessionProperty_InputSources actually good for?kAudioSessionProperty_InputSources 实际上有什么用?
【发布时间】:2013-07-25 17:19:47
【问题描述】:

我尝试使用以下代码获取 iPhone 上可用音频输入设备的列表:

CFArrayRef arrayRef;
UInt32 size = sizeof(arrayRef);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_InputSources, &size, &arrayRef);
assert(status == noErr);
NSArray *array = (__bridge NSArray *)arrayRef;

调用正常并返回,但结果数组始终为空,无论我连接的是什么硬件。我尝试了两种常用的手机耳机,一种来自 Apple,一种来自三星,还有两种 USB 麦克风(iXY from RodeiM2X from Tascam),但阵列始终保持空白。所以我想知道这个属性实际上会列出什么样的输入源?到底好用吗?

通过在音频路由上使用侦听器回调,我能够验证是否正确检测到所有 4 个设备。我还能够使用每个设备录制音频,因此它们都可以正常工作。我使用的是装有 iOS 6.1.3 (10B329) 的 iPhone 4S。

【问题讨论】:

    标签: iphone ios core-audio


    【解决方案1】:

    您所指的属性仅适用于通过 iPad 相机连接套件 连接的 USB 音频附件中的音频输入源,如 AudioSessionServices 类参考中所述。

    要获得不为零的阵列,您需要使用插入 iPad 相机连接套件的 USB 音频工作站进行测试。

    此链接列出了一些使用 iPad 相机连接套件的硬件。

    Connecting USB audio interfaces using the Apple iPad Camera Connection Kit.

    同样来自类参考

    如果附加附件中没有可用的音频输入源,则该属性的值为空数组。

    因此,从上面链接中的列表(向下滚动到某些兼容设备子标题的列表)中,您会感兴趣的设备会产生 !nil 结果,将是某些设备提供音频输入,例如 Alesis iO4iO2iO2 express

    编辑:Shawn Hershey 提供的答案是关于使用未弃用的 Objective-c 替代方案的优点。但是,您最感兴趣的是 AVAudioSessionPortDescription 类的 portType 属性。 (适用于 iOS 6.0) 两个感兴趣的常量是 - AVAudioSessionPortLineInAVAudioSessionPortUSBAudio。提到的第一个是通过基座连接器进行音频输入,这是您提到的测试麦克风的连接方式。

    在 iOS 7.0 及更高版本中,您可以查询 AVAudioSession 类的 availableInputs 属性。在 iOS 6 中,您只能查询 currentRoute 属性。

    我发现这个技术问答非常有帮助 - AVAudioSession - microphone selection

    【讨论】:

    • 看来你是对的。 “kAudioSessionProperty_InputSources”仅适用于基于 USB 的音频输入。这很不幸,因为没有不推荐的方式通过 Core Foundation / C 函数(不是 Objective-C 特定的)获取 all 音频输入。
    • @MichaelDautermann 谢谢,我同意这很不幸,因为更高级别的替代方案会带来更多开销。
    • @MichaelDautermann 和其他人,你能告诉我有哪些 Objective-C 替代方案可以获得非相机连接套件输入设备吗?是 Shawn Hershey 在回答这个问题时提到的那个吗?
    • 你赢得赏金不是因为我得到了我正在寻找的答案(我认为 Vizllx 是在正确的轨道上),而是因为你很好地解释了情况。对于那些需要使用 AudioClient API 的开发人员,目前似乎没有不推荐使用的方法 (thinking of AudioSessionGetProperty & kAudioSessionProperty_AudioRoute here) 来做需要做的事情。
    【解决方案2】:

    我对 iPhone 上的音频编程非常陌生,因此我无法回答该特定属性有什么用处的问题,但如果您想要音频输入列表,我认为这会起作用:

    NSArray * ais = [[AVAudioSession sharedInstance] availableInputs];
    

    这提供了一个 AVAudioSessionPortDescription 对象数组。

    for (id object in ais) {
        AVAudioSessionPortDescription * pd = (AVAudioSessionPortDescription*)object;
        NSLog(@"%@",pd.portName);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 2021-05-12
      • 2011-08-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多