在黑暗中从Logitech C920捕获时,uvch264src停止

时间:2016-11-19 21:32:30

标签: raspberry-pi gstreamer h.264 logitech

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

  • Raspberry Pi 3
  • Class 10 Sandisk 8GB sdcard
  • Raspbian Jessie,全部更新
  • 罗技C920 USB 2网络摄像头
  • Gstreamer 1.8从源代码编译
  • 没有其他USB外围设备或设备
  • 2A Apple USB电源(iPad充电器)
  • 使用和不使用有源USB集线器进行测试以连接C920

它捕获H264素材(H264.720@24FPS)。 我的管道采用了C920的H264编码输出,并开发了它。它还捕获(alsa)C920的音频,将其压缩到AAC,然后发球。两个发球台的一条腿直接进入FLV复用器,然后进入磁盘进行备份。 T恤的第二段被解码(使用OpenMax),然后以较低的比特率(再次,OpenMax)重新压缩,最后,FLV复用,并推送到RTMP服务器进行实时查看。

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

enter image description here

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),并重新运行测试。这次它没有完全停止,但是我得到了“无法快速录制音频”的警告,并且生成的文件有明显的音频丢失。

所以 - 看来,Logitech C920在黑暗的环境中似乎有点窒息。

我注意到的其他事情,不确定这是否相关......但我的录音中总是有一些振荡的高频噪音(约16khz)。如果我把相机拿到耳边,我实际上可以听到相机发出的相同音调。如果我遮住相机上的镜头,音调就会停止。如果我关闭相机的自动对焦,并将绝对对焦水平设置为“0”,那么噪音几乎也会消失。 我知道这不是一个哑巴相机,因为我有大约6个,他们都表现得一样。我也知道这不是一个糟糕的Raspberry Pi,因为我已经尝试过所有这些

  • 3 * Raspberry Pi 3
  • 1 * Raspberry Pi 2 B +
  • 2 * Raspberry Pi B +

有人可以对此有所了解吗?

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

附加说明:

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

2 个答案:

答案 0 :(得分:2)

有一个解决方案被推到最新的1.12 Gstreamer版本,即使相机处于很长(黑色)曝光时,也会强制帧进入缓冲区。我们遇到了类似的问题,并提出了补丁。 查看Gstreamer freedesktop网站。 您可能需要从源代码重新编译gstreamer-plugins-bad或等到debian实验包装处理它。您需要的文件是libgstuvch264.so,而uograde是sys / uvch264src子文件夹中的mjpeg_demux.c。 请注意,修复程序只有5-6天。

答案 1 :(得分:0)

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

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

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

它并不理想(特别是如果您处理可变照明条件),但至少流不会挂起,音频和视频保持同步。