Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фреймворк GStreamer. Руководство разработчика приложений. Программные компоненты для проигрывания мультимедийного потока

Оригинал: GStreamer Application Development Manual
Авторы: Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, Stefan Kost
Дата публикации: 21 мая 2014 г.
Перевод: А.Панин
Дата перевода: 22 июня 2014 г.

Часть IV. Более высокоуровневые интерфейсы для приложений на основе фреймворка GStreamer

В двух предыдущих частях мы узнали много нового о внутренних механизмах и соответствующих им низкоуровневых интерфейсах фреймворка GStreamer, предназначенных для разработки приложений. Многие разработчики, однако, не испытывают потребности в таких механизмах управления (использование которых приводит к увеличению объема кода приложения) и предпочитают использовать стандартный интерфейс проигрывания мультимедийных потоков, который выполняет большую часть сложных внутренних операций за них. В данной части мы познакомим вас с концепцией автоматической подгрузки модулей, управления элементами для проигрывания мультимедийного потока и другими подобными вещами. Эти высокоуровневые интерфейсы предназначены для упрощения процесса разработки приложений на основе фреймворка GStreamer. Однако, они также снижают гибкость фреймворка. Выбор используемого при разработке приложения интерфейса полностью зависит от предпочтений разработчика приложения.

Глава 20. Программные компоненты для проигрывания мультимедийного потока

Фреймворк GStreamer содержит некоторые высокоуровневые программные компоненты, предназначенные для упрощения жизни разработчика приложения. Все обсуждаемые здесь программные компоненты (на данный момент) предназначены исключительно для проигрывания мультимедийных потоков. Идея, положенная в основу каждого из них, заключается в реализации как можно более плотной интеграции с конвейером фреймворка GStreamer наряду с сокрытием сложностей, связанных с определением типа мультимедийного потока и некоторыми другими достаточно сложными аспектами, которые обсуждались нами в Части III, "Сложные концепции фреймворка GStreamer".

На данный момент мы рекомендуем разработчикам использовать либо элемент playbin (подробно описанный в разделе под названием "Элемент playbin"), либо элемент decodebin (подробно описанный в разделе под названием "Элемент decodebin") в зависимости от их потребностей. Элемент playbin является рекомендуемым решением для выполнения всех операций, связанных с простым проигрыванием мультимедийных потоков, которое просто работает. Элемент decodebin является более гибким элементом для автоматической подгрузки модулей, который может использоваться в тех случаях, когда необходим больший набор возможностей, таких, как поддержка списков воспроизведения, сведение аудиотреков и т.д. При этом программный интерфейс данного элемента является более низкоуровневым, чем программный интерфейс элемента playbin.

20.1. Элемент playbin

Элемент playbin является элементом, который может создаваться с помощью стандартного API фреймворка GStreamer (т.е., функции gst_element_factory_make ()). Для упрощения фабрика элементов названа "playbin". Реализованный в виде подкласса класса GstPipeline (а следовательно и GstElement), элемент playbin автоматически поддерживает все возможности данного класса, включая обработку ошибок, поддержку тэгов, обработку состояний, получение позиций в потоке, перемещение в потоке, и т.д.

Настройка конвейера элемента playbin заключается в простом создании экземпляра элемента playbin, установке пути к ресурсу с использованием свойства "uri" объекта элемента и последующем переводе элемента в состояние "проигрывается" (GST_STATE_PLAYING) (при установке пути к ресурсу должна использоваться корректная строка URI в формате "<протокол>://<путь>", например, file:///tmp/my.ogg или http://www.example.com/stream/ogg). Внутренние механизмы элемента playbin настроят конвейер для проигрывания мультимедийного потока, полученного от ресурса с заданным путем.

Элемент playbin реализует несколько возможностей, которые мы обсуждали ранее:
  • Возможность указания элементов для вывода видео- и аудиопотоков (с использованием свойств "video-sink" и "audio-sink" соответственно).
  • Возможности управления элементом и отслеживания его состояния, по большей части аналогичные возможностям элементов на основе класса GstElement, включая обработку ошибок, обработку событий окончания потока, обработку тэгов, обработку состояний (посредством шины сообщений на основе класса GstBus), обработку позиции и возможность перемещения в мультимедийном потоке.
  • Возможность буферизации данных из сетевых источников с отправкой уведомлений о заполнении буфера посредством шины сообщений на основе класса GstBus.
  • Поддержку эффектов визуализации для аудиопотоков.
  • Поддержку субтитров, находящихся как непосредственно в мультимедийном потоке, так и в отдельных файлах. В случае использования отдельных файлов для хранения субтитров, следует использовать свойство элемента "suburi".
  • Поддержку функций выбора и отключения потоков данных. В том случае, если ваш мультимедийный поток содержит множество аудиопотоков или потоков данных субтитров, вы можете динамически выбрать поток, который следует проигрывать или принять решение об отключении всех потоков (что особенно полезно для отключения субтитров). Для выполнения каждого из описанных действий следует использовать свойство "current-text" и другие подобные свойства элемента.

Еще одной полезной функцией является возможность проверки работы элемента "playbin" из командной строки с помощью команды "gst-launch-1.0 playbin uri=file:///путь/к/файлу".

20.2. Элемент decodebin

Элемент decodebin является элементом для автоматической подгрузки плагинов, который используется элементом playbin, описанным в предыдущем разделе. Если говорить кратко, элемент decodebin будет принимать данные от источника, связанного с его входной точкой соединения, и попытается определить типы потоков, содержащихся в исходном потоке мультимедийных данных, а также установить связи с декодерами для каждого из этих потоков. При этом он будет автоматически выбирать декодеры. Для каждого декодированного потока он будет генерировать сигнал "pad-added", который сообщит клиенту об обнаружении нового декодированного потока. Для потоков, тип которых не удалось определить (причем таким потоком может быть и весь исходный поток данных), он будет генерировать сигнал "unknown-type". После этого ответственность за передачу сообщения об ошибке пользователю ложится на приложение.

Элемент decodebin по аналогии с элементом playbin реализует следующие возможности:
  • Декодирование неограниченного количества элементарных потоков с выводом результирующих данных посредством выходных точек соединения.
  • Возможность работы как и с любым элементом типа GstElement во всех ситуациях, включая передачу информации о тэгах или ошибках, а также обработку состояний.
Хотя элемент decodebin и реализует качественный механизм автоматической подгрузки плагинов, существует большое количество функций, которые он не может выполнять и для выполнения которых он не предназначен:
  • Обработка входных потоков мультимедийных данных с носителей известных типов (т.е., работа с DVD, аудио-CD или другими подобными носителями информации).
  • Выбор элементарных потоков (например, выбор аудиопотока, который должен проигрываться в случае воспроизведения мультимедийных потоков с множеством языков).
  • Наложение субтитров на выводимый декодированный видеопоток.

Элемент decodebin может быть просто протестирован из командной строки с помощью команды gst-launch-1.0 filesrc location=file.ogg ! decodebin ! audioconvert ! audioresample ! autoaudiosink.

20.3. Элемент URIDecodebin

Элемент uridecodebin очень похож на элемент decodebin, за исключением того, что он автоматически подключает плагин для доступа к источнику данных, описанному в переданной строке URI.

Элемент uridecodebin также будет автоматически добавлять в конвейер элементы буферизации в том случае, если в строке URI описывается медленный сетевой источник. Элемент буферизации отправляет сообщения BUFFERING, которые должны обрабатываться приложением таким образом, как описано в Главе 15, "Буферизация". Следующие свойства могут использоваться для настройки метода буферизации:
  • Свойство "buffer-size" позволяет вам установить максимальный размер буфера элемента буферизации в байтах.
  • Свойство "buffer-duration" позволяет вам установить максимальный размер буфера элемента буферизации в единицах времени. Время будет рассчитываться на основе скорости потока данных от сетевого источника.
  • С помощью свойства "download" вы можете активировать метод буферизации посредством загрузки файла, описанный в разделе под названием "Буферизация посредством загрузки файла". Установка логического значения TRUE в качестве значения данного свойства активирует механизм буферизации посредством загрузки файла только для таких форматов, как quicktime, flash video, avi и webm.
  • Также с помощью свойства "use-buffering" вы можете активировать механизм буферизации разобранных или демультиплексированных данных. Данный механизм буферизации полезно активировать при работе с такими источниками данных, замедляющими операции произвольного доступа, как сетевой файловый сервер.

Модуль uridecodebin может быть просто протестирован из командной строки, например, с помощью следующей команды: gst-launch-1.0 uridecodebin uri=file:///file.ogg ! ! audioconvert ! audioresample ! autoaudiosink.

20.4. Элемент playsink

Элемент playsink является мощным элементом для вывода данных. Он содержит доступные по запросу входные точки соединения для приема декодированных аудиопотоков, видеопотоков и потоков текстовых данных и осуществляет самостоятельную настройку для проигрывания передаваемых мультимедийных потоков. Элемент имеет следующие возможности:
  • Предоставляет интерфейсы GstStreamVolume, GstVideoOverlay, GstNavigation и GstColorBalance и автоматически подключает программные элементы с реализациями этих интерфейсов в случае необходимости.
  • Автоматически подключает элементы для преобразования форматов потоков.
  • Позволяет выводить визуализацию аудиопотока в том случае, если среди переданных потоков нет видеопотока.
  • Позволяет настраивать используемые элементы вывода данных.
  • Позволяет устанавливать сдвиг синхронизации аудиопотоков и видеопотоков при проигрывании некачественно мультиплексированных файлов.
  • Поддерживает функцию создания снимка последнего проигранного кадра видео.

Ниже приведен пример методики использования элемента playsink. Мы используем элемент uridecodebin для декодирования аудио- и видеопотоков, выводы которого впоследствии связываем с создаваемыми по запросу точками соединения элемента playsink. При этом мы осуществляем связывание только первых точек соединения для передачи аудиопотока и видеопотока, но вы можете использовать элемент input-selector для связывания всех точек соединения.

Приложение на основе кода из данного примера будет выводить как аудио, так и видео в зависимости от указанного вами источника данных. Попробуйте передать этому приложению аудиофайл и вы увидите, что оно будет выводить визуализации. Вы также можете изменить тип визуализации в процессе работы приложения, изменив значение свойства "vis-plugin".


Следующий раздел : Вспомогательные приложения.