首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

dshow编码filter疑问 S3C6410开发板 有关问题简单进者有分

2012-03-20 
dshow编码filter疑问 S3C6410开发板 问题简单进者有分[codeC/C++][/code]//1,创建ICaptureGraphBuilder2

dshow编码filter疑问 S3C6410开发板 问题简单进者有分
[code=C/C++][/code]
//1,创建ICaptureGraphBuilder2接口,用于管理媒体捕捉对象
CHK(m_pCaptureGraphBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder));

//2,创建IGraphBuilder接口
CHK(m_pGraphBuilder.CoCreateInstance(CLSID_FilterGraph));

//3,
CHK(m_pCaptureGraphBuilder->SetFiltergraph(m_pGraphBuilder ));

//4,得到IMediaControl接口,用于控制流播放
CHK(m_pGraphBuilder.QueryInterface(&m_pMediaControl)); 


//5,得到IMediaSeeking接口,用于设置播放位置
CHK(m_pGraphBuilder.QueryInterface(&m_pMediaSeeking)); 

//6,得到m_pMediaEvent接口,用于获取媒体事件
CHK(m_pGraphBuilder.QueryInterface(&m_pMediaEvent)); 

//7,创建视频捕捉Filter
CHK(m_pVideoCaptureFilter.CoCreateInstance(CLSID_VideoCapture));

//8,得到视频捕捉属性页接口
CHK(m_pVideoCaptureFilter->QueryInterface(&m_pPropertyBag ));

//9,选择视频捕捉设备
//得到第1个视频捕捉设备名。
if (!GetFirstCameraDriver( wzDeviceName ))
{
goto Cleanup;
}
varCamName = wzDeviceName;
if(( varCamName.vt == VT_BSTR ) == NULL ) {
return FALSE;
}
////设置视频捕捉为第1个捕捉设备
PropBag.Write( L"VCapName", &varCamName );  
CHK(m_pPropertyBag->Load( &PropBag, NULL ));

//10,将视频捕捉FILTER添加到FILTER图中。
CHK(m_pGraphBuilder->AddFilter( m_pVideoCaptureFilter, L"Video capture source" ));

//11,创建IDMOWrapperFilter接口
CHK(pVideoEncoder.CoCreateInstance( CLSID_DMOWrapperFilter ));
CHK(pVideoEncoder.QueryInterface( &pWrapperFilter ));
//12,加载WMV9 DMO
CHK(pWrapperFilter->Init( CLSID_CWMV9EncMediaObject, DMOCATEGORY_VIDEO_ENCODER ));

// 13,将编码器FILTER加入到过滤器图中
CHK(m_pGraphBuilder->AddFilter( pVideoEncoder, L"WMV9 DMO Encoder" ));

//14,创建ASF多路(复用)器,并加入到过滤器图中
CHK(m_pCaptureGraphBuilder->SetOutputFileName( &MEDIASUBTYPE_Asf,strFileName, &pASFMultiplexer, &pFileSinkFilter ));


这是wince指南里面的camera例子,我用来在S3C6410的开发板上做视频的预览和捕捉。
现在遇到了很大的问题,编码的速度很慢,又或者是采集的数据量太大的缘故,内存很快用尽..,没有办法实时的一边捕捉一边写入文件。
所以我产生了对filter的疑问:
程序中创建IDMOWrapperFilter接口,然后加载了个CLSID_CWMV9EncMediaObject这个解码filter,这个解码的filter还有别的选择吗??这个filter的实现会不会是软编码?

6410本身带有MFC的硬编解码,而且开发板上提供了一个MFCDecoderFilter,而且编译OS的时候也编译进去了,有个帖子看到有人讨论说如果用media播放视频文件的话,就会由dshow直接调用到这个filter,那么我这里用dshow做视频捕捉用的编码filter底层实际上调用的是这个filter吗?因为如果不是这个filter,那么视频仍然被采集下来了,虽然很慢,那证明还有别的软编码filter。那我必须让dshow调用这个硬编码的才行....

上边也说了这个filter叫做MFCDecoderFilter,人家的名字叫做Decoder,是不是这个filter只是一个解码的filter,编码的时候用不上,还是说名字是这么起的,实际上编解码都用的这个

我怎么能通过注册表看到有没有MFC的编码filter,从哪里查看....

6410做视频采集的同志们,你们捕捉视频的时候难道都对数据进行了裁剪才能达到保存的文件的功能??

上述问题估计在行家眼里看着都比较白,高手们也在想,这孩子为什么不自己去google,就知道问,实际上我已经google了很多年,也真的是没有什么收获,所以才请教各位老大,所以还请知道的不吝赐教....,有一天还有人问这个问题,我接各位高手的班....

[解决办法]
不会,友情帮顶,然后接分
[解决办法]
不会,有点乱
[解决办法]
我不是黄蓉,我不会DShow……
所以我就是用GDI显示,硬件编解码器使用SMDK6410的sample里面的那个例子就可以正常工作了,没试过MFCDecoderFilter。就是在程序里自己调的SMDK6410提供的编解码API。

内存很快用尽是不是保存文件的问题?个人觉得一边采集编码一边写入文件有点困难,无论是flash还是SD卡读写速度都超慢的,根本没法跟上采集和编码的速度。已编码但未保存的数据只能越积越多。
[解决办法]

探讨

首先感谢您的回复,您觉得写文件的速度赶不上采集和编码的速度对吗?但是如果还是要求要存文件的话,那是不是只能让数据量减小

还有,您用GDI显示,并且用sample里……

[解决办法]
如果你用CLSID_CWMV9EncMediaObject的话,那么就是用系统缺省的wmv编码器,这是软解码。
6410里面带MFCDecoderFilter,这是一个directshow filter,所以不需要像dmo那样用IDMOWrapperFilter接口装载。你只要像装载普通directshow filter一样装载好了,你直接对MFCDecoderFilter调用CoCreateInstance,然后AddFilter好了


[解决办法]
顶一顶,总得解决
[解决办法]
帮你顶一下。

热点排行