关于wmv 二次编码的问题
我现在需要构建一个GRAPH来导出wmv文件,是这样构建的。
HRESULT CreateGraph()
{
CoInitialize(NULL);
IGraphBuilder* pGraphBuilder=NULL;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraphBuilder);
if ( FAILED(hr) )
{
return hr;
}
IPin* pAudioPin = NULL;
IPin* pVideoPin = NULL;
hr = CoCreateInstance(CLSID_WMAsfWriter,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,reinterpret_cast<void**>(&pWriterFilter));
if (FAILED(hr))
{
return hr;
}
hr = pGraphBuilder->AddFilter(pWriterFilter,L"Writer filter");
if ( FAILED(hr) )
{
return hr;
}
DWORD dwReg = 100;
AddToRot(pGraphBuilder,&dwReg);
IConfigAsfWriter2* pConfig = NULL;
hr = pWriterFilter->QueryInterface(IID_IConfigAsfWriter2,(void**)&pConfig);
IWMProfile * pProfile = NULL;
hr = LoadCustomProfile(L"D:\\1.prx",&pProfile);
hr = pConfig->ConfigureFilterUsingProfile(pProfile);
hr = pConfig->SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS,true,0);
IFileSinkFilter2* pFileSink = NULL;
hr = pWriterFilter->QueryInterface(IID_IFileSinkFilter,(void**)&pFileSink);
hr = pFileSink->SetFileName(L"C:\\1.wmv",NULL);
pAudioPin = GetPin(pWriterFilter,PINDIR_INPUT,MEDIATYPE_Audio);
pVideoPin = GetPin(pWriterFilter,PINDIR_INPUT,MEDIATYPE_Video);
IBaseFilter* pSourceFilter = NULL;
hr = pGraphBuilder->AddSourceFilter(L"G:\\我的文档\\照片\\DSC00163.JPG",L"SourceFilter",&pSourceFilter);
if (FAILED(hr))
{
return hr;
}
IBaseFilter* pAudioFilter = NULL;
hr = pGraphBuilder->AddSourceFilter(L"C:\\Documents and Settings\\All Users\\Documents\\My Music\\示例音乐\\New Stories (Highway Blues).wma",L"SourceFilter",&pAudioFilter);
IPin* pSourceVideoPin = NULL;
IPin* pSourceAudioPin = NULL;
pSourceVideoPin = GetPin(pSourceFilter,PINDIR_OUTPUT,MEDIATYPE_Video);
pSourceAudioPin = GetPin(pAudioFilter,PINDIR_OUTPUT,MEDIATYPE_Audio);
hr = pGraphBuilder->Connect(pSourceAudioPin,pAudioPin);
hr = pGraphBuilder->Connect(pSourceVideoPin,pVideoPin);
pGraphBuilder->QueryInterface(IID_IMediaSeeking,(void**)&g_pSeek);
IMediaControl* pControl = NULL;
hr = pGraphBuilder->QueryInterface(IID_IMediaControl,reinterpret_cast<void**>(&pControl));
if ( FAILED(hr) )
{
return hr;
}
hr = pControl->Run();
WaitForCompletion(pGraphBuilder);
pControl->Stop();
LONGLONG lDuration;
hr = g_pSeek->GetDuration(&lDuration);
LONGLONG lCurrent = 0;
g_pSeek->SetPositions(&lCurrent,AM_SEEKING_AbsolutePositioning,&lDuration,AM_SEEKING_AbsolutePositioning);
pControl->Run();
WaitForCompletion(pGraphBuilder);
pControl->Stop();
return hr;
}
这样虽然run成功了,但CPU占用95%以上,且迟迟不返回预处理结束的消息,如果我不设这个AM_CONFIGASFWRITER_PARAM_MULTIPASS的话,是一点问题都没有的。
还有如果源是单单一个媒体文件的话,整个GRAPH都是可以运行的,且输出也正常。陆老师在吗,麻烦帮帮忙看一下。