You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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)

问题分析与修复方案

你的代码主要有两个核心错误:

  1. 参数顺序颠倒:audio_output_device_set的正确参数顺序是「音频输出模块名」在前,「设备ID」在后,你搞反了顺序
  2. 模块名获取错误:你把设备描述文本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:11:38