0

我使用以下 GStreamer 管道将我的编码流存储在二进制文件中:

gst-launch v4l2src ! videorate ! video/x-raw-yuv, framerate=\(fraction\)10/1 \
  ! videoscale ! video/x-raw-yuv, format=\(fourcc\)I420,  width=640, height=480\
  ! ffmpegcolorspace ! x264enc ! fdsink > vid.bin

现在我想使用以下管道在 GStreamer 中播放以前录制的文件:

cat vid.bin | gst-launch fdsrc ! ffdec_h264 ! autovideosink

但随后它给出了以下错误:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640: Internal GStreamer error: negotiation problem.  Please file a bug at http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer.
Additional debug info:
gstffmpegdec.c(2804): gst_ffmpegdec_chain (): /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640:
ffdec_h264: input format was not set before data start
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

我知道捕获视频的最佳方法是使用 Muxers,但有什么方法可以播放我以前的文件吗?

谢谢

4

2 回答 2

4

不确定您的管道是否正确。

如果您想写入文件,为什么不简单地使用 filesink 和 filesrc。

fdsink > vid.bin 将无法正常工作,因为如果您看到 gstreamer 的打印,gst-launch 也会进入文件。[只需在文本编辑器中打开 vid.bin,您就会明白我的意思]。

此外,要在没有复用器的情况下存储 x264 流,您需要在 x264enc 中使用 byte-stream=1 以附件b 格式存储它,以便可解码。

要播放原始 x264 流,您需要在视频接收器之前有一个色彩空间转换器

gst-launch filesrc location=inputfile ! legacyh264parse ! ffdec_h264 ! queue ! ffmpegcolorspace ! autovideosink

在我这里玩得很好

于 2012-10-03T17:11:42.163 回答
2

或者,使用 gstreamer 1.0 播放原始 h264 文件:

gst-launch-1.0 filesrc location=/tmp/video.h264 ! h264parse ! avdec_h264 ! autovideosink
于 2014-09-09T08:08:12.703 回答