Я пытаюсь настроить конвейер для воспроизведения только видеопотока из файла OGG в Linux с использованием gstreamer-0.10. Мне нужно сделать это из командной строки с помощью утилиты 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
ОБНОВЛЕНИЕ: мне удалось воспроизвести только аудио поток, используя следующую команду:
$ 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). a>) и увидел демо-выполнение videotestsrc.
$ gst-launch-0.10 videotestsrc ! theoraenc ! oggmux ! oggdemux ! theoradec ! ffmpegcolorspace ! videoscale ! ximagesink
Кто-нибудь может объяснить, почему это работает? Казалось бы, это кодирует файл, мультиплексирует его, демультиплексирует, декодирует, а затем фильтрует/масштабирует его в приемник. Как это понять?