使用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的AudioObjectGetPropertyDataAPI查询设备占用情况,但isInputOccupied是最简洁直观的实现方式。
内容的提问来源于stack exchange,提问作者Darrell Brogdon
相关产品推荐
相关产品推荐

