【问题标题】:Preview issues for 1080P video using DirectShow使用 DirectShow 预览 1080P 视频的问题
【发布时间】:2012-06-04 11:58:56
【问题描述】:

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

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

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

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

  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%。

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

提前致谢,

【问题讨论】:

  • 也许更多信息会有所帮助。运行 Logitech 应用程序时,SYSTEM 对 CPU 的消耗是多少?也许这只是设备驱动程序用尽了你的周期。我不确定更改 AvgTimePerFrame 会影响相机的实际帧速率。你在哪里设置?我没有 C910,但我有几台其他罗技相机,它们的帧速率似乎受分辨率和曝光设置的控制。
  • 当 Logitech 应用程序运行时,SYSTEM 使用的 CPU 不超过 2% 我的印象是更改 AvgTimePerFrame 会更改帧速率。你能告诉我DirectShow设置/界面方法的确切过程,可以设置帧率吗?
  • 对于我的罗技,我知道影响帧速率的唯一方法是更改​​分辨率和曝光设置。相机自行决定要使用的速率。我不确定,但我认为 VIDEOINFO 结构中的平均速率是您的源过滤器设置的,用于向其他过滤器建议他们应该预期的速率。它不会改变源过滤器自身的速率;它可以帮助其他过滤器知道会发生什么。您的相机将以它想要的任何速率抽取样本。见msdn.microsoft.com/en-us/library/windows/desktop/…
  • 谢谢史蒂文斯。顺便问一下,您对 Windows XP 中的“SYSTEM”进程过度使用 CPU 有任何指示吗?哪个论坛将是理想的场所?罗技论坛?
  • 不,这很令人费解。您的应用程序中还发生了什么?如果您使用您在 graphedt.exe 中提到的过滤器构建图表,您会看到这种 CPU 消耗吗?

标签: directshow preview frame-rate


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2022-11-22
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多