VLC库多实例控制音频非独立的问题

项目场景

在 Windows 下,有一个封装了VLC库接口的类,可拉取 RTSP 流播放,该类的部分代码如下:

cpp 复制代码
// 封装的VLC类
class LibVlcPlayerBase {
   protected:
    virtual int initialize() {
        const char *const argv[] = {
            "--log-verbose=3",
            "--no-plugins-cache",
            "--rtsp-tcp",
        };
        m_pInstance = libvlc_new(sizeof(argv) / sizeof(argv[0]), argv);
        m_pMedia = libvlc_media_new_location(m_pInstance, m_rtspUrl.c_str());
        m_pMediaPlayer = libvlc_media_player_new_from_media(m_pMedia);
    }

    int OpenSound() {
        return libvlc_audio_set_volume(m_pMediaPlayer, 100);
    }

    int CloseSound() {
        return libvlc_audio_set_volume(m_pMediaPlayer, 0);
    }

   protected:
    libvlc_instance_t* m_pInstance = nullptr;
    libvlc_media_player_t* m_pMediaPlayer = nullptr;
    libvlc_media_t* m_pMedia = nullptr;
};

问题描述

如果有两个 LibVlcPlayerBase 实例:

cpp 复制代码
std::shared_ptr<LibVlcPlayerBase> pClient1;
std::shared_ptr<LibVlcPlayerBase> pClient2;

两个实例对象分别初始化完成并通过 rtsp 播放视频流。发现音频的控制并不是独立的,pClient1 调用OpenSound 设置音量为100,发现 pClient2 的音频会被同时设置为100。打开 Windows 音量合成器,发现只有一个"VLC media player(LibVLC 3.0.21)":

这样导致两个实例的音频无法独立控制。


原因分析

在 Windows 下使用 VLC 库时,多个实例共享同一音频会话的问题通常是由于默认音频输出模块未正确隔离实例导致的。


解决方案

修改代码,强制使用 DirectSound 音频模块:

cpp 复制代码
virtual int initialize() {
    const char *const argv[] = {
        "--log-verbose=3",
        "--no-plugins-cache",
        "--rtsp-tcp",
#ifdef _WIN32
        "--aout=directsound",  // 指定音频输出模块为directsound,使每个VLC实例的音频可单独控制
#endif // _WIN32
    };
    m_pInstance = libvlc_new(sizeof(argv) / sizeof(argv[0]), argv);
    m_pMedia = libvlc_media_new_location(m_pInstance, m_rtspUrl.c_str());
    m_pMediaPlayer = libvlc_media_player_new_from_media(m_pMedia);
}

这样一来,打开 Windows 音量合成器,发现原先 "VLC media player(LibVLC 3.0.21)" 已变成了应用程序名:

虽然看起来仍然不是独立的两个条目出来,但是已经能实现两个实例的音频单独控制了。

总结

在 Windows 系统下,是否指定使用 ‌DirectSound‌ 音频模块会导致不同的行为表现,主要与 ‌Windows 音频架构‌和 ‌VLC 的默认行为‌相关。不指定音频模块‌,VLC 会根据系统环境和自身编译配置‌自动选择音频输出模块‌。在较新的 Windows 系统(如 Win10/11)中,默认可能选择 ‌WASAPI‌(Windows Audio Session API),因为它支持更现代的音频架构。

当使用 WASAPI 时,所有通过同一进程创建的 VLC 实例(如 libvlc_instance_t)可能被系统视为‌同一个音频客户端‌,导致在 Windows 音量合成器中仅显示一个条目(如 "VLC media player"),多个实例的音量控制被合并,无法独立调节。

性能与兼容性差异:

特性 WASAPI DirectSound‌
延迟‌ 更低(支持独占模式) 较高(强制共享模式)
音质‌ 支持无损音频(如 24-bit/192kHz) 可能受系统混音器重采样影响
多实例隔离 需额外配置(如不同进程) 可通过虚拟设备名隔离
‌系统兼容性‌ Win Vista+ Win XP+
相关推荐
轶软工作室5 小时前
全自动数据强制备份程序,无视占用直接硬复制各种数据文件、文档、音视频、软件、数据库等的VSS卷拷贝批处理脚本程序,解放双手,一劳永逸
数据库·音视频
wkd_0075 小时前
【音视频 | AAC】AAC解码库faad2介绍、使用步骤、例子代码
音视频·aac·faad·faad2·aac解码·aac解码库
摸鱼 特供版5 小时前
一键无损放大视频,让老旧画面重焕新生!
windows·学习·音视频·软件需求
敢嗣先锋5 小时前
鸿蒙5.0实战案例:基于OpenGL渲染视频画面帧
移动开发·音视频·harmonyos·arkts·opengl·arkui·鸿蒙开发
gma9995 小时前
【音视频】RTP封包H265信息
音视频
tinghai_2168 小时前
vivo手机怎么剪辑视频?从零开始的视频编辑之旅
智能手机·音视频
正在走向自律18 小时前
通义万相2.1:开启视频生成新时代
人工智能·文生图·音视频·ai绘画·文生视频·ai视频·通义万相 2.1
Antonio91519 小时前
【音视频】FFmpeg如何查询命令帮助文档
ffmpeg·音视频
电子科技圈19 小时前
XMOS推出“免开发固件方案”将数字接口音频应用的开发门槛大幅降低
经验分享·科技·嵌入式硬件·音视频·语音识别·实时音视频·视频编解码