1

我在我的应用程序中使用 DirectShow 从网络摄像头捕获视频。我在使用相机预览和捕捉 1080P 视频时遇到问题。例如:罗技的 HD Pro Webcam C910 摄像头。1080P 视频预览非常生涩,没有观察到高清清晰度。我可以看到枚举的设备名称是“USB 视频设备”

今天我们在这些 XP 机器上安装了罗技网络摄像头软件。在该应用程序中,我们可以毫无抖动地观看 1080P 视频。此外,我们在罗技应用程序中录制了 1080P 视频,并以高质量观看了它们。

但是当我测试我的应用程序时,

  1. 我可以看到枚举的设备名称已更改为“Logitech Pro Webcam C910”,而不是之前的“USB 视频设备”。

  2. 我的应用程序占用的 CPU 是 20%,但进程“SYSTEM”占用了 60%+,整个 CPU 围绕 100% 旋转

    1. 尽管视频质量已经大大提高,但仍然存在混蛋,这可能是由于 100% 的 CPU。

    2. 当我关闭我的应用程序时,“系统”进程的高 CPU 使用率消失了。

关于我的应用程序 - 它使用 ICaptureGraphBuilder2::RenderStream 创建预览和捕获流。

在 Capture Stream 中,我将相机过滤器连接到 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%。

非常欢迎对此提供任何帮助。

提前致谢,

4

1 回答 1

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 文件写入磁盘,但前提是所有自动对焦/颜色/曝光设置在相机上被禁用。

于 2013-03-15T08:24:23.120 回答