当前位置: 代码迷 >> 多媒体/流媒体开发 >> Directshow转码失败,该如何处理
  详细解决方案

Directshow转码失败,该如何处理

热度:3809   发布时间:2013-02-26 00:00:00.0
Directshow转码失败
请求各位仁兄帮忙:
    我的目的是把海康威视固有的视频格式,用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;
  相关解决方案