mciSendString 播放视频具体实现
[編輯] [转简体] (简体译文)概要
播放视频
正文
转载自https://www.write-bug.com/article/1571.html
背景
mciSendString 函数是一个功能强大的函数,它有自己的mci命令,通过传入mci命令从而控制多媒体设备的操作。之前使用过 mciSendString 函数播放视频,但是,那个程序并没有做得很完善,没有指定在哪个窗口上播放显示,也没有设置播放视频的宽高大小。
后来,无意中在网上看到别人写的一些总结,感觉写得很详细,一下子就学会了指定播放窗口以及播放画面大小的设置。
现在,我把实现原理以及实现过程,写成文档分享给大家。
函数介绍
mciSendString 函数
mciSendString函数向MCI设备发送命令字符串。 在命令字符串中指定发送命令的设备。mciSendString是用来播放多媒体文件的API指令,可以播放MPEG、AVI、WAV、MP3等
函数声明
MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);参数
lpszCommand
指向指定MCI命令字符串的以NULL结尾的字符串的指针。 有关列表,请参阅多媒体命令字符串。lpszReturnString
指向接收返回信息的缓冲区的指针。 如果不需要返回信息,该参数可以为NULL。cchReturn
由lpszReturnString参数指定的返回缓冲区的大小(以字符为单位)。hwndCallback
如果在命令字符串中指定了“notify”标志,则处理回调窗口。返回值
如果成功返回零,否则返回错误。
GetDlgItem 函数
获取窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。
函数声明
HWND GetDlgItem( HWN DhDlg, // handle to dialog box int nIDDlgItem // control identifier);参数
hDlg
标识含有控件的对话框。
nlDDlgltem
指定将被检索的控件标识符。
返回值
如果函数调用成功则返回值为给定控件的窗口句柄。如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控件。若想获得更多错误信息,请调用GetLastError函数。
实现原理
mciSendString函数的使用不是很复杂,关键是理解mci的命令。
对于设置视频播放在指定窗口的命令是:
open 视频文件路径 parent 窗口句柄 style 窗口WS_CHILD风格
例如,本文中为:open “test.wmv” alias myvideo parent 123 style 0x40000000。
对于设置视频播放画面的位置及其大小的命令是:
put 视频文件路径 window at 起始坐标X 起始坐标Y 画面宽度 画面高度
例如,本文中为:put myvideo window at 0 0 800 440。注意,put 命令要放在 play 指令之前执行。
编程实现
void PlayVideoInWindow(char *pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight)
{
char szSetWindowsMci[MAX_PATH] = { 0 };
char szSetVideoSizeMci[MAX_PATH] = { 0 };
// 构造mci打开视频命令, 设置视频播放的窗口
::wsprintf(szSetWindowsMci, "open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD);
// 构造mci视频播放位置大小命令, 设置视频播放的窗口
::wsprintf(szSetVideoSizeMci, "put myvideo window at %d %d %d %d", x, y, iWidth, iHeight);
// 打开视频, 指定窗口
::mciSendString(szSetWindowsMci, NULL, 0, NULL);
// 设置视频播放位置及画面大小
::mciSendString(szSetVideoSizeMci, NULL, 0, NULL);
// 播放视频
::mciSendString("play myvideo", NULL, 0, NULL);
}
程序测试
在项目中调用上述封装好的函数进行测试,调用部分代码为:
void CmciSendString_PlayVideo_TestDlg::OnBnClickedAbort(){ // TODO: 在此添加控件通知处理程序代码 int x = 0, y = 0; int iWidth = 800; int iHeight = 440; // 获取控件的句柄 HWND hWnd = ::GetDlgItem(m_hWnd, IDC_STATIC_VIDEO); // 在指定窗口中播放, 并设置画面位置大小 PlayVideoInWindow("test.wmv", hWnd, x, y, iWidth, iHeight);}
测试结果
运行测序,点击“Play Video”,可以看到视频画面成功显示在了静态框空间中,而且视频画面位置起点为 (0, 0),大小也为 800x440,所以,测试成功。
总结
代码不是很多,关键是要熟悉mci命令。这个不需要刻意去背,可以先了解有这个知识点,等到真正需要用到的时候,再去深入检索研究就好。