You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动