关于wmv 二次编码的问题

blackeye2004 2007-12-28 11:59:03
我现在需要构建一个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都是可以运行的,且输出也正常。陆老师在吗,麻烦帮帮忙看一下。
...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackeye2004 2007-12-31
  • 打赏
  • 举报
回复
已经解决了,谢谢各位关注。
cici2006 2007-12-29
  • 打赏
  • 举报
回复
WaitForCompletion(pGraphBuilder); 这句话.我觉得你应该要根据wav的时间来自已主动去停止.而不是根据这个来停止了.
cici2006 2007-12-29
  • 打赏
  • 举报
回复
我帮你用GRF看了.是可以保存成ASF.可以回放的.
只是不知道什么时候是结束的.
blackeye2004 2007-12-29
  • 打赏
  • 举报
回复
这个没人知道吗
Oversense 2007-12-29
  • 打赏
  • 举报
回复
用 format sdk

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧