2024年5月1日发(作者:)
wince下用DirectShow播放音频和视频
wince下用DirectShow播放音频和视频
虽然网上关于wince下如何使用DirectShow播放多媒体文件的资料不多,但WinCE毕竟还属于
windows,而桌面系统的DirectShow例子网上信手拈来,并且其中DirectShow的功能方法与之WinCE下差别
不大,又本人实在没有信心比他们的轮子造得更为华丽,所以这篇文章就直接切入正题,不介绍DirectShow
的结构功能,直接来看看怎么用吧.(其实还是自己懒惰的原因大一些,恩,不过这个和本文的主题没多大关
系:-)).
为了方便代码的移植,所以我将DirectShow的操作封装成CMedia类,只要直接调用该类,就可以相
当简便地调用DirectShow来播放多媒体文件了
好,闲话至此,我们以具体代码看看是如何: //获取CMedia的实例
CMedia *m_pMedia = CMedia::GetInstance();
//设置播放的窗口
m_pMedia->SetVideoWindow(hWnd);
//打开媒体文件
m_pMedia->Open(TEXT(""));
//播放
m_pMedia->Play();
...
//播放结束后,调用Close释放资源
m_pMedia->Open();
没错,就是六行代码,就这么简单,可以顺利播放媒体文件.在这里要说一下的是,因为我们播放的
是视频,需要有一个窗口显示,所以需要调用SetVideoWindow()函数来设置播放窗口.这个播放视频的窗口,
可以是普通的窗口,也可以是Picture控件.当然咯,如果是播放音频文件,那么则完全可以无视这个函数.
还有一个最值得注意的地方,当调用Open()成功之后,一定要调用Close()来释放资源,然后才能
打开另一个媒体文件.否则,不释放的资源可能会导致很多莫名其妙的后果哦.
等等,代码似乎还不完美,比如说,我想在文件播放之后再接着播放另外一个文件,那么我如何知道
什么时候文件已经播放完毕了呢?这时候我们就需要请出SetNotifyWindow().
该函数的作用是设置一个接受消息的窗口,当DirectShow有事件变更时,就会发送指定的消息到
指定的窗口,原型如下:
SetNotifyWindow(HWND hWnd, UINT wMsg,long lInstanceData)
hWnd:接收消息的窗口句柄.
wMsg:指定的自定义消息
lInstanceData:消息的参数.
那么,现在以接收一个视频播放结束事件的代码片段为例子: //自定义一个消息
#define WM_GRAPHNOTIFY (WM_USER + 13)
//设置接收消息窗口和消息
m_pMedia->SetVideoWindow(hWnd,WM_GRAPHNOTIFY,NULL);
...
//这个是消息循环函数
LRESULT CMainWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
...{
switch(wMsg)
...{
...
case WM_GRAPHNOTIFY:
...{
LONG evCode,evParam1,evParam2;
//获取此时的DirectShow事件
if(m_pMedia->GetEvent(&evCode,&evParam1,&evParam2) == TRUE)
...{
if(evCode == EC_COMPLETE)
...{
MessageBox(NULL,TEXT("播放完毕"),TEXT(""),MB_OK);
}
}
return 0;
}
}
...
}
好了,知道播放完毕,就这么简单.恩,还很复杂..?呵呵,我觉得已经很简单了.
文章的最后,让我们再来看看CMedia的其它几个有用的函数吧:
发布评论