在Raspberry Pi上使用gstreamer从h264流捕获JPEG

在Raspberry Pi上使用gstreamer从h264流捕获JPEG,gstreamer,raspberry-pi,openmax,Gstreamer,Raspberry Pi,Openmax,我有一个新的相机附加组件的树莓皮。它还不支持video4linux,但附带了一个可以输出1080p h264流的小程序。我已经验证了这一点,并通过以下方式将视频推送到stdout: raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - 我想处理这个流,这样我就可以得到每秒拍摄一次的视频快照 由于它是1080p,我需要使用rpi的硬件支持进行H264编码。我相信gstreamer是唯一支持这一点的应用程序,因此使用ffmpeg或avconv的解决方

我有一个新的相机附加组件的树莓皮。它还不支持video4linux,但附带了一个可以输出1080p h264流的小程序。我已经验证了这一点,并通过以下方式将视频推送到stdout:

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o -
我想处理这个流,这样我就可以得到每秒拍摄一次的视频快照

由于它是1080p,我需要使用rpi的硬件支持进行H264编码。我相信gstreamer是唯一支持这一点的应用程序,因此使用ffmpeg或avconv的解决方案将不起作用。我已经使用上的构建脚本制作了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启动管道,在stdin上拍摄视频,并每秒输出一个新的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标志设置为


谁能解释一下我做错了什么吗?

我们终于找到了解决办法。我的gstreamer管道基本上是正确的,但有两个问题使它无法正常工作:

  • raspivid不会将时间戳添加到它生成的h264帧中
  • gstreamer的最新版本有一个bug,它无法处理未压缩的帧
运行gstreamer的1.0版本(确保从头开始构建并删除以前尝试的所有痕迹),问题就会消失


有关邮件列表线程,请参阅。

我正在尝试做同样的事情。我还没有尝试让gstreamer工作,所以我会尝试一下,如果我有任何不同的结果,我会回信的。我也一直在与gstreamer-devel列表上的人交谈。看起来并不乐观:我听说raspivid的输出缺少时间戳,gstreamer需要这些时间戳来决定帧率。请参阅是否可以通过修改raspivid源代码来添加时间戳?或者它必须发生在GPU级别?这超出了我的知识范围。试着问一下rpi板上的jamesh,我想他会知道的。那个构建脚本似乎已经不存在了,有人镜像了吗?你有一个可以用于测试的树莓Pi的gstreamer二进制文件副本吗?它与其他一些东西相关联,所以我怀疑它能否在旅途中幸存下来。但我已经将构建脚本放在了pastebin上;这将为您提供一个类似于我的工作构建。