AVCaptureDevice.DiscoverySession().devices 未返回任何设备

问题描述 投票:0回答:2

我有以下 Swift 代码:

let devices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInMicrophone, .externalUnknown], mediaType: .audio, position: .unspecified).devices
print("DEVICES: \(devices.count)")

但是,运行时它会在控制台上打印“DEVICES:0”。当我运行此代码时,我正在运行 Zoom,并且我在菜单中看到橙色点,所以我知道麦克风正在使用中。

我错过了什么?

编辑:我正在构建一个可以播放声音的应用程序,但是,如果麦克风很热,我不想播放该声音。例如;如果用户正在进行 Zoom 通话,那么播放声音会分散会议的注意力。所以我在想,如果我可以确定其他应用程序正在使用麦克风(我不关心其用途,也不需要访问麦克风本身),那么我可以暂时禁用播放声音文件。

swift avfoundation swift5 core-audio
2个回答
1
投票

首先,您必须确保您拥有(或用户接受)访问麦克风的权限。您可以使用 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
通知在音频路由更改时接收更新,这可能表明另一个应用程序已控制麦克风。

希望有帮助


0
投票

我不确定这是否是您面临的实际问题,但我注意到您正在尝试在

[.builtInMicrophone, .externalUnknown]
中使用
DeviceType
。正如您在
AVCaptureDevice.DeviceType
文档
中看到的那样,它们都已被弃用。您应该使用
[.microphone, .external]
来代替。希望能帮助到你! :)

© www.soinside.com 2019 - 2024. All rights reserved.