Библиотека сайта rus-linux.net
Фреймворк GStreamer. Руководство разработчика плагинов. Тэги (метаданные и информация о мультимедийном потоке)
Оригинал: GStreamer Plugin Writer's GuideАвторы: Richard John Boulton, Erik Walthinsen, Steve Baker, Leif Johnson, Ronald S. Bultje, Stefan Kost, Tim-Philipp Muller, Wim Taymans
Дата публикации: 19 июля 2014 г.
Перевод: А.Панин
Дата перевода: 29 июля 2014 г.
Глава 22. Тэги (метаданные и информация о мультимедийном потоке)
22.1. Обзор
Тэги являются наборами данных, передающимися вместе с мультимедийным потоком и не являющимися частью самого потока, а описывающими его. Большая часть контейнерных форматов мультимедийных потоков поддерживает тэги тем или иным образом. Формат Ogg использует структуры VorbisComment, MP3 использует ID3, AVI и WAV используют списки тэгов RIFF INFO, и.т.д. Фреймворк GStreamer предоставляет элементам обобщенный механизм чтения данных тэгов из потока данных, а также предоставляет пользователю доступ к полученной информации. Тэги (по крайней мере, метаданные) могут быть частью потока данных в рамках конвейера. В результате этого при перекодировании файлов из одного формата в другой тэги будут автоматически сохранены, по крайней мере в том случае, если элементы, реализующие функции обработки данных входного и выходного форматов поддерживают тэги.
В рамках фреймворка GStreamer тэги разделяются на две категории, хотя на уровне приложений это разделение и не заметно. Первый тип тэгов называется метаданными (metadata), второй - информацией о мультимедийном потоке (streaminfo). К метаданным относятся тэги, которые описывают не относящиеся к техническим параметры мультимедийного потока. Они могут быть изменены без необходимости полного перекодирования мультимедийного потока. Примерами тэгов данного типа могут служить имя автора композиции ("author"), название композиции ("title") или название альбома, в составе которого была выпущена композиция ("album"). При этом в случае изменения тэгов данного типа все равно может потребоваться повторное создание контейнерного мультимедийного потока того же формата без перекодирования элементарных мультимедийных потоков. Информация о мультимедийном потоке, с другой стороны, представлена тэгами, которые описывают технические параметры мультимедийного потока. Для их изменения придется полностью перекодировать мультимедийный поток. Примерами тэгов данного типа является название использованного для кодирования элементарного мультимедийного потока кодека ("codec") или значение скорости потока ("bitrate"). Обратите внимание на то, что некоторые контейнерные форматы мультимедийных потоков (такие, как ID3) хранят различные тэги с информацией о мультимедийном потоке в форме метаданных записанного в файл контейнерного мультимедийного потока, что подразумевает возможность их изменения, после которого они больше не будут соответствовать параметрам элементарных мультимедийных потоков. При этом они также называются метаданными, так как технически они могут быть изменены без полного перекодирования мультимедийного потока, несмотря на то, что изменения могут сделать их некорректными. Файлы с подобными тэгами, относящимися к метаданным, будут содержать одни и те же тэги в двух экземплярах: один экземпляр тэгов будет относиться к метаданным, другой - к информации о потоке.
Для обозначения элементов, осуществляющих чтение тэгов в рамках фреймворка GStreamer, не существует отдельного названия. В то же время существуют специализированные элементы (например, id3demux), которые не выполняют каких-либо действий помимо чтения тэгов, но при этом любой элемент фреймворка GStreamer может извлекать значения тэгов в процессе обработки данных, причем большинство декодеров, демультиплексоров и элементов для разбора потоков данных выполняет эту операцию.
Элемент для записи тэгов в поток данных носит название TagSetter. Этот элемент, поддерживающий оба типа тэгов, может использоваться при реализации редактора тегов, предназначенного для быстрого изменения значений тэгов (примечание: механизм непосредственного редактирования тэгов на момент написания данного руководства реализован не достаточно эффективно, поэтому для завершения записи тэгов обычно требуется осуществить извлечение/удаление оригинальных тэгов и повторное мультиплексирование мультимедийного потока с новыми значениями тэгов).
22.2. Чтение тэгов из потоков данных
Базовым объектом для хранения значений тэгов является объект списка тэгов типа GstTagList. Элемент, который осуществляет чтение тэгов из потока данных, должен создать пустой список тэгов и заполнять его отдельными тэгами с их значениями. Пустые списки тэгов создаются с помощью функции gst_tag_list_new ()
. После этого элемент получит возможность заполнения созданного списка с помощью функции gst_tag_list_add ()
или gst_tag_list_add_values ()
. Обратите внимание на то, что элементы обычно читают метаданные как строки, но значения в списке тэгов могут не всегда быть представлены в строковом формате - они должны быть того типа, который был задан при регистрации тэга (документация API для каждого из предварительно объявленных тэгов должна содержать описание типа его значения). Убедитесь в том, что вы используете такие функции, как gst_value_transform ()
для гарантии того, что ваши значения тэгов будут приведены к необходимому типу. После чтения данных вы можете отправить информацию о тэгах элементам, расположенным по направлению конвейера, в рамках события с информацией о тэгах TAG. В момент, когда событие с информацией о тэгах TAG достигнет элемента для вывода данных, этот элемент отправит сообщение с информацией о тэгах посредством шины сообщений конвейера, представленной объектом типа GstBus
, для передачи полученной информации приложению.
На данный момент мы выдвигаем требование, в соответствии с которым ядро фреймворка GStreamer должно обладать информацией о типах GType
тэгов перед их использованием, поэтому все тэги должны быть зарегистрированы перед использованием. Вы можете добавить новые тэги в список известных тэгов, воспользовавшись функцией gst_tag_register ()
. В том случае, если вы считаете, что тэг может оказаться полезным не только для вашего элемента, но и для других элементов, хорошей идеей может оказаться добавление кода для его поддержки в файл gsttag.c
вместо файла кода вашего плагина. Решение о размещении кода, реализующего поддержку тэга, может быть принято только вами. В том случае, если вы хотите реализовать поддержку тэга в рамках своего элемента, простейшим решением является регистрация тэга в рамках одной из функций инициализации класса вашего элемента, предпочтительно _class_init ()
.
22.3. Запись тэгов в потоки данных
Элементы, осуществляющие запись тэгов являются противоположностями элементов, осуществляющих чтение тэгов. Эти элементы рассматривают исключительно метаданные, так как к этому единственному типу относятся тэги, значения которых могут записываться в поток данных. Элементы для записи тэгов могут принимать данные тэгов тремя способами: посредством внутренних механизмов, от приложения и от конвейера. Принимаемые посредством внутренних механизмов данные тэгов читаются самим элементом, и это значит, что в данном случае элемент для записи тэгов является одновременно и элементом для чтения тэгов. Данные тэгов, получаемые от приложения, передаются элементу посредством интерфейса TagSetter (который всего лишь является прослойкой). Данные тэгов, получаемые от конвейера, передаются элементу со стороны конвейера. Элемент принимает данные таких тэгов при приеме события с информацией о тэгах GST_EVENT_TAG, что подразумевает необходимость реализации элементом, осуществляющим запись тэгов, функции обработки событий. Элемент для записи тэгов отвечает за объединение тэгов, полученных тремя описанными способами, в рамках одного списка тэгов и запись значений тэгов из этого списка в выходной поток данных.
В примере ниже принимаются данные тэгов как от приложения, так и от конвейера, производится их объединение и запись в выходной поток данных. В нем реализуется интерфейс записи тэгов, поэтому приложение может устанавливать значения тэгов, а также элемент может извлекать значения тэгов из принимаемых событий.
Внимание, данный пример устарел и не будет работать совместно с версией 1.0 фреймворка GStreamer.
Обратите внимание на то, что в обычных условиях элементы не будут читать данные всего мультимедийного потока перед обработкой данных тэгов. Вместо этого они будут читать данные с помощью каждой из входных точек соединения до тех пор, пока не будут получены интересующие их данные (так как данные тэгов обычно передаются перед передачей первого буфера с мультимедийными данными), после чего приступят к их обработке.
Следующий раздел : Предварительно созданные базовые классы.