【问题标题】:uvch264src stalls when capturing from Logitech C920 in darkness在黑暗中从罗技 C920 捕获时,uvch264src 停止
【发布时间】:2016-11-19 21:32:29
【问题描述】:

我有一个 gstreamer 管道 - 在这个环境中运行:

  • 树莓派 3
  • Class 10 Sandisk 8GB sdcard
  • Raspbian Jessie,全部更新
  • 罗技 C920 USB 2 网络摄像头
  • 从源代码编译的 Gstreamer 1.8
  • 无需额外的 USB 外围设备或设备
  • 2A Apple USB 电源(iPad 充电器)
  • 在连接 C920 时使用和不使用有源 USB 集线器进行测试

它捕获 H264 素材 (H264.720@24FPS)。 我的流水线采用 C920 的 H264 编码输出,然后进行开球。它还捕获(alsa)C920 的音频,将其压缩为 AAC,然后就可以了。两个 T 恤的一条腿直接进入 FLV 多路复用器,然后放到磁盘上进行备份。 tee 的第二段被解码(使用 OpenMax),然后以较低的比特率重新压缩(同样是 OpenMax),最后,FLV 混合,并推送到 RTMP 服务器进行实时查看。

最终,结果基本上是这样的:

CPU 大约占 400% 中的 50%(记住四核:))

现在是有趣的部分......

我已经完成了所有这些工作 - 完美无缺。然后我把它全部关闭,休息一下。我晚上回来,启动代码......它运行了大约 10 秒,然后管道停止了。它没有停止、暂停或出错 - 它只是停止了 - 数据包停止写入磁盘和流。

有一些警告和错误,但我以前见过这些,它们对生成的流没有影响,但现在,出于某种原因 - 它们对管道的健康状况来说是终端:

0:01:31.219560984  4075  0x1445400 WARN            audiobasesrc gstaudiobasesrc.c:864:gst_audio_base_src_create:<alsasrc0> create DISCONT of 708160 samples at sample 2904320
0:01:31.219736087  4075  0x1445400 WARN            audiobasesrc gstaudiobasesrc.c:869:gst_audio_base_src_create:<alsasrc0> warning: Can't record audio fast enough
0:01:31.219774941  4075  0x1445400 WARN            audiobasesrc gstaudiobasesrc.c:869:gst_audio_base_src_create:<alsasrc0> warning: Dropped 708160 samples. This is most likely because downstream can't keep up and is consuming samples too slowly.
WARNING: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Can't record audio fast enough
Additional debug info:
gstaudiobasesrc.c(869): gst_audio_base_src_create (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:
Dropped 708160 samples. This is most likely because downstream can't keep up and is consuming samples too slowly.

所以,把我剩下的一点头发拔掉后,我把它收拾起来,晚上就结束了。 今天早上,我再次抓住它,准备重新开始。我启动代码,然后……它又开始工作了……没有打嗝!这是怎么回事???

在工作、不工作和再次工作之间唯一发生变化的是一天中的时间!

然后我有了一个想法。我运行代码几分钟。没有打嗝,一切都很好......然后,我把相机放在我的笔记本电脑包里,所以它什么都看不到。 10 秒后,管道停止了!!!

我将管道简化为仅文件接收器(删除了 tee、OMX 元素和 rtmpsink),然后重新运行了测试。这次它并没有完全停止,但我收到了“无法以足够快的速度录制音频”的警告,并且生成的文件有明显的音频丢失。

所以 - 看起来,罗技 C920 在黑暗的环境中似乎会以某种方式窒息。

我注意到的其他一些东西,不确定这是否相关......但我的录音中总是有一些振荡的高频噪音(约 16khz)。如果我将相机举到耳边,我实际上可以听到相机发出相同的声音。如果我盖住相机上的镜头,声音就会停止。如果我关闭相机的自动对焦,并将绝对对焦级别设置为“0”,那么噪点几乎也会消失。 我知道这不是一台无用的相机,因为我有大约 6 个,它们的行为方式都相同。我也知道它不是一个糟糕的 Raspberry Pi,因为我在所有这些上都试过了

  • 3 * 树莓派 3
  • 1 * 树莓派 2 B+
  • 2 * 树莓派 B+

有人能解释一下吗?

======================================

补充说明:

  • 捕获 mjpeg(不激活相机上的 h264 编码器)可防止来自相机的可闻噪音。表示噪点是由相机的 DSP 引起的。
  • 捕获 mpjeg 会做一些有趣的事情...在相机处于黑暗状态时,生成的视频文件似乎已经丢掉了很多帧...所以一旦它再次亮起,视频就会领先于音频几秒钟。

【问题讨论】:

    标签: raspberry-pi gstreamer h.264 logitech


    【解决方案1】:

    针对此问题已推送到最新的 1.12 Gstreamer 版本,即使在相机处于非常长时间(黑色)曝光时也会强制帧进入缓冲区。我们遇到了类似的问题,并建议了一个补丁。 请参阅 Gstreamer freedesktop 站点。 您可能需要从源代码重新编译 gstreamer-plugins-bad 或等到 debian 实验打包处理它。您想要的文件是 libgstuvch264.so,而 uograde 是 sys/uvch264src 子文件夹中的 mjpeg_demux.c。 请注意,修复只有 5-6 天。

    【讨论】:

    • 嗨,马克 - 你确定吗?问题报告与 H264 流有关,而不是 mjpeg 流。你能提供补丁的链接吗?我在这里看不到任何相关内容:github.com/GStreamer/gst-plugins-bad/commits/1.12/sys/uvch264/…
    • 确定问题和位置 - 尽管它说 mjpeg_demux.c 它处理所有相机流。需要仔细检查它是否到达。如果没有,会在这里发布补丁,但如果它来自 Gstreamer 团队会更好。
    • github.com/GStreamer/gst-plugins-bad/tree/master/sys/uvch264/… 有补丁 - 如果您查看第 662 行大约 30 行,您将看到对 h264 的影响。不确定您的镜像是否与主分支保持同步(7 天前提交)。
    • 谢谢马克-我现在在主人身上看到了。这确实看起来会起作用。我已经通过编写一个更正 DTS 的自定义元素解决了这个问题 - 当它发布时移动到 1.12 会很好。谢谢。
    【解决方案2】:

    我在使用 GStreamer 和 uvch264src 的 Logitech C920 上遇到了类似的问题。

    问题似乎是帧速率。天黑时,相机会降低帧率并延长曝光时间。这会产生更好的光照帧,但这种变化确实让 GStreamer 感到困惑。我尝试设置 fixed-framerate=true 和 framerate=30/1,但这并没有帮助。唯一有效的是禁用相机自动曝光功能。

    v4l2-ctl -d /dev/video0 -c exposure_auto_priority=0

    这并不理想(尤其是在您处理可变照明条件时),但至少流不会挂起并且音频和视频保持同步。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2012-10-18
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多