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

UnixForum





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

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

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

Часть III. Сложные концепции фреймворка GStreamer

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

Некоторые главы данной части руководства будут предназначены главным образом для объяснения принципов работы внутренних механизмов фреймворка GStreamer, на самом деле изложенная в них информация не является необходимой для разработки приложений. К ним могут быть отнесены главы, описывающие механизмы планирования работы программных потоков, автоматической подгрузки плагинов и синхронизации. Между тем, в других главах обсуждаются более сложные способы реализации взаимодействия по схеме конвейер-приложение, которые могут оказаться чрезвычайно полезными для определенных приложений. К ним можно отнести главы с описанием методов работы с метаданными, запросами и событиями, интерфейсами, динамическими параметрами, а также главы с описанием методов осуществления манипуляций с данными конвейера.

Глава 11. Отслеживание позиции в мультимедийном потоке

На данный момент мы знакомы с методикой создания и запуска конвейера для обработки мультимедийных потоков. Но большинство разработчиков приложений также будет заинтересовано в предоставлении пользователям информации о позиции в этом потоке. Мультимедийные проигрыватели, например, обычно имеют ползунок, указывающий на позицию в рамках проигрываемой композиции, а также обычно выводят строку с информацией о длительности мультимедийного потока. Приложения, занимающиеся перекодированием мультимедийных данных, имеют индикатор степени выполнения задачи, указывающий, на сколько процентов выполнена текущая работа. Фреймворк GStreamer имеет встроенную поддержку всех описанных механизмов, реализованную на основе концепции, известной, как концепция запросов (querying). Так как перемещение в мультимедийном потоке является аналогичной операцией, она также будет рассматриваться в данной главе. Механизм перемещения в мультимедийном потоке основывается на концепции событий (events).

11.1. Концепция запросов: получение информации о позиции в мультимедийном потоке или его длительности

Концепция запросов заключается в осуществлении запросов значений определенного свойства потока, связанного с отслеживанием степени обработки потока. Эта операция позволяет получить значение продолжительности потока (если такая информация доступна) или значение текущей позиции в потоке. Значения описанных свойств потока могут быть получены в различных форматах, таких, как время, количество аудиосэмплов, количество кадров видео или количество байт. Наиболее часто используемой для данных целей функцией является функция gst_element_query (), хотя некоторые вспомогательные обертки для функций также доступны (такие, как gst_element_query_position () и gst_element_query_duration ()). В общем случае вы можете отправить запрос напрямую конвейеру, после чего он обработает всю необходимую внутреннюю информацию для выяснения того, к какому элементу следует обратиться с запросом.

На самом деле, внутренний механизм запросов реализован таким образом, что запросы отправляются элементам для вывода данных и "передаются" против направления конвейера до тех пор, пока не достигают элемента, который способен их обработать; результат отправляется назад в функцию. Обычно таким элементом является демультиплексор, хотя при использовании источников данных реального времени (например, при работе с веб-камерой), этим элементом будет сам элемент для ввода данных.

11.2. Концепция событий: перемещение в мультимедийном потоке (и другие действия)

Механизм событий очень похож на механизм запросов. Например, механизм передачи событий работает точно так же, как и механизм передачи запросов (и имеет аналогичные ограничения), причем события могут точно так же отправляться конвейеру верхнего уровня, который получит всю необходимую информацию для вас. Хотя и существует большее количество способов осуществления взаимодействия между приложениями и элементами посредством событий, в данной главе мы остановимся исключительно на перемещения в мультимедийном потоке. Оно осуществляется с помощью события перемещения. Событие перемещения содержит значение скорости воспроизведения, формат перемещения (который является идентификатором единиц, используемых для перемещений, т.е., идентификатором времени, аудиосэмплов, кадров видео или байт), в некоторых случаях набор флагов, связанных с перемещением (т.е., флагов, указывающих на необходимость опустошения внутренних буферов), идентификаторы метода перемещения (которые указывают на то, относительной какой позиции задается перемещение), а также значения перемещений. Первое значение перемещения (cur) указывает на новую позицию, в которую следует переместиться, а второе значение (stop) является необязательным и указывает на позицию, в которой ожидается остановка обработки мультимедийного потока. Обычно достаточным является использование константы GST_SEEK_TYPE_NONE в качестве второго идентификатора метода перемещения и значения -1 в качестве второго значения перемещения. Механизм перемещения также реализован в рамках обертки gst_element_seek ().

Перемещения с флагом GST_SEEK_FLAG_FLUSH должны осуществляться в том случае, если конвейер находится в состоянии "пауза" (PAUSED) или "проигрывается" (PLAYING). Конвейер автоматически перейдет в начальное состояние и будет находиться в нем до того момента, пока новые, доступные после перемещения в мультимедийном потоке данные не позволят ему снова вернуться в рабочее состояние. После выхода из начального состояния конвейер перейдет в то состояние, в котором он находился до выполнения операции перемещения в мультимедийном потоке ("пауза" (PAUSED) или "проигрывается" (PLAYING)). Вы можете ожидать завершения операции перемещения в мультимедийном потоке (с блокировкой), воспользовавшись функцией gst_element_get_state () или отслеживая появление сообщения ASYNC_DONE на шине сообщений.

Перемещения в мультимедийном потоке без использования флага GST_SEEK_FLAG_FLUSH должны выполняться только тогда, когда конвейер находится в состоянии "проигрывается" (PLAYING). Осуществление перемещения в мультимедийном потоке без опустошения буферов в состоянии "пауза" (PAUSED) может привести к блокировке, так как программные потоки для обработки мультимедийных потоков конвейера могут взаимно заблокироваться при работе с элементами вывода данных.

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

Имеется возможность выполнения множества операций перемещения в мультимедийном потоке в течение коротких интервалов времени, что полезно, например, для мгновенной реакции на перемещение ползунка. После перемещения в мультимедийном потоке внутренние механизмы переведут конвейер в состояние "пауза" (в том случае, если он был в состоянии "проигрывается"), позиция в потоке будет изменена незаметно для пользователя, демультиплексоры и декодеры начнут декодировать мультимедийный поток в новой позиции и это будет продолжаться до того момента, когда все элементы вывода данных снова получат данные. В том случае, если изначально осуществлялось проигрывание потока, он снова начнет проигрываться. Так как данные из новой позиции в мультимедийном потоке будут немедленно доступны для элементов вывода данных, вы увидите новый кадр даже в том случае, если поток не проигрывался.


Следующий раздел : Метаданные.