Mac平台Swift开发:获取音视频运行状态问题求助
如何在macOS Swift应用中检测是否有应用正在使用音频/视频
嘿,我之前开发macOS应用时刚好遇到过一模一样的需求——要快速判断系统里有没有应用在占用音频或视频资源。下面这两个方案亲测有效,都是用系统原生API实现的,不需要第三方库:
一、检测是否有应用在使用音频
我们可以借助Core Audio框架来查询系统中活跃的音频客户端。这个方法能准确获取到当前正在输出或输入音频的应用:
import CoreAudio func isAnyAudioActive() -> Bool { var audioClients: [AudioObjectID] = [] var propertySize = UInt32(MemoryLayout<AudioObjectID>.size * audioClients.count) // 获取活跃的音频客户端数量 let status = AudioObjectGetPropertyDataSize( AudioObjectID(kAudioObjectSystemObject), AudioObjectPropertyAddress( mSelector: kAudioHardwarePropertyRunningAudioObjects, mScope: kAudioObjectPropertyScopeGlobal, mElement: kAudioObjectPropertyElementMaster ), nil, &propertySize ) guard status == noErr else { return false } let clientCount = Int(propertySize) / MemoryLayout<AudioObjectID>.size audioClients = Array(repeating: AudioObjectID(), count: clientCount) // 获取所有活跃客户端ID let getStatus = AudioObjectGetPropertyData( AudioObjectID(kAudioObjectSystemObject), AudioObjectPropertyAddress( mSelector: kAudioHardwarePropertyRunningAudioObjects, mScope: kAudioObjectPropertyScopeGlobal, mElement: kAudioObjectPropertyElementMaster ), nil, &propertySize, &audioClients ) return getStatus == noErr && !audioClients.isEmpty }
调用isAnyAudioActive()就能得到布尔值,true表示当前有应用在使用音频。
二、检测是否有应用在捕获视频
对于视频捕获状态,我们可以用ScreenCaptureKit框架(macOS 12.0+可用)来查询正在共享或捕获屏幕/摄像头的应用:
import ScreenCaptureKit func isAnyVideoCapturing(completion: @escaping (Bool) -> Void) { SCShareableContent.get { content, error in guard let content = content, error == nil else { completion(false) return } // 检查是否有应用正在捕获内容(包括摄像头、屏幕共享) let hasActiveCapture = content.applications.contains { app in app.isScreenCaptureEnabled || app.isCameraCaptureEnabled } completion(hasActiveCapture) } }
注意这个方法是异步的,调用后在completion里获取结果。如果你的系统版本低于macOS 12,也可以用Core Media IO的API,但代码会复杂一些,ScreenCaptureKit是苹果推荐的新方案。
小提示
- 别忘了在项目的
Info.plist里添加对应的权限:如果用ScreenCaptureKit,需要添加NSScreenCaptureUsageDescription;如果涉及音频输入,要加NSMicrophoneUsageDescription。 - 如果你需要实时监听状态变化,Core Audio可以通过
AudioObjectAddPropertyListener注册监听,ScreenCaptureKit可以用SCShareableContentObserver来监听内容变化。
内容的提问来源于stack exchange,提问作者Siva Prasad




