主页C++ Builder 资料C++ Builder 编程技巧多媒体处理使用 LAV 解码器的播放器
C++ Builder 串口控件
C++ Builder 编程技巧
字符串及文字处理
多媒体处理
 • TTS 文字转语音
 • 使用 LAV 解码器的播放器
图片处理
文件处理
界面处理
C++ Builder 操作指南
C++ Builder 参考手册
网友留言/技术支持
使用 LAV 解码器的播放器 - 多媒体处理
 • 源码介绍 - TVictorMediaPlayer, VictorMediaPlayer
 • 源码下载 - C++ Builder 2010 ~ C++ Builder 10 (CX), Win32/Win64
 • LAV 解码器的安装方法/LAV 解码器挂接在程序上的方法

源码介绍

这个程序理论上支持所有 LAV 解码器 (LAVFilters/LAVSplitter) 支持的格式,支持 (不限于) 播放以下后缀的文件:

 • 视频 (*.mkv, *.ts, *.mp4, *.webm, *.avi, *.qt, *.mov, *.mpg, *.mpeg, *.m1v, *.asf, *.wmv)
 • 音频 (*.aac, *.mp3, *.mpa, *.mp2, *.wma, *.wav, *.au, *.aif, *.aiff, *.snd)
 • MIDI (*.mid, *.midi, *.rmi)

兼容 C++ Builder 2010 ~ C++ Builder 10 (CX) 版本

 • Projects 文件夹包含:
   · 2010  C++ Builder 2010 项目文件
   · XE8   C++ Builder XE8 项目文件
   · 10.1  C++ Builder 10.1 项目文件
   · 其他版本的 C++ Builder,比较早期的版本可以使用 2010 项目文件,比较新的可以用 XE8 和 10.1 的项目文件

 • Source 文件夹包含:
   · UnitVmpMain.cpp, UnitVmpMain.dfm, UnitVmpMain.h 主窗口
   · UnitVmpFullScreen.cpp, UnitVmpFullScreen.dfm, UnitVmpFullScreen.h 全屏播放的窗口
   · VictorMediaPlayer.cpp, VictorMediaPlayer.h 播放器的核心代码 TVictorMediaPlayer 类

 • Build 文件夹包含:
   · Win32\vmp.exe 编译生成的 32 位执行文件
   · Win64\vmp.exe 编译生成的 64 位执行文件

TVictorMediaPlayer 类介绍

VictorMediaPlayer.h 是播放器的头文件,即播放器的程序接口部分,这个头文件并没有包含 <dshow.h> 等 DirectX SDK 的头文件,而只是包含了 <vcl.h>,是为了让程序调用的时候,不受这些 SDK 头文件的干扰。如果程序包含了 SDK 的头文件,很多的宏定义会影响 VCL 库里面的某些函数的调用,如果对 SDK 不熟悉,解决这些问题会比较困难。

VictorMediaPlayer.cpp 播放器的核心代码都在这里,这里使用了 DirectShow 挂接 LAV 解码器,播放 LAV 支持的视频和音频文件。
和 DirectX SDK 之间调用的问题都在这个文件里面解决的,不会影响其他 .h 和 .cpp 文件,可以放心把这个文件加入项目。

属性 类型 说明
FileName UnicodeString 媒体文件的文件名,读写。
PlayState TVictorMediaPlayState 当前播放状态,只读。
 • vmpsInit     播放器正在初始化状态
 • vmpsStopped  停止播放状态
 • vmpsPaused   暂停播放状态
 • vmpsRunning  正在播放状态
Active bool 媒体文件打开状态,读写。请用 Play()、Pause()、Stop() 函数控制文件的打开、关闭和播放。
Volume LONG 音量,读写。这个值/100.0 为 dB 值,例如 –10,000 为 –100.0 dB。
音量值的范围:0 为正常音量,也是最大值,–10,000 是最小值,没有声音。
实际播放音量 = 操作系统音量 × 这个音量属性值 (dB)
hWndVideo HWND 指定显示视频的控件或窗口的句柄,读写。改变了这个值,视频会自动更换到这个值对应的控件或窗口进行播放。如果此值为 NULL,视频被隐藏。
hWndPlaying HWND 正在播放视频的控件或窗口的句柄,只读。一般情况等于 hWndVideo,
当 hWndVideo 为 NULL 时会认为不希望显示视频,这个值会自动指定一个隐藏的窗口。
AudioOnly bool 只有声音,没有图像,只读。如果为 true 表示正在播放的是音频文件。
AspectRatio bool 保持视频的长宽比例,默认为 true,读写。
Duration double 媒体文件的长度 (秒),只读
Position double 当前播放的位置 (秒),读写,值在 0 ~ Duration 之间。给这个属性赋值,会调整播放进度。
LavSplitterOK bool 挂接 LAV 解码器成功。true 成功,false 失败。
LavVideoOK bool 挂接 LAV 视频解码成功。true 成功,false 媒体文件不包含视频,是个纯音频文件。
LavAudioOK bool 挂接 LAV 音频解码成功。true 成功,false 媒体文件不包含音频,是个纯视频文件。

方法 函数原型 说明
TVictorMediaPlayer __fastcall TVictorMediaPlayer(); 构造函数
~TVictorMediaPlayer __fastcall ~TVictorMediaPlayer(); 析构函数
Play void Play(void); 播放 FileName 属性指定的媒体文件。
Pause void Pause(void); 暂停播放,可以用 Play() 继续播放。
Stop void Stop(void); 停止播放,可以用 Play() 重新播放。
GetVideoSize void GetVideoSize(long &w, long &h); 获取当前播放的媒体文件的视频的大小,
w 为宽度,h 为高度,单位为像素 (pixels)。
SetVideoPos void SetVideoPos(long x, long y, long w, long h); 把视频播放在 x, y 位置,并且把大小调整为宽 w,高 h,
通常用 AdjVideoSize() 适配到 hWndVideo 属性指定的控件或窗口里面,按比例 (由 AspectRatio 属性指定) 填满窗口,显示在中间位置。
AdjVideoSize void AdjVideoSize(void); 适配到 hWndVideo 属性指定的控件或窗口里面,按比例 (由 AspectRatio 属性指定) 填满窗口,显示在中间位置。

这个类的使用很简单:

TVictorMediaPlayer *vmp;

vmp = new TVictorMediaPlayer; // 创建媒体播放器
vmp->OnStateChanged = VmpStateChanged; // 状态变化的事件
vmp->hWndVideo = PanelVideo->Handle; // 把播放的视频放在 PanelVideo 里面

状态变化的事件:
void __fastcall VmpStateChanged(TVictorMediaPlayer *Sender, TVictorMediaPlayState NewSt, TVictorMediaPlayState OldSt);
NewSt 为新的播放状态,OldSt 为变化之前的状态
 • vmpsInit     播放器正在初始化状态
 • vmpsStopped  停止播放状态
 • vmpsPaused   暂停播放状态
 • vmpsRunning  正在播放状态

vmp->FileName = Edit1->Text; // 媒体文件的文件名
vmp->Play(); // 播放媒体文件
vmp->Pause(); // 暂停播放,用 vmp->Play(); 可以继续播放
vmp->Stop(); 停止播放
vmp->AdjVideoSize(); // 如果显示播放视频的控件,例如 PanelVideo 的大小变化了,需要调用这个函数调整播放的视频

源码下载

文件 字节数 发布时间 下载次数
播放器源码 C++ Builder 2010 ~ C++ Builder 10, Win32 + Win64 1,642,592 2017-05-01 4335
LAV 解码器:LAVFilters 0.69, x86 & x64 9,558,439 2017-05-01 4306

LAV 解码器的安装方法/LAV 解码器挂接在程序上的方法

只要用 regsvr32.exe 注册 LAVFilters 里面的 LAVSplitter.ax, LAVVideo.ax, LAVAudio.ax 这三个文件,就可以挂接到程序上了

regsvr32.exe LAVSplitter.ax
regsvr32.exe LAVVideo.ax
regsvr32.exe LAVAudio.ax

LAVFilters-0.69-x64 文件夹和 LAVFilters-0.69-x86 文件夹里面的文件,分别对应 64 位和 32 位的解码器。
在 64 位的系统里面,可以把 64 位和 32 位的解码器都注册了,这样 64 位程序和 32 位程序都能使用 LAV 解码器了。

◤上一页:TTS 文字转语音

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号