Как воспроизвести видеопоток из файла OGG с помощью gstreamer в Linux

Я пытаюсь настроить конвейер для воспроизведения только видеопотока из файла 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) и увидел демо-выполнение videotestsrc.

$ gst-launch-0.10 videotestsrc ! theoraenc ! oggmux ! oggdemux ! theoradec ! ffmpegcolorspace ! videoscale ! ximagesink

Кто-нибудь может объяснить, почему это работает? Казалось бы, это кодирует файл, мультиплексирует его, демультиплексирует, декодирует, а затем фильтрует/масштабирует его в приемник. Как это понять?


person linsek    schedule 17.12.2014    source источник


Ответы (2)


Если известно, что uridecodebin дает вам хороший видеоконвейер, и вы просто хотите его скопировать, вы можете попробовать следующее.

1) установить переменную окружения GST_DEBUG_DUMP_DOT_DIR.

export GST_DEBUG_DUMP_DOT_DIR=/tmp

2) Запустите команду gst-launch.

3) В /tmp вы должны увидеть файлы, подобные следующим

  • 0.00.00.010839464-gst-launch.NULL_READY.dot
  • 0.00.00.100795940-gst-launch.READY_PAUSED.dot
  • 0.00.00.104255451-gst-launch.PAUSED_PLAYING.dot
  • 0.00.00.988712046-gst-launch.PLAYING_READY.dot

4) Установите graphviz, если у вас его еще нет.

5) Запустите программу «dot», чтобы создать PNG-файл точного конвейера, используемого GStreamer. Возьмите за основу файл "PAUSED_PLAYING".

dot -Tpng 0.00.00.104255451-gst-launch.PAUSED_PLAYING.dot  -o /tmp/out.png
person mpr    schedule 18.12.2014

Это на самом деле не имеет смысла и совершенно неправильно :)

Вы захотите использовать:

gst-launch-0.10 uridecodebin uri=file:///path/to/demo.ogv ! ffmpegcolorspace ! autovideosink

для воспроизведения только части видео. Использование filesrc, конечно, не сработает, потому что вы попытаетесь отправить содержимое файлов, то есть что-то мультиплексированное и закодированное, для аудиоконвертирования, которое может работать только с необработанным звуком. Если вы хотите построить весь конвейер вручную, вы можете сделать следующее:

gst-launch-0.10 filesrc location=demo.ogv ! oggdemux ! theoradec ! ffmpegcolorspace ! autovideosink

В качестве примечания: вам следует использовать gstreamer 1.0, за исключением случаев, когда у вас есть очень веская причина не делать этого.

Ваше здоровье :)

person Mathieu_Du    schedule 17.12.2014
comment
Спасибо за ответ, но ни одна из этих команд на самом деле не работала. Первый вернул oggdemux0: Internal data stream error., а второй остановился на преролле, и мне пришлось нажать Ctrl+C, чтобы вернуться к консоли. В этой ситуации я работаю над встроенной системой, на которой установлен только gstreamer-0.10. Так что это мой единственный вариант прямо сейчас. - person linsek; 17.12.2014