请教,关于DirectShow视频采集中,源滤波器MediaTypes的问题

nightyw 2012-04-13 08:16:33
程序做视频采集,相机的帧率不能调整,但用Amcap设置 可以通过设置YUY2 格式30帧 和 设置MJPG格式时60帧,不能设置成其他帧率;Amcap中影响帧率的只有这一个因素

我现在想在60帧下运行,所以按照Amcap的设置,我把源滤波器设置为MJPG格式pmt->subtype = MEDIASUBTYPE_MJPG;

输出格式mt.subtype = MEDIASUBTYPE_RGB24;

但设置后帧率始终为30帧,无变化,而且发现源滤波器subtype已经设置为MEDIASUBTYPE_MJPG,但帧率不像Amcap变为60帧;

请教Amcap是如何让帧率升为60帧的?

PS:我的采集程序使用自定回调函数HRESULT STDMETHODCALLTYPE MyGrabberCallBack::SampleCB( double SampleTime,
IMediaSample *pSample),该函数回调时才GetCurrentBuffer,否则WaitForSingleObject;
...全文
461 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightyw 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:
引用 5 楼 的回复:

Amcap枚举硬件驱动支持的媒体格式,然后在界面上显示出来。
设置的时候就是把枚举的格式再设置回驱动。

具体过程可以参考DIRECTSHOW文档,也可以参考Amcap源码,Amcap是directshow带的一个示例。
directshow以前在DX中,现在在WINDOWS SDK中。


在Amcap的例程里没有看到哪里……
[/Quote]

谢谢你,问题已经找到了,帧率是相机自动根据格式调整的,问题居然出在了参考时间上,如果设置了参考时间帧率就会下降到30帧,参考时间设置为NULL就能到60帧;这种问题出得难受,弄了我几天
dengzikun 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

Amcap枚举硬件驱动支持的媒体格式,然后在界面上显示出来。
设置的时候就是把枚举的格式再设置回驱动。

具体过程可以参考DIRECTSHOW文档,也可以参考Amcap源码,Amcap是directshow带的一个示例。
directshow以前在DX中,现在在WINDOWS SDK中。


在Amcap的例程里没有看到哪里写了驱动相关的东西啊,都是直接……
[/Quote]

Amcap通过DIRECTSHOW SDK访问硬件驱动,底层细节微软已经为你封装好了,
Amcap枚举设备支持的视频格式,然后设置。
你可以在amcap中添加AddToRot函数,这样就可以在graphedit中看到amcap的graph图,
比较和你的有何异同。
nightyw 2012-04-16
  • 打赏
  • 举报
回复
好的,谢谢,我先试试,如果是这个问题给你分,谢谢!
dengzikun 2012-04-16
  • 打赏
  • 举报
回复
Amcap枚举硬件驱动支持的媒体格式,然后在界面上显示出来。
设置的时候就是把枚举的格式再设置回驱动。

具体过程可以参考DIRECTSHOW文档,也可以参考Amcap源码,Amcap是directshow带的一个示例。
directshow以前在DX中,现在在WINDOWS SDK中。
nightyw 2012-04-16
  • 打赏
  • 举报
回复
找到了一点眉目,还没试验,用Graphedit查看我的Sourcefilter发现捕获Pin和静态Pin支持的格式居然不是一样的,捕获Pin里面把MJPG枚举不出来,我试试Still Pin
nightyw 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

Amcap枚举硬件驱动支持的媒体格式,然后在界面上显示出来。
设置的时候就是把枚举的格式再设置回驱动。

具体过程可以参考DIRECTSHOW文档,也可以参考Amcap源码,Amcap是directshow带的一个示例。
directshow以前在DX中,现在在WINDOWS SDK中。
[/Quote]

在Amcap的例程里没有看到哪里写了驱动相关的东西啊,都是直接设备枚举,再连接源filter的啊!
奇怪的是我用EnumMediaTypes枚举类型是没有MJPG,用GetStreamCaps有,但相机格式应该已经改为MJPG了,我使用源filter->MJPG Decoder->Color filter->SampleGraber这个链接都没问题,如果有问题的话这个连接应该是不能运行起来的!

与Amcap唯一的差别是我是自己搭建Filter,而Amcap是renderstream,自动生成的,真心不知道问题出在哪里了!
向立天 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我晕哦,都没人知道么,还是我没描述清楚?搞不定这么问题啊,项目急啊...
[/Quote]专业性太强的东西知道的人少很正常
再说又是周末
等一等吧
nightyw 2012-04-15
  • 打赏
  • 举报
回复
先确认你的相机真的支持60FPS吗?相机的驱动支持60FPS吗?
Amcap也是调用DIRECTSHOW SDK访问相机驱动来设置相机的。
再有,即使相机和驱动都支持,如果计算机处理能力达不到,
你实际得到的帧率也不能达到设置的帧率。

--------------------------------------------

您好,谢谢你的回答,我的相机是USB的,并没有安装特别的驱动程序,在Amcap下切换YUY2和MJPG两个格式,Amcap下面显示的帧率确实是从30FPS到60FPS的,而且硬件的工程师是说了这个相机被从30帧解锁了,要求厂家在DSP里面设置过的
驱动的话具体是如何使用Directshow访问的?我只是照搬标准的CameraDS的标准视频采集写法,然后设置了一下Devicefilter的媒体格式为MJPG,不知道哪里可以访问驱动

处理速度没问题的,我把采样的回调函数去掉,直接循环采集的话可以到每秒60次的

最主要的问题是我不清楚Amcap是如何做到改变格式的时候将帧率上调的,Amcap能实现的话我的软件应该也是能够调到60帧,就是不知道Amcap是如何实现的!
dengzikun 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
程序做视频采集,相机的帧率不能调整,但用Amcap设置 可以通过设置YUY2 格式30帧 和 设置MJPG格式时60帧,不能设置成其他帧率;Amcap中影响帧率的只有这一个因素

我现在想在60帧下运行,所以按照Amcap的设置,我把源滤波器设置为MJPG格式pmt->subtype = MEDIASUBTYPE_MJPG;

输出格式mt.subtype = MEDIASUBTYPE_R……
[/Quote]

先确认你的相机真的支持60FPS吗?相机的驱动支持60FPS吗?
Amcap也是调用DIRECTSHOW SDK访问相机驱动来设置相机的。
再有,即使相机和驱动都支持,如果计算机处理能力达不到,
你实际得到的帧率也不能达到设置的帧率。
nightyw 2012-04-15
  • 打赏
  • 举报
回复
我晕哦,都没人知道么,还是我没描述清楚?搞不定这么问题啊,项目急啊...

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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