我正在尝试设置一个管道,使用gstreamer-0.10在Linux中播放来自OGG文件的视频流。我需要使用gst-launch实用程序从命令行执行此操作。我可以使用以下命令成功播放音频和视频流:
$ gst-launch-0.10 playbin uri=file:///projects/demo.ogv
我还可以使用以下命令设置管道以播放视频测试文件:
$ gst-launch-0.10 videotestsrc ! autovideosink
但我似乎无法将适当的管道拼凑起来播放来自OGG分路器的视频流。
根据gstreamer文档(图3 - http://docs.gstreamer.com/display/GstSDK/Basic+tutorial+3%3A+Dynamic+pipelines),OGG解复用器视频接收器应为src_02。这似乎得到了gst-inspect命令的支持:
$ gst-inspect oggdemux
...
Pad Templates:
SRC template: 'src_%d'
Availability: Sometimes
Capabilities:
ANY
SINK template: 'sink'
Availability: Always
Capabilities:
application/ogg
application/x-annodex
...
根据关于指定打击垫(http://docs.gstreamer.com/display/GstSDK/Basic+tutorial+10%3A+GStreamer+tools)的本教程,我相信我从我的文件播放视频流的命令如下所示:
$ gst-launch-0.10 filesrc location=demo.ogv ! oggdemux name=d d.src_02 ! theoradec ! autovideosink
但这些是我的跑步结果。一切似乎挂起“预卷”,我需要用Ctrl + C打断以返回命令行:
$ gst-launch-0.10 filesrc location=demo.ogv ! oggdemux name=d d.src_02 ! theoradec ! autovideosink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
^C
Caught interrupt -- handling interrupt.
Interrupt: Stopping pipeline ...
(gst-launch-0.10:7625): GLib-CRITICAL **: Source ID 1 was not found when attempting to remove it
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
有什么想法吗?
也可能具有洞察力:
$ gst-typefind-0.10 demo.ogv
demo.ogv - application/x-annodex
$ gst-discoverer-0.10 demo.ogv
Analyzing file:///projects/keypr/demo.ogv
Done discovering file:///projects/keypr/demo.ogv
Topology:
container: Ogg
audio: Vorbis
video: Theora
Properties:
Duration: 0:00:05.546666666
Seekable: yes
Tags:
container format: Ogg
application name: ffmpeg2theora-0.26
extended comment: SOURCE_OSHASH=d1af78a82e61d18f
encoder: Xiph.Org libtheora 1.1 20090822 (Thusnelda)
encoder version: 0
nominal bitrate: 110000
bitrate: 110000
video codec: Theora
audio codec: Vorbis
更新:我可以使用以下命令播放 audio 流:
$ gst-launch-0.10 uridecodebin uri=file:///path/to/demo.ogv ! audioconvert ! autoaudiosink
请注意,使用filesrc location=demo.ogv
时无效。只有当我使用uridecodebin时。我仍然无法隔离视频流。
更新2:我偶然发现了一个隔离并播放视频流的管道,但我不明白:
$ gst-launch-0.10 uridecodebin uri=file:///path/to/demo.ogv ! theoraenc ! oggmux ! oggdemux ! theoradec ! ffmpegcolorspace ! videoscale ! ximagesink
我在冲浪时发现它(http://wiki.laptop.org/go/GStreamer/Developers)并看到了videotestsrc的演示执行。
$ gst-launch-0.10 videotestsrc ! theoraenc ! oggmux ! oggdemux ! theoradec ! ffmpegcolorspace ! videoscale ! ximagesink
任何人都可以解释为什么这有效吗?这似乎编码文件,复用它,解复用它,解码它,然后过滤/缩放到接收器。这有什么意义呢?
答案 0 :(得分:1)
如果知道uridecodebin为您提供了良好的视频管道,并且您只想复制它,则可以尝试以下操作。
1)设置环境变量GST_DEBUG_DUMP_DOT_DIR。
export GST_DEBUG_DUMP_DOT_DIR=/tmp
2)运行你的gst-launch命令。
3)在/ tmp中你应该看到如下文件
4)如果您还没有图表,请安装graphviz。
5)运行" dot"程序创建GStreamer使用的确切管道的PNG文件。基于" PAUSED_PLAYING"文件。
dot -Tpng 0.00.00.104255451-gst-launch.PAUSED_PLAYING.dot -o /tmp/out.png
答案 1 :(得分:0)
这实际上没有意义,完全错了:)
您将要使用:
gst-launch-0.10 uridecodebin uri=file:///path/to/demo.ogv ! ffmpegcolorspace ! autovideosink
仅播放视频部分。使用filesrc当然不会起作用,因为你会尝试将文件的内容发送到audioconvert,这只能处理原始音频。如果你想手工构建整个管道,你可以这样做:
gst-launch-0.10 filesrc location=demo.ogv ! oggdemux ! theoradec ! ffmpegcolorspace ! autovideosink
作为附注,你应该使用gstreamer 1.0,除非你有充分的理由不这样做。
干杯:)