项目场景
在 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+ |