Как програмно вырезать кусок avi файла(на directshow vс++)
От: vippavlo Украина http://www.baptistm.info
Дата: 07.05.07 23:34
Оценка: 3 (1) +1
Уважаемые программисты, может ктото знает, как на DirectShow(vс++ delphi не знаю) вырезать кусок avi файла, желательно без рекомпресии или может скажите в чем у меня проблема в коде первый фрейм копирует и все или нормально, когда нету потока звука'(((???
Код:

IGraphBuilder *m_pGraph;
    IMediaControl *m_pMediaControl;
    IMediaSeeking *m_pMediaSeeking;
    IBasicVideo   *m_pBasicVideo;

    ICaptureGraphBuilder2 *m_pBuilder;
    IBaseFilter           *m_pMuxFilter;
    IBaseFilter           *m_pSourceFilter;

    HRESULT hr = 0;
      hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
      if( hr != S_OK ) { AfxMessageBox(_T("Error1")); return false; }
      hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraph);
      if( hr != S_OK ) { AfxMessageBox(_T("Error2")); return false; }
    hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
      if( hr != S_OK ) { AfxMessageBox(_T("Error3")); return false; }
    hr = m_pGraph->QueryInterface(IID_IMediaSeeking, (void **)&m_pMediaSeeking);
    if( hr != S_OK ) { AfxMessageBox(_T("Error4")); return false; }
    hr = m_pGraph->QueryInterface(IID_IBasicVideo, (void **)&m_pBasicVideo);
    if( hr != S_OK ) { AfxMessageBox(_T("Error5")); return false; }
    // Helps the building all Graphs
    hr = CoCreateInstance((REFCLSID)CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, (REFIID)IID_ICaptureGraphBuilder2, (void **)&m_pBuilder);
    if( hr != S_OK ) { AfxMessageBox(_T("Error6")); return false; }
    hr = m_pBuilder->SetFiltergraph(m_pGraph);
    if( hr != S_OK ) { AfxMessageBox(_T("Error7")); ASSERT(FALSE); return false; }
    // Add the avimux, and file writer to the graph 
      LPCOLESTR destAvi = _T("c:\\new15.avi");
      hr = m_pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, destAvi, &m_pMuxFilter, NULL);
      if( hr != S_OK ) { AfxMessageBox(_T("Error8")); return false; }
      // Set the AVI Options like interleaving mode etc...
    CComPtr<IConfigAviMux> pConfigAviMux;
    hr = m_pMuxFilter->QueryInterface(IID_IConfigAviMux, (void **)&pConfigAviMux);
      if( hr != S_OK ) { AfxMessageBox(_T("Error9")); return false; }
      hr = pConfigAviMux->SetOutputCompatibilityIndex(FALSE);
      if( hr != S_OK ) { AfxMessageBox(_T("Error10")); return false; }
      // QI for interface Interleaving
    CComPtr<IConfigInterleaving>  pInterleaving;
    hr = m_pMuxFilter->QueryInterface(IID_IConfigInterleaving, reinterpret_cast<PVOID *>(&pInterleaving));
      if( hr != S_OK ) { AfxMessageBox(_T("Error11")); return false; }
      hr = pInterleaving->put_Mode(INTERLEAVE_FULL);
      if( hr != S_OK ) { AfxMessageBox(_T("Error12")); return false; }
      LPCWSTR srcAvi = TEXT("c:\\Сердце лета.avi");
    hr = m_pGraph->RenderFile(srcAvi, NULL);
      if( hr != S_OK ) { AfxMessageBox(_T("Error13")); return false; }
    hr = m_pBuilder->FindInterface(&LOOK_UPSTREAM_ONLY, 0, m_pMuxFilter, IID_IMediaSeeking, (void **)&m_pMediaSeeking);
      if( hr != S_OK ) { AfxMessageBox(_T("Error14")); return false; }
    hr = m_pMediaSeeking->SetTimeFormat(&TIME_FORMAT_FRAME);
      if( hr != S_OK ) { AfxMessageBox(_T("Error15")); return false; }
      REFERENCE_TIME cur, stop;
    hr = m_pMediaSeeking->GetPositions(&cur, &stop);
      cur  = 10;
      stop = 50;
      if( hr != S_OK ) { AfxMessageBox(_T("Error16")); return false; }
    hr = m_pMediaSeeking->SetPositions(&cur, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame);
      if( hr != S_OK ) { AfxMessageBox(_T("Error17")); return false; }
    if( m_pMediaControl->Run() != S_OK ) { AfxMessageBox(_T("Error18")); return false; }
      IMediaEvent   *pEvent;
      hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
      long EvCode = 0;
      // Have we received the EC_COMPLETE event?
      hr = pEvent->WaitForCompletion(INFINITE, &EvCode);
      // Stop the graph
      m_pMediaControl->Stop();


ICQ #469907496
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.