源码介绍
这个程序理论上支持所有 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 的大小变化了,需要调用这个函数调整播放的视频
源码下载
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 解码器了。
|