我正在使用gstreamer 1.0,当我问它的版本号时,它告诉我gst-launch-1.0版本1.6.0。根据有关注入元数据的文档(http://wiki.oz9aec.net/index.php/Gstreamer_cheat_sheet),此版本支持注入KLV元数据,我不需要应用任何补丁。
最终,我想从一个名为fifo的数据库中注入元数据,但就目前而言,我很乐意让它从常规文件中运行。我已经尝试了很多不同的配置,但是每个配置总是给我带来相同的错误。没有变得复杂,我开始尝试做这样的事情:
gst-launch-1.0 mpegtsmux name=mux filesrc location=textfile ! application/x-metadata,standard=klv ! mux.metadata0 mux. ! filesink location=x.avi
实际上,文档有点令人困惑,所以如果我应该使用“mux.metadata0”(基于我见过的错误消息),“mux.metadata_0”,那么在汇总到多路复用器的元数据时就不清楚了,或字面意思是“mux.metadata_%d”。我尝试了所有这些。我总是得到这个错误(没有别的):
WARNING: erroneous pipeline: could not link filesrc0 to mux
除非我在多路复用器之前放置一个队列,如下所示:
gst-launch-1.0 mpegtsmux name=mux filesrc location=textfile ! application/x-metadata,standard=klv ! queue ! mux.metadata0 mux. ! filesink location=x.avi
然后它告诉我:
WARNING: erroneous pipeline: could not link queue0 to mux
所以似乎问题在于将元数据放入多路复用器,而不是从文件中获取。
当然,我最终想要与实际视频进行多路复用,所以我尝试了包含进入多路复用器的视频源的命令行。类似的错误。我试过插入队列。我已经尝试删除“application / x-metadata,standard = klv”,我尝试用其他示例中的'meta / x-klv'替换它。我试图找出元数据应该通过的某种“编码器”。
我也试过直接将元数据注入到多路复用器中,如下所示:
gst-launch-1.0 filesrc location=textfile blocksize=1 ! mpegtsmux ! filesink location=x.avi
这给了我一个更长的错误信息:
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
(gst-launch-1.0:10927): GStreamer-CRITICAL **: gst_segment_to_running_time_full: assertion 'segment->format == format' failed
ERROR: from element /GstPipeline:pipeline0/MpegTsMux:mpegtsmux0: Could not create handler for stream
Additional debug info:
/home/oren/var-som-mx6-yocto-jethro/build_x11/tmp/work/cortexa9hf-vfp-neon-mx6qdl-poky-linux-gnueabi/gstreamer1.0-plugins-bad/1.6.0-r0/gst-plugins-bad-1.6.0/gst/mpegtsmux/mpegtsmux.c(811): mpegtsmux_create_streams (): /GstPipeline:pipeline0/MpegTsMux:mpegtsmux0
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
我在想,也许它不喜欢没有视频源,所以我尝试了这个:
gst-launch-1.0 filesrc location=textfile blocksize=1 ! mpegtsmux name=mux ! filesink location=x.avi imxv4l2src ! queue ! vpuenc_h264 ! mux.
但我得到了这个:
====== IMXV4L2SRC: 4.0.9 build on Jun 14 2016 14:30:22. ======
Setting pipeline to PAUSED ...
[INFO] Product Info: i.MX6Q/D/S
====== VPUENC: 4.0.9 build on Jun 14 2016 14:30:32. ======
wrapper: 1.0.65 (VPUWRAPPER_ARM_LINUX Build on Jun 14 2016 14:11:21)
vpulib: 5.4.33
firmware: 3.1.1.46072
(gst-launch-1.0:12249): GStreamer-CRITICAL **: gst_segment_to_running_time_full: assertion 'segment->format == format' failed
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
[INFO] ringBufferEnable 0, chromaInterleave 0, mapType 0, linear2TiledEnable 0
ERROR: from element /GstPipeline:pipeline0/MpegTsMux:mux: Could not create handler for stream
Additional debug info:
/home/oren/var-som-mx6-yocto-jethro/build_x11/tmp/work/cortexa9hf-vfp-neon-mx6qdl-poky-linux-gnueabi/gstreamer1.0-plugins-bad/1.6.0-r0/gst-plugins-bad-1.6.0/gst/mpegtsmux/mpegtsmux.c(811): mpegtsmux_create_streams (): /GstPipeline:pipeline0/MpegTsMux:mux
Execution ended after 0:00:00.661556333
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
我要插入的元数据将采用KLV格式(如果我错了,请纠正我),我必须以这种方式预先格式化。但是文档很清楚,mux只是盲目地将你提供的任何东西插入到容器中,所以我可以把明文放在那里,我可以在另一端提取它。
任何人都可以帮我弄清楚如何通过多路复用器成功注入元数据吗?
感谢。
P.S。我真的没有尝试为这个嵌入式系统构建更新版本的gstreamer。如果可能的话,我需要使用已安装的gstreamer版本。