2

我有一个用于 Raspberry Pi 的新相机插件。它还没有 video4linux 支持,但带有一个小程序,可以输出 1080p h264 流。我已经验证了这项工作,并通过以下方式将视频推送到标准输出:

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o -

我想处理这个流,最终得到每秒拍摄一次的视频快照。

由于它是 1080p,我需要使用 rpi 对 H264 编码的硬件支持。我相信 gstreamer 是唯一支持此功能的应用程序,因此使用 ffmpeg 或 avconv 的解决方案将不起作用。我已经使用http://www.trans-omni.co.uk/pi/GStreamer-1.0/build_gstreamer上的构建脚本来制作 gstreamer 和用于硬件 H264 编码的插件,它似乎可以工作:

root@raspberrypi:~/streamtest# GST_OMX_CONFIG_DIR=/etc/gst gst-inspect-1.0 | grep 264
...
omx:  omxh264enc: OpenMAX H.264 Video Encoder
omx:  omxh264dec: OpenMAX H.264 Video Decoder

所以我需要构建一个 gst-launch 管道,在标准输入上获取视频并每秒吐出一个新的 jpeg。我知道我可以使用 gstreamer 的“multifilesink”接收器来执行此操作,因此提出了以下简短脚本来启动它:

root@raspberrypi:~/streamtest# cat test.sh
#!/bin/bash

export GST_OMX_CONFIG_DIR=/etc/gst

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - |  \
gst-launch-1.0 fdsrc fd=0 ! decodebin ! videorate ! video/x-raw,framerate=1/1 ! jpegenc ! multifilesink location=img_%03d.jpeg

麻烦的是它不起作用:gstreamer 只是永远处于预滚动状态,从不吐出我宝贵的 jpeg。

root@raspberrypi:~/streamtest# ./test.sh
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
[waits forever]

如果使用 gstreamer 的 -v 标志集的有用输出位于http://pastebin.com/q4WySu4L

谁能解释我做错了什么?

4

1 回答 1

2

我们终于找到了解决这个问题的方法。我的 gstreamer 管道大部分是正确的,但有两个问题结合在一起阻止了它的工作:

  • raspivid 不会向它产生的 h264 帧添加时​​间戳
  • 最新版本的 gstreamer 有一个错误,会阻止它处理无时间戳的帧

运行 gstreamer 的 1.0 版本(确保从头开始构建并删除以前尝试的所有痕迹),问题就消失了。

有关邮件列表线程,请参阅http://gstreamer-devel.966125.n4.nabble.com/Capturing-jpegs-from-an-h264-stream-tt4660254.html

于 2013-06-09T21:52:50.840 回答