Уважаемые программисты, может ктото знает, как на 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();