MLT/XML: 优化标签中的重复属性列表

MLT/XML: optimizing repetitive attribute lists in a tag

我正在从事一个项目,该项目将根据用户输入生成 MLT 文件。一个典型的案例可能会产生一个包含数千个几乎相似的过滤器的 MLT 文件。每个过滤器将有 11 个属性,但只有 3 个属性会因过滤器而异,如下例所示。有没有办法减少所有这些数据的重复?

<?xml version='1.0' encoding='utf-8'?>
<mlt>
  <profile width="1920" height="1080"/>
  <producer mlt_service="color"
               resource="black"
                     in="0"
                    out="89"/>
  <filter mlt_service="text"
             geometry="1.354%/7.407%:78.125%x77.407%:100"
               family="Nimbus Sans L"
                 size="1000"
             fgcolour="white"
             bgcolour="0"
               halign="right"
               valign="middle"
             argument="1"
                   in="0"
                  out="29"/>
  <filter [...same first 8 attribute settings...]
             argument="2"
                   in="30"
                  out="59"/>
  <filter [...same first 8 attribute settings...]
             argument="3"
                   in="60"
                  out="89"/>

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

</mlt>

我知道 SVG 规范提供了一个带有 xlink 命名空间的 <defs> 标签,它允许这样的事情:

<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <tag id="my-tag" [...reusable attributes...] />
  </defs>
  <use xlink:href="#my-tag" [...instance-specific attributes...] />
</svg>

类似的东西对我来说很有用。 MLT中有类似的东西吗?如果没有,有没有办法修改 DTD 以实现类似的东西?

我尝试使用 XML 个实体,但 IIUC 那些只在单独引用的属性值内工作,或者在单独元素的开始和结束标记之间的内容内工作。

感谢任何指导。

谢谢

无法避免与当前 XML 解析器实现的重复。

您似乎正在尝试使数字每秒计数一次。您看过计数生成器或计时器过滤器了吗?

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

我找到了一个适合我的情况的简单解决方法。我将它包括在这里,以防其他人发现此解决方案有用。

在 MLT 文件中,我用一个非验证虚拟属性替换了每个冗余属性列表(在我下面的示例中为 global="")。然后我编写了一个 sed 脚本,将每个虚拟属性扩展到原始属性列表中。我可以在调用 melt 之前使用 sed 脚本将缩写的 MLT 文件转换为有效的 XML 文件。

这对我有用,因为我可以在不浪费磁盘的情况下存储大量的 MLT 文件 space,而且我实际上不需要任何文件都有效 XML,除非我运行正在融化其中之一。因此,如果我需要通过 melt 运行 一个 MLT 文件,我将使用 sed 脚本创建它的一个临时有效版本,运行 通过 melt,然后删除临时版本当我'我完成了。

值得一提的是 sed 快得离谱。它在不到半秒的时间内成功处理了一个包含 100,000 个虚拟属性的测试文件。此外,使用此方法可将我的 MLT 文件大小减半,因此绝对值得,特别是如果磁盘 space 是一个问题,并且需要能够存储大量 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>

展开-全局-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