You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AVCaptureDevice.DiscoverySession获取音频设备返回空数组的问题咨询

问题分析与解决方案

你的代码为什么返回0?

  • 缺少麦克风权限:在macOS/iOS平台,任何涉及麦克风设备枚举的操作都需要在Info.plist中配置权限描述——macOS对应Privacy - Microphone Usage Description,iOS对应NSMicrophoneUsageDescription。没有该配置时,系统会阻止应用访问麦克风相关资源,导致无法枚举到设备。
  • 枚举逻辑不匹配需求:AVCaptureDevice.DiscoverySession的作用是枚举当前可用的捕获设备,当麦克风被其他应用独占占用时,该设备会被标记为不可用,因此无法被枚举出来。而且这种方式本身无法直接判断设备是否被占用。

针对需求的正确实现

你的核心需求是检测麦克风是否被其他应用占用,无需直接访问麦克风,推荐使用AVAudioSession的isInputOccupied属性(iOS 14+/macOS 11+),这个属性可以直接返回是否有其他应用正在使用音频输入设备:

import AVFoundation

func isMicrophoneOccupied() -> Bool {
    let audioSession = AVAudioSession.sharedInstance()
    do {
        // 针对播放类应用设置对应会话分类
        try audioSession.setCategory(.playback)
        return audioSession.isInputOccupied
    } catch {
        print("音频会话配置失败: \(error)")
        return false
    }
}

// 使用示例
print("麦克风是否被占用: \(isMicrophoneOccupied())")

补充说明

  • 即使你的应用仅做音频播放,也需要在Info.plist中填写权限描述内容,比如"检测麦克风是否被占用以暂停音频播放,避免干扰会议",否则可能无法正常获取麦克风占用状态。
  • 如果需要兼容更早的系统版本,可以通过AVAudioSession的currentRoute检查输入端口状态,或者使用CoreAudio的AudioObjectGetPropertyData API查询设备占用情况,但isInputOccupied是最简洁直观的实现方式。

内容的提问来源于stack exchange,提问作者Darrell Brogdon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:53:16