65.9K
CodeProject 正在变化。 阅读更多。
Home

简单媒体播放器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (17投票s)

2005年2月14日

1分钟阅读

viewsIcon

145188

downloadIcon

6521

一个简单的媒体播放器。

Sample Image

引言

该程序播放一些音频/视频文件(.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 在这个项目中的指导和支持值得赞赏。欢迎提出任何建议和代码改进。进一步的增强功能将在不久的将来提供。

© . All rights reserved.