通过Python为不同应用程序单独配置音频输出设备
直播音频设备分路与恢复的实现方案
Python脚本方案(自定义控制)
如果想用Python实现精准控制,推荐使用pycaw库——它封装了Windows Core Audio API,能直接操控单个应用的音频输出设备。
步骤1:安装依赖
pip install pycaw
核心实现代码
以下代码包含直播模式切换和设备恢复的完整逻辑,记得替换成你实际的设备名称和进程名:
from pycaw.pycaw import AudioUtilities # 根据设备名称获取音频输出设备对象 def get_device_by_name(target_name): for device in AudioUtilities.GetAllDevices(): if device.FriendlyName.strip() == target_name: return device return None # 根据进程名获取对应的音频会话 def get_session_by_process_name(proc_name): for session in AudioUtilities.GetAllSessions(): if session.Process and session.Process.name() == proc_name: return session return None # 给指定音频会话设置输出设备 def set_session_output_device(session, target_device): if not session or not target_device: return try: audio_manager = session._ctl.QueryInterface(AudioUtilities.IAudioSessionManager2) audio_client = audio_manager.GetAudioClient() audio_client.SetDefaultEndpoint(target_device.id, 0) except Exception as e: print(f"设置设备失败: {e}") # 保存所有活跃音频会话的原始设备(用于恢复) original_device_map = {} def backup_current_devices(): global original_device_map original_device_map.clear() for session in AudioUtilities.GetAllSessions(): if session.Process: proc_name = session.Process.name() try: audio_manager = session._ctl.QueryInterface(AudioUtilities.IAudioSessionManager2) audio_client = audio_manager.GetAudioClient() original_endpoint = audio_client.GetDefaultEndpoint(0) original_device_map[proc_name] = original_endpoint.id except: continue # 恢复所有会话到原始设备,未备份的会话使用默认设备 def restore_default_devices(default_device_name): default_device = get_device_by_name(default_device_name) if not default_device: print("未找到默认设备") return for session in AudioUtilities.GetAllSessions(): if session.Process: proc_name = session.Process.name() target_device_id = original_device_map.get(proc_name, default_device.id) # 匹配目标设备 target_device = None for device in AudioUtilities.GetAllDevices(): if device.id == target_device_id: target_device = device break if target_device: set_session_output_device(session, target_device) # 同时恢复系统全局默认输出 AudioUtilities.GetSpeakers().SetDefaultEndpoint(default_device.id, 0) # 切换到直播模式 def switch_to_live_mode(cable_a, cable_b, cable_c): backup_current_devices() # 设置Spotify到Cable A spotify_session = get_session_by_process_name("Spotify.exe") set_session_output_device(spotify_session, get_device_by_name(cable_a)) # 设置游戏到Cable B(替换为你的游戏进程名,比如"GTA5.exe") game_session = get_session_by_process_name("Game.exe") set_session_output_device(game_session, get_device_by_name(cable_b)) # 设置系统全局输出到Cable C cable_c_dev = get_device_by_name(cable_c) if cable_c_dev: AudioUtilities.GetSpeakers().SetDefaultEndpoint(cable_c_dev.id, 0) # 使用示例(取消注释即可运行) if __name__ == "__main__": # 替换为你实际的设备名称 LIVE_CABLE_A = "Cable A" LIVE_CABLE_B = "Cable B" LIVE_CABLE_C = "Cable C" DEFAULT_AUDIO_DEVICE = "你的常规耳机/音箱名称" # 启动直播模式 # switch_to_live_mode(LIVE_CABLE_A, LIVE_CABLE_B, LIVE_CABLE_C) # 恢复默认设备 # restore_default_devices(DEFAULT_AUDIO_DEVICE)
注意事项
- 必须以管理员权限运行脚本,否则无法修改系统音频设置
- 进程名称要准确,可通过任务管理器查看目标应用的
.exe文件名 pycaw仅支持Windows系统,依赖Windows Core Audio API
现成工具方案(无需编码)
如果不想写代码,以下工具可以快速实现需求:
- Voicemeeter Potato/Standard:专业直播音频路由工具,支持将不同应用的音频分配到不同虚拟设备,可保存预设,一键切换直播/默认模式,还支持音频混合、降噪等功能
- Audio Router:轻量工具,支持通过命令行切换单个应用的音频输出,可编写批处理脚本实现一键切换,比如:
:: 直播模式切换 AudioRouter.exe set-process "Spotify.exe" "Cable A" AudioRouter.exe set-process "Game.exe" "Cable B" AudioRouter.exe set-default "Cable C" :: 恢复默认 AudioRouter.exe set-process "Spotify.exe" "常规设备名称" AudioRouter.exe set-process "Game.exe" "常规设备名称" AudioRouter.exe set-default "常规设备名称"
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

