我有以下 Swift 代码:
let devices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInMicrophone, .externalUnknown], mediaType: .audio, position: .unspecified).devices
print("DEVICES: \(devices.count)")
但是,运行时它会在控制台上打印“DEVICES:0”。当我运行此代码时,我正在运行 Zoom,并且我在菜单中看到橙色点,所以我知道麦克风正在使用中。
我错过了什么?
编辑:我正在构建一个可以播放声音的应用程序,但是,如果麦克风很热,我不想播放该声音。例如;如果用户正在进行 Zoom 通话,那么播放声音会分散会议的注意力。所以我在想,如果我可以确定其他应用程序正在使用麦克风(我不关心其用途,也不需要访问麦克风本身),那么我可以暂时禁用播放声音文件。
首先,您必须确保您拥有(或用户接受)访问麦克风的权限。您可以使用 AVAudioSession 类检查和请求麦克风权限,还可以尝试验证您在“常规”>“您的应用程序”部分中授予的权限。 您可以检查麦克风是否确实可供您的应用程序使用的另一件事。有时,某些应用程序(例如您的情况下的 Zoom)可能会专门使用麦克风,从而阻止您的代码访问它。
如果您可以扩展代码,您可以展示如何使用
AVAudioSession class
。您可以使用 requestRecordPermission()
方法来请求权限。
此外,为了验证是否有另一个应用程序正在独占控制麦克风,您可以使用:
func isMicrophoneInUse(by application: String) -> Bool {
let audioSession = AVAudioSession.sharedInstance()
let category = AVAudioSession.Category.record
let options = AVAudioSession.CategoryOptions.duckOthers
do {
try audioSession.setCategory(category, options: options)
let activeMicrophone = audioSession.currentRoute.inputs.first
return activeMicrophone?.owningApplication == application
} catch {
return false
}
}
或者以更复杂的方式,您可以使用
AVAudioSession.routeChangeNotification
通知在音频路由更改时接收更新,这可能表明另一个应用程序已控制麦克风。
希望有帮助
我不确定这是否是您面临的实际问题,但我注意到您正在尝试在
[.builtInMicrophone, .externalUnknown]
中使用 DeviceType
。正如您在 AVCaptureDevice.DeviceType
文档 中看到的那样,它们都已被弃用。您应该使用 [.microphone, .external]
来代替。希望能帮助到你! :)