Pull to refresh

GStreamer: кодеки с привкусом Linux

Reading time 4 min
Views 39K
Вы когда-нибудь задумывались о том как работают Gnome-плееры, такие как Totem, Rhythmbox или Banshee? Наверное каждый из вас в новоустановленной Ubuntu, при попытке проиграть AVI-шку видел сообщение о необходимости установить дополнительный пакет gst-ffmpeg или gst-plugins-ugly. Под катом — моя попытка прояснить свет на то, как работает этот мультимедийный фреймворк и на что он способен.

Основное отличие от VLC или FFmpeg в том, что первоначально среда разрабатывалась не для определённого приложения, а для всех программ, которые могут работать с мультимедиа. Данный фреймворк интегрирован в такие языки: С, С++/Qt, Python, Ruby, Perl.

GStreamer позволяет создавать приложения, которые способны:

  • Принимать и передавать аудио-видео, используя практически любой протокол: HTTP, RTSP/RTP, MMS, RTMP и другие.
  • Разбирать/Собирать потоки в разных форматах: MPEG,AVI,ASF,FLV,MKV и другие.
  • Вытягивать и вставлять метаданные в файлах.
  • Декодировать/Кодировать потоки практически в любой комбиации кодеков.
    При этом можно использовать не только open-source решения (libavcodec, libmp3lame, libfaac), но и проприетарные, которые можно купить. Так-же можно задействовать декодеры с аппаратной поддержкой c использованием технологий CUDA/VAAPI/CrystalHD.
  • Выводить потоки на экран или звуковую карту, используя самые разнообразные решения, начиная от DirectFB, и заканчивая X-ами.

Для решения таких задач, как перекодирование фильма в другой формат, большую популярность имеют такие программы как mencoder или VLC. Но сделать то-же самое при помощи GStreamer — не на много сложнее.

Ниже представлены примеры для Linux, демонстрирующие возможности фреймворка. В этих примерах мы будем использовать основные программы gst-launch и gst-inspect — чем-то напоминающие Windows-приложение GraphEdit. Для тех, кому нужна графическая оболочка — есть gst-editor. Но учтите, что эти программы предназначены для отладки, поэтому не ожидайте от них удобства в использовании.

Для начала работы с GStreamer необходимо уяснить некоторые понятия:
  • element — Элемент-объект GStreamer'а, который может принимать/отправлять данные.
  • source — Генерирует поток (файл, поток или устройство).
  • filter — Элемент, который трансформирует поток (парсеры, мультиплексоры, кодеки).
  • sink — Принимает поток и не перенаправляет его.
  • pipeline — Коллекция соединённых между собой элементов.

В классическом виде мы получаем такого вида цепочку: source -> parser -> decoder -> filter -> sink.

Если вам лень собирать всю цепочку кодеков и мультиплексоров вручную, GStreamer может сделать это за вас:

$ gst-launch playbin uri=file:///home/me/audo.mp3


Элемент «playbin» сам разбирает файл, находит нужный кодек и элемент вывода. Всё что нужно — указать путь к файлу, который нужно проиграть. Если-же вам интересно какой элемент за что отвечает, вы можете запустить gst-inspect и увидеть все доступные элементы, а «gst-inspect lame» — покажет парамерты mp3-кодера. Так-же стоит отметить полезность элемента «decodebin2», который сам находит нужный декодер.

Простейший аудиоплеер:

$ gst-launch filesrc location=audio.mp3 ! decodebin2 ! alsasink


Простейший аудиоплеер (выбираем кодек вручную, и согласовываем форматы):

$ gst-launch filesrc location=audio.mp3 ! mad ! audioconvert ! audioresample ! alsasink


Плеер посложнее (со звуком и видео):

$ gst-launch filesrc location=audovideofile.mpeg ! decodebin2 name=decoder \
decoder. ! ffmpegcolorspace ! xvimagesink \
decoder. ! audioconvert ! audioresample ! alsasink


Если вам нужно перекодировать AVI-файл в MOV, можно воспользоваться следующей командой:

$ gst-launch-0.10 filesrc location=film.avi ! \
decodebin2 name=decoder { qtmux name=muxer ! filesink location=film.mov } \
{ decoder. ! ffmpegcolorspace ! jpegenc ! queue ! muxer. } \
{ decoder. ! queue ! audioconvert ! queue ! muxer. }


Хочется сделать вещание, одновременно с записью в файл и отображением на экране вещаемого видео? Без проблем:

$ gst-launch v4l2src ! queue ! \
ffmpegcolorspace ! tee name=t1 ! \
queue ! xvimagesink sync=false t1. ! \
queue ! theoraenc quality=1 ! \
queue ! oggmux name=mux \
alsasrc ! audio/x-raw-int,rate=8000,channels=1,depth=8 ! \
queue ! audioconvert ! vorbisenc ! \
queue ! mux. mux. ! \
queue ! tee name= t ! \
queue ! filesink location=test.ogg t. ! \
queue ! shout2send ip=<наш-icecast-сервер> port=8000 password=hackme


Любители повещать во флеше — тоже не остались в стороне, благодаря librtmp (надо пересобрать пакет gst-plugins-bad):

$ gst-launch v4l2src ! \
queue ! ffmpegcolorspace ! ffenc_flv ! \
queue ! flvmux name=muux is-live=true ! \
rtmpsink location='rtmp://localhost/path/to/stream live=1' \
alsasrc ! audio/x-raw-int,rate=22050,channels=1,depth=16 ! \
queue ! audioconvert ! lame bitrate=48 ! \
queue ! muux.


Так-же разработчики позаботились об использовании «родных» мультимедийных фреймворков (QuickTime/DirectShow), если вы используете MacOS или Windows, благодаря «мостам».

Ну и в заключение хочется сказать, что есть немало проблем, которые ещё предстоит решить разработчикам (рассинхронизации, проблемы с утечками памяти и производительности). Большинство из них связано с использованием сторонних библиотек, которые не всегда качественно написаны. Вот поэтому разработчики и придумали интересный приём — плагины разделены на 5 категорий:
  • gst-plugins-base — Основные плагины, идущие в комплекте: CDDA, RTP, RTSP, ogg, theora, vorbis, Xvideo, V4L.
  • gst-plugins-good — Плагины, не вызываюшие сомнения в своей надёжности: FLAC, speex, JPEG, PNG.
  • gst-plugins-bad — Рабчие, но возможны проблемы: VP8, XVID, FAAC, dirac, RTMP, VDPAU, DirectShow.
  • gst-plugins-ugly — Не обойтись без проблем при использовании: ASF, real, DVDSub, a52, AMR, x264.
  • gst-ffmpeg — Отдельный набор кодеков «всё в одном».


Хозяйке на заметку (источники):

  1. GStreamer features
  2. Live stream with GStreamer примеры для gst-launch
  3. Howto
  4. GStreamer, RTP and live streaming, примеры для python
  5. Коллекции платных кодеков
  6. Hello World GStreamer на языке С
Tags:
Hubs:
+61
Comments 15
Comments Comments 15

Articles