Warning: file_get_contents(https://whois.pconline.com.cn/jsLabel.jsp?ip=127.0.0.1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in D:\wwwroot\huidong\wwwroot\function.inc.php on line 884
mciSendString播放视频具体实现 - huidong

huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


转载自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 指令之前执行。

编程实现

  1. void PlayVideoInWindow(char *pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight)

  2. {

  3.    char szSetWindowsMci[MAX_PATH] = { 0 };

  4.    char szSetVideoSizeMci[MAX_PATH] = { 0 };


  5.    // 构造mci打开视频命令, 设置视频播放的窗口

  6.    ::wsprintf(szSetWindowsMci, "open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD);


  7.    // 构造mci视频播放位置大小命令, 设置视频播放的窗口

  8.    ::wsprintf(szSetVideoSizeMci, "put myvideo window at %d %d %d %d", x, y, iWidth, iHeight);


  9.    // 打开视频, 指定窗口

  10.    ::mciSendString(szSetWindowsMci, NULL, 0, NULL);


  11.    // 设置视频播放位置及画面大小

  12.    ::mciSendString(szSetVideoSizeMci, NULL, 0, NULL);


  13.    // 播放视频

  14.    ::mciSendString("play myvideo", NULL, 0, NULL);

  15. }

程序测试

在项目中调用上述封装好的函数进行测试,调用部分代码为:

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,所以,测试成功。

1606486663620690.jpg


总结

代码不是很多,关键是要熟悉mci命令。这个不需要刻意去背,可以先了解有这个知识点,等到真正需要用到的时候,再去深入检索研究就好。




返回首页


Copyright (C) 2018-2024 huidong