📄 subject_32347.htm
字号:
<p>
序号:32347 发表者:jacky 发表日期:2003-03-11 17:12:23
<br>主题:用directshow 用*.MPG 转*.AVI(MPEG4)原代码!请帮看看!谢谢!
<br>内容://////此例子是根据Direct8.0中的directshow中的代码来的!<BR>#include <dshow.h><BR>#include <stdio.h><BR>#include <Mtype.h><BR><BR>////指定了所有的库了<BR>#pragma comment(lib,"amstrmid.lib")<BR>#pragma comment(lib,"d3d8.lib")<BR>#pragma comment(lib,"d3dx.lib")<BR>#pragma comment(lib,"d3dx8.lib")<BR>#pragma comment(lib,"d3dx8d.lib")<BR><BR><BR>#pragma comment(lib,"d3dx8dt.lib")<BR>#pragma comment(lib,"d3dxd.lib")<BR>#pragma comment(lib,"d3dxof.lib")<BR>#pragma comment(lib,"ddraw.lib")<BR>#pragma comment(lib,"dinput.lib")<BR><BR>#pragma comment(lib,"dinput8.lib")<BR>#pragma comment(lib,"dmoguids.lib")<BR>#pragma comment(lib,"dplayx.lib")<BR>#pragma comment(lib,"dpnaddr.lib")<BR>#pragma comment(lib,"dpnlobby.lib")<BR><BR>#pragma comment(lib,"dpvoice.lib")<BR>#pragma comment(lib,"dsetup.lib")<BR>#pragma comment(lib,"dsound.lib")<BR>#pragma comment(lib,"dxerr8.lib")<BR>#pragma comment(lib,"dxguid.lib")<BR><BR>#pragma comment(lib,"dxtrans.lib")<BR>#pragma comment(lib,"ksproxy.lib")<BR>#pragma comment(lib,"ksuser.lib")<BR>#pragma comment(lib,"dpnlobby.lib")<BR>#pragma comment(lib,"msdmo.lib")<BR><BR>#pragma comment(lib,"qedit.lib")<BR>#pragma comment(lib,"quartz.lib")<BR>#pragma comment(lib,"strmiids.lib")<BR><BR><BR><BR><BR><BR><BR><BR>void __cdecl main()<BR>{<BR> <BR> ICaptureGraphBuilder2 *pBuild =NULL;<BR> IGraphBuilder *pGraph =NULL;<BR> IBaseFilter *pSrc =NULL;<BR> IBaseFilter *pMux =NULL;<BR> IBaseFilter *pVComp =NULL;<BR><BR><BR> <BR> CoInitialize(NULL);<BR> HRESULT hr;<BR><BR> hr=CoCreateInstance(CLSID_CaptureGraphBuilder,NULL,CLSCTX_INPROC,<BR> IID_ICaptureGraphBuilder,(void **)&pBuild);<BR> <BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> hr= pBuild->SetOutputFileName(<BR> &MEDIASUBTYPE_Avi,<BR> L"G:\\Output.avi",<BR> &pMux,<BR> NULL);<BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> <BR> hr=pBuild->GetFiltergraph(&pGraph);<BR> <BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> hr=pGraph->AddSourceFilter(L"g:\\Output.MPG",L"Source Filter",&pSrc);<BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> hr=CoCreateInstance(CLSID_AVICo, NULL,CLSCTX_INPROC,IID_IBaseFilter,<BR> (void**)&pVComp);<BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> //pGraph->AddFilter(pVComp,L"DivX Pro 5.0.2 Codec");<BR> hr=pGraph->AddFilter(pVComp,L"DivX :-) MPEG4 Fast-Motion");<BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> <BR> pBuild->RenderStream(<BR> NULL,<BR> NULL,<BR> pSrc,<BR> pVComp,<BR> pMux); //程序运行到这除了问题!怎么解决啊!<BR><BR> pBuild->RenderStream(NULL,NULL,pSrc,NULL,pMux);<BR><BR> IAMStreamConfig *pStreamConfig =NULL;<BR><BR> IAMVideoCompression *pCompress=NULL;<BR><BR> AM_MEDIA_TYPE *pmt;<BR><BR> pBuild->FindInterface(NULL, NULL,pVComp, IID_IAMStreamConfig,<BR> (void**)&pStreamConfig);<BR> pStreamConfig->GetFormat(&pmt);<BR><BR> if(pmt->formattype==FORMAT_VideoInfo)<BR><BR> {<BR><BR> ((VIDEOINFOHEADER *)(pmt->pbFormat)) ->dwBitRate=100000;<BR> pStreamConfig->SetFormat(pmt);<BR> }<BR><BR> //DeleteMediaType(pmt); //加上此条出错可能是因为少了库(加了以上所有库也不行)<BR><BR> pStreamConfig->QueryInterface(IID_IAMVideoCompression,(void **)&pCompress);<BR> <BR> pCompress->put_KeyFrameRate(10);<BR> <BR> pCompress->Release();<BR> pStreamConfig->Release();<BR><BR> IMediaControl *pControl =NULL;<BR> IMediaSeeking *pSeek =NULL;<BR> IMediaEvent *pEvent =NULL;<BR><BR> pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);<BR> pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);<BR> hr=pMux->QueryInterface(IID_IMediaSeeking,(void **)&pSeek);<BR><BR> pControl->Run();<BR> printf("Recompressing .....");<BR> long evCode;<BR> if(SUCCEEDED(hr))<BR> {<BR> REFERENCE_TIME rtTotal,rtNow=0;<BR> pSeek->GetDuration(&rtTotal);<BR> while((pEvent->WaitForCompletion(1000,&evCode))==E_ABORT)<BR> {<BR> pSeek->GetCurrentPosition(&rtNow);<BR> printf("%d%%\n",(rtNow *100)/rtTotal);<BR><BR> }<BR> pSeek->Release();<BR> }<BR> else<BR> {<BR> pEvent->WaitForCompletion(INFINITE,&evCode);<BR> }<BR> pControl->Stop();<BR> printf("All done \n");<BR> <BR> pSrc->Release();<BR> pMux->Release();<BR> pVComp->Release();<BR> pBuild->Release();<BR> pGraph->Release();<BR> pGraph->Release();<BR> CoUninitialize();<BR>}<BR> <BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:jacky 回复日期:2003-03-13 20:07:41
<br>内容:怎么没人告诉我啊???!!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:鸡蛋壳 回复日期:2003-03-14 12:51:28
<br>内容:你好!<BR><BR>请问你的DivX的压缩IBaseFilter是怎么来的?是CoCreateInstance来的?这样不好吧?<BR><BR>你应该这样:用CLSID_VideoCompressCategory(好像是这样的,查查看吧)然后用ISysEnum一个个的枚举出所有的Codec,发现有FriendlyName叫做"DivX Pro 5.0"之类的,那才是真的IBaseFilter, 然后要用Bind才能得到IBaseFilter, 然后加入IGraphBuilder.<BR><BR>另外,DeleteMediaType这个函数,我也觉得奇怪DX为什么不把他放到库里去,而是在DxUtils.cpp里面,这个函数很短,你干脆把他Ctrl+V过来就可以了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:jacky 回复日期:2003-03-22 20:38:53
<br>内容://////此例子是根据Direct8.0中的directshow中的代码来的!<BR>#include <dshow.h><BR>#include <stdio.h><BR>#include <Mtype.h><BR><BR>////指定了所有的库了<BR>#pragma comment(lib,"amstrmid.lib")<BR>#pragma comment(lib,"d3d8.lib")<BR>#pragma comment(lib,"d3dx.lib")<BR>#pragma comment(lib,"d3dx8.lib")<BR>#pragma comment(lib,"d3dx8d.lib")<BR><BR><BR>#pragma comment(lib,"d3dx8dt.lib")<BR>#pragma comment(lib,"d3dxd.lib")<BR>#pragma comment(lib,"d3dxof.lib")<BR>#pragma comment(lib,"ddraw.lib")<BR>#pragma comment(lib,"dinput.lib")<BR><BR>#pragma comment(lib,"dinput8.lib")<BR>#pragma comment(lib,"dmoguids.lib")<BR>#pragma comment(lib,"dplayx.lib")<BR>#pragma comment(lib,"dpnaddr.lib")<BR>#pragma comment(lib,"dpnlobby.lib")<BR><BR>#pragma comment(lib,"dpvoice.lib")<BR>#pragma comment(lib,"dsetup.lib")<BR>#pragma comment(lib,"dsound.lib")<BR>#pragma comment(lib,"dxerr8.lib")<BR>#pragma comment(lib,"dxguid.lib")<BR><BR>#pragma comment(lib,"dxtrans.lib")<BR>#pragma comment(lib,"ksproxy.lib")<BR>#pragma comment(lib,"ksuser.lib")<BR>#pragma comment(lib,"dpnlobby.lib")<BR>#pragma comment(lib,"msdmo.lib")<BR><BR>#pragma comment(lib,"qedit.lib")<BR>#pragma comment(lib,"quartz.lib")<BR>#pragma comment(lib,"strmiids.lib")<BR><BR><BR><BR><BR><BR><BR><BR>void __cdecl main()<BR>{<BR> <BR> ICaptureGraphBuilder2 *pBuild =NULL;<BR> IGraphBuilder *pGraph =NULL;<BR> IBaseFilter *pSrc =NULL;<BR> IBaseFilter *pMux =NULL;<BR> IBaseFilter *pVComp =NULL;<BR><BR><BR> <BR> CoInitialize(NULL);<BR> HRESULT hr;<BR><BR> hr=CoCreateInstance(CLSID_CaptureGraphBuilder,NULL,CLSCTX_INPROC,<BR> IID_ICaptureGraphBuilder,(void **)&pBuild);<BR> <BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> hr= pBuild->SetOutputFileName(<BR> &MEDIASUBTYPE_Avi,<BR> L"G:\\Output.avi",<BR> &pMux,<BR> NULL);<BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> <BR> hr=pBuild->GetFiltergraph(&pGraph);<BR> <BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> hr=pGraph->AddSourceFilter(L"g:\\ruby.avi",L"File Source (Async.)",&pSrc);<BR><BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> hr=CoCreateInstance(CLSID_AVICo, NULL,CLSCTX_INPROC,IID_IBaseFilter,<BR> (void**)&pVComp);<BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR><BR> <BR> <BR> ICreateDevEnum *pSysDevEnum = NULL;<BR> IEnumMoniker *pEnum = NULL;<BR> IMoniker *pMoniker = NULL;<BR><BR> <BR><BR> hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, <BR> CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, <BR> (void**)&pSysDevEnum);<BR> hr = pSysDevEnum->CreateClassEnumerator(<BR> CLSID_VideoCompressorCategory, &pEnum, 0);<BR> char hh[32];<BR> LPCWSTR compressor;<BR> while (S_OK == pEnum->Next(1, &pMoniker, NULL))<BR> {<BR> IPropertyBag *pPropBag = NULL;<BR> pMoniker->BindToStorage(0, 0, IID_IPropertyBag, <BR> (void **)&pPropBag);<BR> VARIANT var;<BR> VariantInit(&var);<BR> hr = pPropBag->Read(L"FriendlyName", &var, 0);<BR> if (SUCCEEDED(hr))<BR> { <BR> <BR> ::WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,hh,32,NULL,NULL);<BR> compressor=var.bstrVal;<BR> if ( lstrcmp("DivX Pro 5.0.3 Codec",hh)==0) //<BR> {<BR> compressor=var.bstrVal;<BR> hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, <BR> (void**)&pVComp);<BR> }<BR> <BR> } <BR> VariantClear(&var); <BR> pPropBag->Release();<BR> pMoniker->Release();<BR> }<BR><BR> <BR> pSysDevEnum->Release();<BR> pEnum->Release();<BR> //hr=pGraph->AddFilter(pVComp,L"DivX Pro 5.0.3 Codec");<BR> //hr=pGraph->AddFilter(pVComp,hh);<BR> hr=pGraph->AddFilter(pVComp,compressor); <BR> if(hr!=S_OK)<BR> {<BR> exit(0);<BR> }<BR> <BR> pBuild->RenderStream(<BR> NULL,<BR> NULL,<BR> pSrc,<BR> pVComp,<BR> pMux); //程序运行到这除了问题!怎么解决啊!<BR><BR> pBuild->RenderStream(NULL,NULL,pSrc,NULL,pMux);<BR><BR> IAMStreamConfig *pStreamConfig =NULL;<BR><BR> IAMVideoCompression *pCompress=NULL;<BR><BR> AM_MEDIA_TYPE *pmt;<BR><BR> pBuild->FindInterface(NULL, NULL,pVComp, IID_IAMStreamConfig,<BR> (void**)&pStreamConfig);<BR> pStreamConfig->GetFormat(&pmt);<BR><BR> if(pmt->formattype==FORMAT_VideoInfo)<BR> {<BR><BR> ((VIDEOINFOHEADER *)(pmt->pbFormat)) ->dwBitRate=100000;<BR> pStreamConfig->SetFormat(pmt);<BR> }<BR><BR> //DeleteMediaType(pmt); //加上此条出错可能是因为少了库(加了以上所有库也不行)<BR><BR> pStreamConfig->QueryInterface(IID_IAMVideoCompression,(void **)&pCompress);<BR> <BR> pCompress->put_KeyFrameRate(10);<BR> <BR> pCompress->Release();<BR> pStreamConfig->Release();<BR><BR> IMediaControl *pControl =NULL;<BR> IMediaSeeking *pSeek =NULL;<BR> IMediaEvent *pEvent =NULL;<BR><BR> pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);<BR> pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);<BR> hr=pMux->QueryInterface(IID_IMediaSeeking,(void **)&pSeek);<BR><BR> pControl->Run();<BR> printf("Recompressing .....");<BR> long evCode;<BR> if(SUCCEEDED(hr))<BR> {<BR> REFERENCE_TIME rtTotal,rtNow=0;<BR> pSeek->GetDuration(&rtTotal);<BR> while((pEvent->WaitForCompletion(1000,&evCode))==E_ABORT)<BR> {<BR> pSeek->GetCurrentPosition(&rtNow);<BR> printf("%d%%\n",(rtNow *100)/rtTotal);<BR><BR> }<BR> pSeek->Release();<BR> }<BR> else<BR> {<BR> pEvent->WaitForCompletion(INFINITE,&evCode);<BR> }<BR> pControl->Stop();<BR> printf("All done \n");<BR> <BR> pSrc->Release();<BR> pMux->Release();<BR> pVComp->Release();<BR> pBuild->Release();<BR> pGraph->Release();<BR> pGraph->Release();<BR> CoUninitialize();<BR>}<BR> <BR> 我现在是枚举出Divx来了怎么还是有问题!请再帮忙看看啊!谢谢你了!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -