关于录制WMV视频时的问题
最近在做个录制WMV格式的音视频的问题,录制完回放的时候,画面不连续,下面是我的源码,肯定有经验的朋友帮帮忙看看哪里出了问题?
// WMVRecorderDlg.cpp : implementation file
BOOL CWMVRecorderDlg::Run()
{
HRESULT hr;
CString s;
IBaseFilter *pWriter = NULL;
IFileSinkFilter2 *pSink = NULL;
IBaseFilter *pAviDest = NULL;
IConfigAviMux *pAviCfg = NULL;
IBaseFilter *pReader = NULL;
IFileSourceFilter *pSink2 = NULL;
// create the graph
hr = CoCreateInstance( CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void**)&(pGraph) );
if( FAILED( hr ) )
{
s.Format( "不能生成FilterGraph,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
AfxMessageBox( s );
return FALSE;
}
// add file writer
hr = AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &pWriter);
if( FAILED( hr ) )
{
s.Format( "不能生成FileWriter,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
pWriter->QueryInterface(IID_IFileSinkFilter2, (void**)&pSink);
if( pSink != NULL )
{
// pSink->SetFileName( MultiByte2WideChar( m_fname ), NULL );
pSink->SetFileName( MultiByte2WideChar(_T("E:\\dest.wmv"))/*录制后的文件*/, NULL );
// pSink->SetFileName( L"mms://192.168.1.2:9000", NULL );
pSink->SetMode( AM_FILE_OVERWRITE );
SAFE_RELEASE( pSink );
}
// add avi mux
hr = AddFilterByClsid(pGraph, L"Avi Mux", CLSID_AviDest, &pAviDest);
if( FAILED( hr ) )
{
s.Format( "不能生成AviDest,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
pAviDest->QueryInterface(IID_IConfigAviMux, (void**)&pAviCfg);
if( pAviCfg != NULL )
{
SAFE_RELEASE( pAviCfg );
}
// connect avi mux to file writer
hr = ConnectTwoFilters( pGraph, pAviDest, pWriter );
if( FAILED( hr ) )
{
s.Format( "连接avi mux到file writer,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = AddFilterByClsid(pGraph, L"Asf Reader1", CLSID_WMAsfReader, &pReader);
if( FAILED( hr ) )
{
s.Format( "不能生成流读取filter,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = pReader->QueryInterface(IID_IFileSourceFilter, (void**)&(pSink2) );
if( FAILED( hr ) )
{
s.Format( "无法设定流,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
//hr = pSink2->Load( MultiByte2WideChar( m_address1 ), NULL );
hr = pSink2->Load(MultiByte2WideChar(_T("E:\\source.wmv"))/*需要录制的源媒体文件*/, NULL );
// hr = pSink2->Load( L"mms://192.168.1.2:9000", NULL );
SAFE_RELEASE( pSink2 );
if( FAILED( hr ) )
{
s.Format( "无法设定流参数,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = RenderOutputPins( pGraph, pReader );
if( FAILED( hr ) )
{
s.Format( "无法连接流,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
//第二个码流
int bUse2 = GetConfigInt("双码流", "是否采用", 0);
if(bUse2)
{
hr = AddFilterByClsid(pGraph, L"Asf Reader2", CLSID_WMAsfReader, &pReader);
if( FAILED( hr ) )
{
s.Format( "不能生成流读取filter,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = pReader->QueryInterface(IID_IFileSourceFilter, (void**)&(pSink2) );
if( FAILED( hr ) )
{
s.Format( "无法设定流,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = pSink2->Load( MultiByte2WideChar( m_address2 ), NULL );
SAFE_RELEASE( pSink2 );
if( FAILED( hr ) )
{
s.Format( "无法设定流参数,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
hr = RenderOutputPins( pGraph, pReader );
if( FAILED( hr ) )
{
s.Format( "无法连接流,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void**)&(pControl) );
if( FAILED( hr ) )
{
s.Format( "不能获得视频控制,错误码:%X,说明:%s\n", hr, ErrMsgLib( hr ) );
ERRMSG0( s );
// AfxMessageBox( s );
return FALSE;
}
pControl->Run();
AfxMessageBox(_T("run return"));
return TRUE;
}