我使用以下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,但有没有办法播放我以前的文件?
由于
答案 0 :(得分:4)
不确定您的管道是否正确。
如果你想写一个文件,为什么不简单地使用filesink和filesrc。
fdsink> vid.bin将无法正常工作,因为如果你看到gstreamer gst-launch的打印件也会进入文件。 [只需在文本编辑器中打开vid.bin,你就会看到我的意思]。
另外,对于没有多路复用器的x264流存储,你需要在x264enc中使用byte-stream = 1将其存储为annexb格式,以便它可以解码。
要播放原始x264流,您需要在视频接收器之前安装一个色彩空间转换器
gst-launch filesrc location=inputfile ! legacyh264parse ! ffdec_h264 ! queue ! ffmpegcolorspace ! autovideosink
在我的结尾播放就好了
答案 1 :(得分:2)
或者,使用gstreamer 1.0播放原始h264文件:
gst-launch-1.0 filesrc location=/tmp/video.h264 ! h264parse ! avdec_h264 ! autovideosink