0

我正在开发一个将根据用户输入生成 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 规范提供了一个<defs>带有 xlink 命名空间的标签,它允许这样的事情:

<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 仅适用于单个引用的属性值,或单个元素的开始和结束标记之间的内容。

任何指导表示赞赏。

谢谢

4

2 回答 2

0

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

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

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

于 2020-05-10T13:12:51.313 回答
0

我找到了一个简单的解决方法就足够了。我将其包括在此处,以防其他人发现此解决方案有用。

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

这对我有用,因为我可以在不浪费磁盘空间的情况下存储大量 MLT 文件,而且我实际上并不需要它们中的任何一个成为有效的 XML,除非我通过 melt 运行其中一个文件。因此,如果我需要通过 melt 运行 MLT 文件,我只需使用 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>

扩展全局属性.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
于 2020-05-18T16:04:15.073 回答