1

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

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

它捕获 H264 素材 (H264.720@24FPS)。我的流水线采用 C920 的 H264 编码输出,然后进行开球。它还捕获(alsa)C920 的音频,将其压缩为 AAC,然后就可以了。两个 T 恤的一条腿直接进入 FLV 多路复用器,然后放到磁盘上进行备份。发球台的第二段被解码(使用 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 会做一些有趣的事情……在相机处于黑暗中时,生成的视频文件似乎已经丢掉了很多帧……所以一旦它再次亮起,视频就会比音频领先几秒钟。
4

2 回答 2

2

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

于 2017-05-25T05:01:33.093 回答
0

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

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

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

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

于 2017-03-08T16:36:57.023 回答