请求各位仁兄帮忙:
我的目的是把海康威视固有的视频格式,用Directshow转码为通用的avi格式,在GraphEdit中通过连接Filter可以把视频转码并且能够播放(附图为GraphEdit的Filter Graph),但是在代码中实现后,生成的avi文件比GraphEdit生成的文件小了一点,而且不能够播放!
以下是我的转码部分代码:
mMediaControl->Stop();
//获得源文件字符串
//CString转换为LPCWSTR !!!
wchar_t *lpszW = new WCHAR[1023];
int nLen = MultiByteToWideChar(CP_ACP, 0, strFileName, -1, NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, strFileName, -1, lpszW, nLen);
IBaseFilter *pSource;
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"Hikvision Source Filter",L"Hikvision Source Filter",&pSource);
if( FAILED( hr ) )
{
MessageBox(NULL,"Could not Get and Add the Source filter", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
//获得IFileSourceFilter接口
IFileSourceFilter *pFileSourceFilter;
hr = pSource->QueryInterface(IID_IFileSourceFilter, (void**)&pFileSourceFilter);
if( FAILED( hr ) )
{
MessageBox(NULL,"Could not get the IFileSourceFilter接口", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
//加载源文件
hr = pFileSourceFilter->Load (lpszW, NULL);
if( FAILED( hr ) )
{
MessageBox(NULL,"Could not load the source file", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
delete[] lpszW;
lpszW = NULL;
//海康解码器
IBaseFilter *pHikvisionDecoder;
hr = AddFilterByName(mGraph,CLSID_LegacyAmFilterCategory,L"Hikvision Decoder Filter",L"Hikvision Decoder Filter",&pHikvisionDecoder);
if (FAILED(hr))
{
MessageBox(NULL,"Could not Get and Add the Hikvision Decoder Filter", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
//连接Source Filter 和 Hikvision Decoder Filter
//获得Source Filter上的Video output Pin
IPin *pVideoOut = NULL;
pVideoOut = GetOutPin(pSource, 0);
if( pVideoOut == NULL )
{
MessageBox(NULL,"Could not get video output pin of Source Filter", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
hr = ConnectFilters(mGraph, pVideoOut, pHikvisionDecoder);
if( FAILED( hr ) )
{
MessageBox(NULL,"Could not connect Source Filter 和 Hikvision Decoder Filter", TEXT("Error!"), MB_OK | MB_TASKMODAL | MB_SETFOREGROUND );
return E_FAIL;
}
//Xvid编码器
IBaseFilter *pXvidMPEG4Codec;