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

    Вы когда-нибудь задумывались о том как работают 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 на языке С
    Поделиться публикацией

    Комментарии 15

      +11
      С ugly плагинами проблемы скорее правого характера, нежели технического.
      Качество-то у них хорошее, но с патентной и лицензионной чистотой не всё понятно.
        +1
        Т.е. это такой аналог Microsoft DirectShow?
          +2
          кроссплатформенный аналог. который в том числе умеет использовать и directshow.
          +2
          Больше похоже на FreeBSD netgraph для мультимедиа.
            +6
            >Данный фреймворк интегрирован в такие языки: С, С++/Qt, Python, Ruby, Perl.
            Быр-быр-быр… Интерпретатор/компилятор содержит в себе GStreamer, есть в стандартной библиотеки или упоминается в стандарте языка?
            Думаю лучше «предоставляет биндинги», «имеет привязки».
              0
              Что мне в gstreamer недостаёт — так это фильтра с растерайзером субтитров ASS.
                0
                Эх, кто бы придумал как кодирование VP6 прикрутить к ffmpeg :-(
                  0
                  люди писали, что уже придумано
                  правда, через mencoder, win32codecs и передачу настроек кодирования кодеку напрямую.
                  а вообще же есть свободный vp8. или он не подходит?
                    0
                    Помню, когда ещё была контора on2, они выпускали бинарь (размером ~15Мб) который демонизировался и через сокеты получал-отдавал VP6. И оно даже работало (если память не изменяет с FFmpeg). Вот только немогу понять: зачем VP6, если даже во флешь-плеерах уже H264? Вижу причину только в возможных проблемах с лицензионностью.
                      0
                      а я работал с этой приблудой. flix encoder называлось. там под капотом был как раз mencoder с кастомным кодеком.
                      стоимость — от $3К/сервер.
                  +1
                  На Linux свет клином не сошёлся. GStreamer — кросс-платформенный фреймворк — отлично работает на FreeBSD без всякой эмуляции Linux ABI.
                    0
                    Раз так, то на DirectShow свет клином не сошёлся. Эта статья — лишь интро в этот фреймворк, с которым мне пришлось столкнуться, ихучая воэможности аппаратной платформы DaVinci от Texas Instruments. Кстати, у меня назревает новая статья о LeopardBoard.
                      0
                      Везет вам, у вас уже все работает на DaVinci, мне же сейчас приходится портировать gstreamer на свою борду и писать плагины для использования всех хардварных энкодеров/декодеров/транскодеров.
                        0
                        А что за борд, если не секрет? Я в своё время пытался что-то толковое сделать из MG1264/MG3500 от Maxim. Но там с документацией всё очень плохо. Да и железки так-себе, ожидал большего.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое