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

VCLIFE 2010-07-06 07:48:48

//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了很多年,也真的是没有什么收获,所以才请教各位老大,所以还请知道的不吝赐教....,有一天还有人问这个问题,我接各位高手的班....
...全文
1156 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyaibo 2013-03-27
  • 打赏
  • 举报
回复
同问,我也是保存文件很慢,楼主有没有解决?
hurricine0013 2012-04-12
  • 打赏
  • 举报
回复
楼主,你的问题解决了吗,我现在遇到和你相同的情况,我是在wince平台上做视频的采集,用的也是wince嵌入式高级编程上的camera例子,我在录像的时候,调大分辨率,就会出现内存很快用完,在这个过程中,cpu占用率很高,编码很耗时,但是如果是320*240,就可以。我也怀疑是因为使用的是CLSID_CWMV9EncMediaObject这个编码器引起的,我现在想换为飞思卡尔注册的硬件编码filter,但是老是不成功,请教解决方案。
赵轩 2012-02-13
  • 打赏
  • 举报
回复
我遇到了win CE下视频硬解码的问题,好像是directshow中的filter出问题了,想请教
iwillbeback008 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 vblittleboy 的回复:]
你必须使用6410提供的mfc编码库写一个编码filter,三星提供的有解码filter以及源码
目录位于:winceroot\platform\6410\samples\directshow\filter下面
[/Quote]

备注,学习了。
nikaidaye 2011-06-29
  • 打赏
  • 举报
回复
楼上能再具体一点么,谢谢~! 愁死我了
  • 打赏
  • 举报
回复
你必须使用6410提供的mfc编码库写一个编码filter,三星提供的有解码filter以及源码
目录位于:winceroot\platform\6410\samples\directshow\filter下面
ccjl111 2010-12-21
  • 打赏
  • 举报
回复
CSDN的高手们在哪?
binjunsong 2010-12-07
  • 打赏
  • 举报
回复
咋没高人指点呀
binjunsong 2010-11-19
  • 打赏
  • 举报
回复
我也遇到以上类似的问题,请高手指教一二,以下是问题描述:
用arm6410做264编码以及保存实验,即通过cmos采集图象进入6410编码器编码后直接保存到flash或SD卡内,结果播放保存的压缩视频文件时候,5分钟的采集编码时间,播放文件只有几秒中,有点快放的感觉,什么问题啊?是存文件跟不上还是编码器编码太慢啊?
冬尘 2010-07-08
  • 打赏
  • 举报
回复
帮你顶一下。
frankingchen 2010-07-08
  • 打赏
  • 举报
回复
顶一顶,总得解决
VCLIFE 2010-07-08
  • 打赏
  • 举报
回复
结贴,都是高人,舍不得回答
ruritanian 2010-07-07
  • 打赏
  • 举报
回复
如果你用CLSID_CWMV9EncMediaObject的话,那么就是用系统缺省的wmv编码器,这是软解码。
6410里面带MFCDecoderFilter,这是一个directshow filter,所以不需要像dmo那样用IDMOWrapperFilter接口装载。你只要像装载普通directshow filter一样装载好了,你直接对MFCDecoderFilter调用CoCreateInstance,然后AddFilter好了
nommm 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vclife 的回复:]

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

还有,您用GDI显示,并且用sample里……
[/Quote]

存文件的话是不是就得把内存配大一点?或者设定录像的时限??我也没仔细考虑过。
GDI显示的话摄像头驱动就要改,把那些DShow相关的全去掉,之前我也碰到很多问题,人家也说GDI不如DShow好,我就是不会才这么作……
VCLIFE 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nommm 的回复:]
内存很快用尽是不是保存文件的问题?个人觉得一边采集编码一边写入文件有点困难,无论是flash还是SD卡读写速度都超慢的,根本没法跟上采集和编码的速度。已编码但未保存的数据只能越积越多。
[/Quote]
首先感谢您的回复,您觉得写文件的速度赶不上采集和编码的速度对吗?但是如果还是要求要存文件的话,那是不是只能让数据量减小

还有,您用GDI显示,并且用sample里面的例子,那肯定用的是DeviceIoControl的方式来获取数据?能留个QQ吗?请教下这样的实现方法。我现在正在研究飞思卡尔里面的那个CAM例子
nommm 2010-07-07
  • 打赏
  • 举报
回复
我不是黄蓉,我不会DShow……
所以我就是用GDI显示,硬件编解码器使用SMDK6410的sample里面的那个例子就可以正常工作了,没试过MFCDecoderFilter。就是在程序里自己调的SMDK6410提供的编解码API。

内存很快用尽是不是保存文件的问题?个人觉得一边采集编码一边写入文件有点困难,无论是flash还是SD卡读写速度都超慢的,根本没法跟上采集和编码的速度。已编码但未保存的数据只能越积越多。
fgwntg 2010-07-07
  • 打赏
  • 举报
回复
不会,有点乱
VCLIFE 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ruritanian 的回复:]
6410里面带MFCDecoderFilter,这是一个directshow filter,所以不需要像dmo那样用IDMOWrapperFilter接口装载。你只要像装载普通directshow filter一样装载好了,你直接对MFCDecoderFilter调用CoCreateInstance,然后AddFilter好了
[/Quote]

CComPtr<IBaseFilter> pVideoEncoder;

pVideoEncoder.CoCreateInstance(CLSID_MFCDecFilter);

当然找不到CLSID_MFCDecFilter,这个东西定义在SAMPLE里面的dshowfilter的 MFCDecFilter.h里面

我应该怎么弄呢?需要重新生成SDK?把MFCDecFilter.h加进去,实际上我这么做了,可是包含了.h之后,报错错误外部引用,证明还要库........,这样弄不对吧
该怎么用呢?
VCLIFE 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ruritanian 的回复:]
如果你用CLSID_CWMV9EncMediaObject的话,那么就是用系统缺省的wmv编码器,这是软解码。
6410里面带MFCDecoderFilter,这是一个directshow filter,所以不需要像dmo那样用IDMOWrapperFilter接口装载。你只要像装载普通directshow filter一样装载好了,你直接对MFCDecoderFilter调用CoCreateI……
[/Quote]
谢谢,又弄明白一样东西...我试试
VCLIFE 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ruritanian 的回复:]
如果你用CLSID_CWMV9EncMediaObject的话,那么就是用系统缺省的wmv编码器,这是软解码。
6410里面带MFCDecoderFilter,这是一个directshow filter,所以不需要像dmo那样用IDMOWrapperFilter接口装载。你只要像装载普通directshow filter一样装载好了,你直接对MFCDecoderFilter调用CoCreateI……
[/Quote]
谢谢,又弄明白一样东西...我试试
加载更多回复(1)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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