如何修改VLC-python音频输出设备?指定VB-Cable播放电台流
解决VLC指定虚拟音频设备播放网络流失败的问题
我需要在项目中从网络电台流URL获取音频并播放,要求输出到指定设备“VB-Cable Input (Virtual Audio Cable)”。但当前代码运行后音频仍从默认设备输出,调用audio_output_device_get()返回None。查过相关资料仍未解决,怀疑函数使用方式有误,代码如下:
import vlc import time url = "https://shout25.crossradio.com.br:18156/1" # Create VLC instance, media player and media instance = vlc.Instance() player = instance.media_player_new() media = instance.media_new(url) player.set_media(media) # Get list of output devices def get_device(): mods = player.audio_output_device_enum() if mods: mod = mods while mod: mod = mod.contents # If VB-Cable is found, return it's module and device id if 'CABLE Input (VB-Audio Virtual Cable)' in str(mod.description): device = mod.device module = mod.description return device,module mod = mod.next # Sets the module and device id to VB-Cable device,module = get_device() # Sets VB-Cable as output device player.audio_output_device_set(device,module) # Trying the function @Random Davis stated, but results still the same vlc.libvlc_audio_output_device_set(player, module, device) # It should return VB-Cable as current audio output, but None is returned... print(player.audio_output_device_get()) # Audio plays in default output device, which is incorrect player.play() time.sleep(60)
问题分析与修复方案
你的代码主要有两个核心错误:
- 参数顺序颠倒:
audio_output_device_set的正确参数顺序是「音频输出模块名」在前,「设备ID」在后,你搞反了顺序 - 模块名获取错误:你把设备描述文本
mod.description当成了模块名,实际模块名是mod.module(比如directsound)
另外,枚举设备后未释放资源,可能导致内存泄漏,需要补充释放逻辑。
修正后的代码
import vlc import time url = "https://shout25.crossradio.com.br:18156/1" # 创建VLC实例、媒体播放器和媒体 instance = vlc.Instance() player = instance.media_player_new() media = instance.media_new(url) player.set_media(media) # 获取VB-Cable设备的模块名和设备ID def get_vbcable_device(): devices = player.audio_output_device_enum() if not devices: return None, None try: current = devices while current: current = current.contents # 匹配VB-Cable设备描述 if "CABLE Input (VB-Audio Virtual Cable)" in str(current.description): # 正确获取模块名和设备ID return current.module, current.device current = current.next finally: # 必须释放枚举的设备列表,避免内存泄漏 vlc.libvlc_audio_output_device_list_release(devices) return None, None # 获取设备信息 audio_module, device_id = get_vbcable_device() if audio_module and device_id: # 正确设置输出设备:模块名在前,设备ID在后 player.audio_output_device_set(audio_module, device_id) # 验证设置结果 current_device = player.audio_output_device_get() print(f"当前输出设备: {current_device}") else: print("未找到VB-Cable设备") # 播放音频 player.play() time.sleep(60)
关键说明
- 枚举设备后必须调用
vlc.libvlc_audio_output_device_list_release(devices)释放资源 audio_output_device_set的参数顺序不能错,必须是(模块名, 设备ID)- 如果仍无法枚举设备,可以尝试先调用
player.prepare()初始化播放器后再执行设备枚举操作
内容的提问来源于stack exchange,提问作者Pedro Toriality
相关产品推荐
相关产品推荐

