简单媒体播放器






2.71/5 (17投票s)
2005年2月14日
1分钟阅读

145188

6521
一个简单的媒体播放器。
引言
该程序播放一些音频/视频文件(.avi、MPEG、MP3..)。它使用 DirectX 9.0 播放媒体文件。
软件要求
Visual Studio .NET 2003,DirectX SDK 9.0。
将以下库添加到项目中
Project->Properties->Linker->Input->Additional dependences
- \\DXSDK\lib\strmiids.lib
- \\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug\strmbasd.lib
说明
通过点击打开按钮打开文件。或者通过按下播放列表按钮打开播放列表。要添加文件,点击添加菜单并选择添加文件。您可以选择多个文件。从播放列表中选择一个文件,然后点击主窗口上的播放按钮。
类
CWinPlayerDlg
主对话框类。
CVideoWndDlg
用于显示视频的对话框。
CSeekSlider
滑块控件的类。
CPlayList
用于显示要播放的文件的列表框类。
播放媒体文件
要渲染(输出)文件,我们需要实例化各种 DirectX COM 对象
m_objHRsult=m_objGraphBuilder->QueryInterface (IID_IMediaControl, (void**)&m_objMediaControl); m_objHRsult=m_objGraphBuilder->QueryInterface (IID_IMediaEventEx, (void**)&m_objMediaEvent); m_objHRsult=m_objGraphBuilder->QueryInterface (IID_IVideoWindow, (void**)&m_objVideownd); m_objHRsult=m_objGraphBuilder->QueryInterface (IID_IMediaSeeking, (void**)&m_objMediaSeeking); m_objHRsult=m_objGraphBuilder->QueryInterface (IID_IMediaPosition, (void**)&m_objMediaPos); m_objHRsult= m_objGraphBuilder->QueryInterface(__uuidof(IVideoFrameStep), (PVOID *)&m_objVideoFrame);
将所有权窗口的引用传递给显示文件的窗口。
m_objVideownd->put_Owner((OAHWND) m_objVideoDlg.GetSafeHwnd());
运行文件
m_objHRsult=m_objMediaControl->Run();
mfn_PauseClip()
要暂停或播放剪辑,我们检查它是否正在播放。如果是,则
m_objMediaControl->Pause()
暂停媒体控制。
mfn_StepFrameFwd()
要将剪辑向前移动到一定数量的帧,我们执行
l_hResult=m_objVideoFrame->Step(15,NULL);
这将移动 15 帧。
mfn_Close()
关闭文件
l_hResult=m_objMediaControl->Stop();
然后释放所有对象
SAFE_RELEASE(m_objMediaEvent); SAFE_RELEASE(m_objMediaPos); SAFE_RELEASE(m_objMediaControl); SAFE_RELEASE(m_objVideownd); SAFE_RELEASE(m_objGraphBuilder);
更改滑块的位置
获取当前位置
DWORD dwPosition = m_objSeekBar.GetPos();
滚动时暂停
m_objMediaControl->Pause();
设置新位置
REFERENCE_TIME newTime = (l_time/100) * dwPosition;
m_objMediaSeeking->SetPositions(&newTime,
AM_SEEKING_AbsolutePositioning, NULL,
AM_SEEKING_NoPositioning);
OnTimer()
每秒更改滑块控件的位置
if (SUCCEEDED(m_objMediaSeeking->GetCurrentPosition(&timeNow))) { l_PlayTime.Format("%d",timeNow/10000000); //ltoa((timeNow / 1000),l_PlayTime,10); m_objTimePlay.SetWindowText(l_PlayTime); long sliderTick = (long)((timeNow * 100) / l_time); m_objSeekBar.SetPos(sliderTick); }
致谢
代码帮助来自 DirectX SDK 文档。Atin 在这个项目中的指导和支持值得赞赏。欢迎提出任何建议和代码改进。进一步的增强功能将在不久的将来提供。