MLT / XML: оптимизация повторяющихся списков атрибутов в теге - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над проектом, который будет создавать файлы MLT на основе ввода данных пользователем. Типичный случай может создать файл MLT, содержащий тысячи почти одинаковых фильтров. У каждого фильтра будет 11 атрибутов, но только 3 атрибута будут меняться от фильтра к фильтру, как вы можете видеть в примере ниже. Есть ли способ уменьшить количество повторений всех этих данных? *

Что-то подобное было бы полезно в моем случае. Есть ли что-нибудь подобное в MLT? Если нет, есть ли способ изменить DTD для реализации чего-то похожего?

Я пробовал использовать XML сущностей, но IIU C они работают только в пределах отдельных значений атрибутов в кавычках или внутри содержимого между начальный и конечный теги отдельного элемента.

Любые указания приветствуются.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 мая 2020

Я нашел простой обходной путь, который подходит в моем случае. Я включаю его сюда на тот случай, если кто-то еще сочтет это решение полезным.

В файле MLT я заменил каждый список избыточных атрибутов непроверяющим фиктивным атрибутом (global="" в моем примере ниже). Затем я написал сценарий sed, который расширяет каждый фиктивный атрибут в исходный список атрибутов. Я могу использовать сценарий sed для преобразования сокращенного файла MLT в действительный файл XML непосредственно перед вызовом melt.

Это работает для меня, потому что я могу хранить большое количество файлов MLT, не тратя впустую дисковое пространство, и На самом деле мне не нужно, чтобы какие-либо из них были действительными XML, кроме случаев, когда я запускаю один из них через расплав. Так что, если мне нужно запустить файл MLT через melt, я просто создам его временную действительную версию с помощью сценария sed, пропущу его через melt, а затем удалю временную версию, когда закончу.

Стоит отметить, что sed абсурдно быстр. Он успешно обработал тестовый файл, содержащий 100 000 фиктивных атрибутов, менее чем за полсекунды. Кроме того, использование этого метода уменьшает размер моих файлов MLT вдвое, так что это определенно того стоит, особенно если дисковое пространство вызывает беспокойство и если есть необходимость иметь возможность хранить много файлов MLT.

Для Например, file.mlt:

<?xml version='1.0' encoding='utf-8'?>
<mlt>
  <profile width="1920" height="1080"/>
  <producer mlt_service="color" resource="black" in="0" out="89"/>

  <filter global="" argument="1" in="0"  out="29"/>
  <filter global="" argument="2" in="30" out="59"/>
  <filter global="" argument="3" in="60" out="89"/>

  [...thousands more similar filters...]

</mlt>

expand-global-attributes.sed:

s/global=""/mlt_service=\"text\" family=\"Nimbus Sans L\" [...] /

Вот команда, которую я использовал на терминале:

sed -f expand-global-attributes.sed file.mlt > tmp.mlt && \
  melt tmp.mlt -consumer avformat:file.mp4 && \
  rm tmp.mlt
0 голосов
/ 10 мая 2020

Невозможно избежать дублирования с текущей реализацией парсера XML.

Похоже, вы пытаетесь подсчитывать числа один раз в секунду. Вы смотрели производитель счетчиков или фильтр таймера?

https://www.mltframework.org/plugins/ProducerCount/ https://www.mltframework.org/plugins/FilterTimer/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...