我有一个用于 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
谁能解释我做错了什么?