我在我的应用程序中使用DirectShow从网络摄像头捕获视频。使用相机预览和捕捉1080P视频时遇到问题。例如:罗技的HD Pro网络摄像头C910相机。 1080P视频预览非常不稳定,没有观察到高清晰度。我可以看到枚举的设备名称是“USB视频设备”
今天我们在这些XP机器上安装了Logitech网络摄像头软件。在该应用程序中,我们可以看到1080P视频而没有任何抖动。我们还在Logitech应用程序中录制了1080P视频,并以高质量观看了它们。
但是当我测试我的应用程序时,
我可以看到枚举的设备名称已更改为“Logitech Pro Webcam C910”而不是“USB视频设备”,如前一种情况。
我的应用程序占用的CPU为20%,但“SYSTEM”进程占用了60%以上,整体CPU占100%左右
即使视频质量有了很大改善,但仍然存在混蛋,可能是由于100%的CPU。
当我关闭我的应用程序时,“系统”进程的高CPU运行消失了。
关于我的应用程序 - 它使用ICaptureGraphBuilder2 :: RenderStream来创建预览和捕获流。
在Capture Stream中,我将Camera滤镜连接到NULL渲染器,样本采集器作为中间滤镜。
在预览流中,我有
g_pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,cam,NULL,NULL);
预览显示在使用IVideoWindow界面指定的窗口上。我使用以下
g_vidWin->put_Owner((OAHWND)(HWND)hWnd);
g_vidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
g_vidWin->put_MessageDrain((OAHWND)hWnd);
我尝试将帧速率设置为不同的值(AvgTimePerFrame = 500000(20 fps)和666667(15 fps)等。
但是所有的试验仍然给出相同的结果。清晰度变得更高,但是由于“系统”的60%以上的使用率,一些混蛋仍然存在并且CPU几乎是100%。当我关闭我的视频应用程序时,“系统”的使用率会回到1-2%。
欢迎任何帮助。
提前致谢,
答案 0 :(得分:0)
使用 IAMStreamConfig.SetFormat()从捕获设备中选择输出流(捕获和预览)的帧速率,尺寸,颜色空间和压缩。
旁白:上面的评论“它不会改变源过滤器自身的速率”是完全错误的。此接口的全部目的是定义捕获视频的输出格式和帧速率。
使用 IAMStreamConfig.GetStreamCaps()确定可用的帧速率,尺寸,颜色空间和压缩格式。大多数相机提供多种不同的格式。
听起来你所面临的根本问题是USB带宽(至少在USB3之前)无法在没有压缩的情况下维持30fps 1080P。我最熟悉的是Microsoft LifeCam Studio系列USB摄像头,这些设备执行硬件压缩以通过网络发送视频,然后在接收端占用大部分CPU,转换来自Motion JPEG的压缩视频成YUV格式。据推测,罗技相机以类似的方式工作。
相机产生的帧速率受到在软件中执行自动对焦,自动色彩校正和自动曝光的额外工作量的影响。如果可能,请尝试在相机上禁用所有这些功能。在Skype时代,相机软件和硬件对于保持较高的帧速率而不太关注更好的图像质量。
用于捕获的DirectShow定时模型继续工作,即使相机无法以请求的速率生成帧,只要相机指示帧丢失即可。它使用“丢帧”计数字段来执行此操作,该字段与每个捕获的帧一起骑行。丢弃帧的总和加上“实际”帧必须等于通过 IAMStreamConfig.SetFormat()设置的请求帧速率。
在I7上使用LifeCam Studio我以30fps 720p进行预览,压缩到H.264并使用大约30%的CPU将.mp4文件写入磁盘,但仅限于所有自动对焦/颜色/相机上的曝光设置被禁用。