Вы когда-нибудь задумывались о том как работают Gnome-плееры, такие как Totem, Rhythmbox или Banshee? Наверное каждый из вас в новоустановленной Ubuntu, при попытке проиграть AVI-шку видел сообщение о необходимости установить дополнительный пакет gst-ffmpeg или gst-plugins-ugly. Под катом — моя попытка прояснить свет на то, как работает этот мультимедийный фреймворк и на что он способен.
Основное отличие от VLC или FFmpeg в том, что первоначально среда разрабатывалась не для определённого приложения, а для всех программ, которые могут работать с мультимедиа. Данный фреймворк интегрирован в такие языки: С, С++/Qt, Python, Ruby, Perl.
Для решения таких задач, как перекодирование фильма в другой формат, большую популярность имеют такие программы как mencoder или VLC. Но сделать то-же самое при помощи GStreamer — не на много сложнее.
Ниже представлены примеры для Linux, демонстрирующие возможности фреймворка. В этих примерах мы будем использовать основные программы gst-launch и gst-inspect — чем-то напоминающие Windows-приложение GraphEdit. Для тех, кому нужна графическая оболочка — есть gst-editor. Но учтите, что эти программы предназначены для отладки, поэтому не ожидайте от них удобства в использовании.
Для начала работы с GStreamer необходимо уяснить некоторые понятия:
В классическом виде мы получаем такого вида цепочку: source -> parser -> decoder -> filter -> sink.
Если вам лень собирать всю цепочку кодеков и мультиплексоров вручную, GStreamer может сделать это за вас:
Элемент «playbin» сам разбирает файл, находит нужный кодек и элемент вывода. Всё что нужно — указать путь к файлу, который нужно проиграть. Если-же вам интересно какой элемент за что отвечает, вы можете запустить gst-inspect и увидеть все доступные элементы, а «gst-inspect lame» — покажет парамерты mp3-кодера. Так-же стоит отметить полезность элемента «decodebin2», который сам находит нужный декодер.
Простейший аудиоплеер:
Простейший аудиоплеер (выбираем кодек вручную, и согласовываем форматы):
Плеер посложнее (со звуком и видео):
Если вам нужно перекодировать AVI-файл в MOV, можно воспользоваться следующей командой:
Хочется сделать вещание, одновременно с записью в файл и отображением на экране вещаемого видео? Без проблем:
Любители повещать во флеше — тоже не остались в стороне, благодаря librtmp (надо пересобрать пакет gst-plugins-bad):
Так-же разработчики позаботились об использовании «родных» мультимедийных фреймворков (QuickTime/DirectShow), если вы используете MacOS или Windows, благодаря «мостам».
Ну и в заключение хочется сказать, что есть немало проблем, которые ещё предстоит решить разработчикам (рассинхронизации, проблемы с утечками памяти и производительности). Большинство из них связано с использованием сторонних библиотек, которые не всегда качественно написаны. Вот поэтому разработчики и придумали интересный приём — плагины разделены на 5 категорий:
Основное отличие от 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 — Отдельный набор кодеков «всё в одном».
Хозяйке на заметку (источники):
- GStreamer features
- Live stream with GStreamer примеры для gst-launch
- Howto
- GStreamer, RTP and live streaming, примеры для python
- Коллекции платных кодеков
- Hello World GStreamer на языке С