7

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

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

该调用可以正常工作并返回,但结果数组始终为空,无论我连接的是什么硬件。我尝试了两种常用的手机耳机,一种来自 Apple 的原装耳机,一种来自三星的原装耳机,以及两种 USB 麦克风(RodeiXY 和 Tascam的 iM2X ),但阵列始终为空。所以我想知道这个属性实际上会列出什么样的输入源?它完全可用吗?

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

4

2 回答 2

3

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

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

这是一个链接,列出了一些使用iPad 相机连接套件的硬件。

使用 Apple iPad 相机连接套件连接 USB 音频接口。

也来自类参考

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

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

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

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

我发现这个技术问答非常有帮助 - AVAudioSession - 麦克风选择

于 2014-01-17T09:08:59.017 回答
2

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

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

这提供了一组 AVAudioSessionPortDescription 对象。

for (id object in ais) {
    AVAudioSessionPortDescription * pd = (AVAudioSessionPortDescription*)object;
    NSLog(@"%@",pd.portName);
}
于 2014-01-08T00:44:34.097 回答