我有一个avi视频文件,mpg4压缩。
需要播放其中的某一段。
我没什么思路,请大家指点。。

解决方案 »

  1.   

    用GetDuration(Duration);//得到总时间
    通过IMediaSeeking::SetPositions方法设置开始和结束时间
      

  2.   

    IMediaSeeking *pims;
        hr = pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);设置时间格式。
        hr = pims->SetTimeFormat(&TIME_FORMAT_FRAME);申明并初始化开始和结束变量:
        LONGLONG start = 5L;
        LONGLONG stop = 15L;通过IMediaSeeking::SetPositions方法设置开始和结束时间, AM_SEEKING_AbsolutePositioning标志意味着这是一个绝对的位置(不是相对于媒体文件现在的位置)。在这个例子中,媒体文件就在第5帧开始,在15帧结束,持续时间是10帧。具体的时间长度要看视频帧的播放速率了。
        pims->SetPositions(&start, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning);最后释放接口。
        pims->Release();当然你也可以设置别的格式,和别的开始结束的信息。例如5秒到7秒。
        hr = pims->SetTimeFormat(&TIME_FORMAT_FRAME);
        LONGLONG start = 50000000L;
        LONGLONG stop = 70000000L;
      

  3.   

    To:rageliu
       非常感谢!
       我现在在索引表中存储了帧号。播放连续的有用帧。
       再有问题是请指教。
      

  4.   

    //测试用
    HWND      ghApp;
    HINSTANCE ghInst;
    HRESULT   hr;
    LONG      evCode;
    LONG      evParam1;
    LONG      evParam2;
    RECT      grc;
    IGraphBuilder *pigb  = NULL;
    IMediaControl *pimc  = NULL;
    IMediaEventEx *pimex = NULL;
    IVideoWindow  *pivw  = NULL;CString szFile;
    szFile.Format("C:\\2.avi");
    WCHAR wFile[MAX_PATH];
    MultiByteToWideChar( CP_ACP, 0, szFile, -1, wFile, MAX_PATH );
    hr = CoCreateInstance(CLSID_FilterGraph,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_IGraphBuilder,
                              (void **)&pigb);
    pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);
    pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
    pigb->QueryInterface(IID_IVideoWindow, (void **)&pivw);
    hr = pigb->RenderFile(wFile, NULL);
    pimex->SetNotifyWindow((OAHWND)m_AVI.m_hWnd, WM_GRAPHNOTIFY, 0);
    pivw->put_Owner((OAHWND)m_AVI.m_hWnd);
    pivw->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
    ::GetClientRect(m_AVI.m_hWnd, &grc);
    pivw->SetWindowPosition(grc.left, grc.top, grc.right, grc.bottom);IMediaSeeking *pims;
    hr = pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
    hr = pims->SetTimeFormat(&TIME_FORMAT_SAMPLE);
    LONGLONG start = 5L;
    LONGLONG stop = 15L;
    pims->SetPositions(&start, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning);
    hr = pimc->Run();