docs
melt 命令行工具

melt 命令行工具

简介

Melt 是作为 MLT 框架(framework)的测试工具而开发的。可以把它看作一个功能强大但略显晦涩的多轨道命令行视频编辑器。

以下内容详述该工具的用法,并因此提供了大量关于 MLT 框架运作机制的深入见解。

用法

melt [options] [producer [name=value]* ]+
    Options:
      -attach filter[:arg] [name=value]*       Attach a filter to the output
      -attach-cut filter[:arg] [name=value]*   Attach a filter to a cut
      -attach-track filter[:arg] [name=value]* Attach a filter to a track
      -attach-clip filter[:arg] [name=value]*  Attach a filter to a producer
      -audio-track | -hide-video               Add an audio-only track
      -blank frames                            Add blank silence to a track
      -chain id[:arg] [name=value]*            Add a producer as a chain
      -consumer id[:arg] [name=value]*         Set the consumer (sink)
      -debug                                   Set the logging level to debug
      -filter filter[:arg] [name=value]*       Add a filter to the current track
      -getc                                    Get keyboard input using getc
      -group [name=value]*                     Apply properties repeatedly
      -help                                    Show this message
      -jack                                    Enable JACK transport synchronization
      -join clips                              Join multiple clips into one cut
      -link id[:arg] [name=value]*             Add a link to a chain
      -loglevel "quiet" | "panic" | "fatal" |  Set the logging level (least to most)
                "error" | "warning" | "info" | "verbose" | "debug" | "timings"
      -mix length                              Add a mix between the last two cuts
      -mixer transition                        Add a transition to the mix
      -null-track | -hide-track                Add a hidden track
      -profile name                            Set the processing settings
      -progress                                Display progress along with the position
      -query                                   List all of the registered services
      -query "consumers" | "consumer"=id       List consumers or show info about one
      -query "filters" | "filter"=id           List filters or show info about one
      -query "producers" | "producer"=id       List producers or show info about one
      -query "transitions" | "transition"=id   List transitions or show info about one
      -query "profiles" | "profile"=id         List profiles or show info about one
      -query "presets" | "preset"=id           List presets or show info about one
      -query "formats"                         List audio/video formats
      -query "audio_codecs"                    List audio codecs
      -query "video_codecs"                    List video codecs
      -quiet                                   Set the logging level to quiet
      -remove                                  Remove the most recent cut
      -repeat times                            Repeat the last cut
      -repository path                         Set the directory of MLT modules
      -serialise [filename]                    Write the commands to a text file
      -setlocale                               Make numeric strings locale-sensitive
      -silent                                  Do not display position/transport help
      -split relative-frame                    Split the last cut into two cuts
      -swap                                    Rearrange the last two cuts
      -track                                   Add a track
      -transition id[:arg] [name=value]*       Add a transition
      -verbose                                 Set the logging level to verbose
      -version                                 Show the version and copyright message
      -video-track | -hide-audio               Add a video-only track

通用规则

  1. 顺序极其重要;
  2. 命令行解析的错误检查很弱;
  3. 请参阅插件文档以了解可用服务模块(services)的详情;
  4. MLT 框架(melt 的命名约定即继承自它)是非常"MLT 中心"的。生产器(producer)产出 MLT 帧对象,消费器(consumer)消费 MLT 帧对象。这一区别非常重要——DV 生产器并不"生产 DV",它从 DV 源生产 MLT 帧;同理,DV 消费器并不"消费 DV",它消费 MLT 帧并产出 DV 帧。

术语

"生产器"(producer)通常指文件,但也可能指设备(如 dv1394 输入或 video4linux)。因此使用更通用的术语[更通用的用法暂时不在讨论范围内……]。

"滤镜"(filter)是帧修改器——它们保证每接收到一帧就精确输出一帧。从不多,从不少。但没有任何规定说滤镜不能生成帧。

"转场"(transition)从两条轨道(a 和 b)收集帧,在其"a 轨道"上输出 1 个修改后的帧,在其"b 轨道"上输出 1 个未修改的帧。从不多,从不少。

"消费器"(consumer)从生产器收集帧,对帧做某些处理,然后销毁它们。

这些统称为"服务模块"(services)。所有服务模块都关联有"属性"(properties)。属性通常有默认值或计算值,并可按个案覆盖。除消费器外,所有服务模块都遵循 in 和 out 属性。

消费器对帧的流动没有决定权(虽然它们可能给人这种感觉)。它们从连接的生产器获取帧,使用帧,销毁帧,再获取更多。

基础

要使用默认的 SDL PAL 消费器播放文件,用法为: melt file

注意,"file"可以是 melt 已知"生产器"映射的任何类型(因此可以从 .dv 到 .txt 任意)。你也可以直接指定生产器,例如: melt avformat:file.mpeg 将强制直接使用 avformat 加载文件。

属性

可以通过在生产器后添加额外的 name=value 对来为生产器赋值属性: melt file in=50 out=100 something="something else"

注意,虽然某些属性对所有生产器都有意义(例如 in、out 和 length 保证对所有生产器有效,尽管 length 通常由系统自动确定),但其他属性的有效性取决于具体的生产器——不过,属性始终会被赋值,如果不会被使用则会被静默忽略。

多文件

可以使用多种不同类型的文件: melt a.dv b.mpg c.png

可以为每个文件分别指定属性: melt a.dv in=50 out=100 b.mpg out=500 c.png out=500

MLT 会自动处理生产器输出的归一化,以确保消费器获得所需格式。因此在上述情况下,MLT 框架会确保图像被重新缩放、音频被重采样以满足配置要求(默认配置为 PAL)。

消费器

消费器是处理生成帧的组件。 如果未指定消费器,则使用"sdl2"消费器,它会在一个简单的播放窗口中显示结果视频。

$ melt -query consumers
   ---
   consumers:
     - blipflash
     - jack
     - qglsl
     - multi
     - null
     - gtk2_preview
     - cbrts
     - xgl
     - decklink
     - sdl2
     - sdl2_audio
     - avformat
     - rtaudio
     - sdi
     - xml
   ...

要从 melt 命令输出文件,选择一个通用编码器如"avformat"。以下标志会为 melt 命令的结果创建编码后的视频文件。 -consumer avformat:output.avi acodec=libmp3lame vcodec=libx264

滤镜

滤镜是帧修改器——它们可以更改帧关联的音频或图像内容。 melt a.dv -filter greyscale

与生产器一样,滤镜也可以指定属性。

同样,in 和 out 属性对所有滤镜通用,因此要对一定帧范围应用滤镜,可以使用: melt a.dv -filter greyscale in=0 out=50

滤镜自身有一套关于属性的规则,会静默忽略不适用的属性。

分组

-group 开关用于强制对后续"服务模块"应用默认属性。例如: melt -group in=0 out=49 clip*

会播放所有匹配通配符模式的剪辑的前 50 帧。

注意,最后一个 -group 的设置同样适用于后续的滤镜、转场和消费器,因此: melt -group in=0 out=49 clip* -filter greyscale

很可能不是你想要的效果(即:greyscale 滤镜只会应用于前 50 帧)。

要脱离分组属性,可以使用一个空分组: melt -group in=0 out=49 clip* -group -filter greyscale

附加滤镜

如上所述,-filter 开关将滤镜应用于整条轨道。要将滤镜限定到轨道上的特定剪辑,你需要知道该剪辑及其前面所有剪辑的长度信息。实际上这样做极其不切实际,尤其是在命令行层面(甚至从编程角度来说也没那么实用……)。

-attach 系列开关极大地简化了这一操作。默认情况下,-attach 会将滤镜附加到最后创建的服务模块上,所以: melt clip1.dv clip2.dv -attach greyscale clip3.dv 只会对 clip2.dv 应用滤镜。你可以通过在附加的滤镜上指定 in/out 点来进一步缩小效果的作用范围。

到目前为止似乎很简单,但有个陷阱……考虑以下情况: melt clip1.dv -attach watermark:+hello.txt -attach invert

第二个附加的滤镜实际上附加到了 watermark 上。你可能觉得,太好了,很方便(确实如此 :-)),但这可能不是你想要的效果。例如你可能想把两个滤镜都附加到 clip1.dv 上。为此你可以使用: melt clip1.dv -attach-cut watermark:+hello.txt -attach-cut invert

如下文所述,-attach 还有几个需要注意的地方,甚至有另一个变体 :-)。

混合

-mix 开关提供了在相邻剪辑之间引入转场的最简单方式。

例如: melt clip1.dv clip2.dv -mix 25 -mixer luma -mixer mix:-1

会在 clip1 和 clip2 之间同时创建音频和视频转场。

此功能取代了早期 melt 版本中强制使用 -track 和 -transition 开关的做法,使操作方便得多 :-)。

这些可以组合使用,例如你可以用以下方式实现从黑场淡入和淡出到黑场: melt colour:black out=24 clip1.dv -mix 25 -mixer luma colour:black out=24 -mix 25 -mixer luma

虽然这不一定显而易见,但请考虑命令行从左到右解析时发生了什么:

  Input:                  Track
  ----------------------- -----------------------------------------------------
  colour:black out=24     [black]
  clip1.dv                [black][clip1.dv]
  -mix 25                 [black+clip1.dv][clip1.dv]
  -mixer luma             [luma:black+clip1.dv][clip1.dv]
  colour:black out=24     [luma:black+clip1.dv][clip1.dv][black]
  -mix 25                 [luma:black+clip1.dv][clip1.dv][clip1.dv+black]
  -mixer luma             [luma:black+clip1.dv][clip1.dv][luma:clip1.dv+black]

显然,clip1.dv 的各个实例指的是剪辑的不同部分,但希望这能展示我们在构建轨道时的处理过程。

关于 mix 的更多细节请参阅 Documentation > Framework (opens in a new tab)。

混合与附加

如前所述,-attach 通常应用于最后创建的服务模块——因此你可以将滤镜附加到转场区域: melt clip1.dv clip2.dv -mix 25 -mixer luma -attach watermark:+Transition.txt

很好,但请注意——如果你想让附加的滤镜与转场之后的区域关联,请使用 -attach-cut 代替。

引入轨道与空白

到目前为止,所有示例都展示了单条播放列表(或更准确地说,单条轨道)的定义。当存在多条轨道时,消费器将接收来自"编号最高"的正在生成非空白帧的轨道的帧。

最好对轨道排列进行可视化,我们从一个示例开始: melt a.dv -track b.dv in=0 out=49

可以可视化如下:

+------------------+
|a                 |
+-------+----------+
|b      |
+-------+

播放时将显示 b 的前 50 帧,第 51 帧显示的将是 a 的第 51 帧。

此规则同样适用于第二条轨道上的纯音频生产器,例如,以下命令将显示 a 轨道的视频,但音频来自第二条轨道: melt a.dv -track b.mp3 in=0 out=49

要让第 51 帧成为 b 的第一帧,可以使用 -blank 开关: melt a.dv out=49 -track -blank 49 b.dv

可视化效果为:

+-------+
|a      |
+-------+-------------------+
        |b                  |
        +-------------------+

现在播放将持续进行,就好像 a 和 b 剪辑在同一条轨道上(这本身的作用大约相当于把切面包的过程倒过来一样有用)。

转场

轨道真正有用的地方在于转场的放置。这里需要轨道重叠,因此一个有用的多轨道定义可以写成:

melt a.dv out=49 \
-track \
-blank 24 b.dv \
-transition luma in=25 out=49 a_track=0 b_track=1

这下真正有用了——我们的可视化效果大致为:

+-------+
|a      |
+---+---+--------------+
    |b                 |
    +------------------+

播放现在将先显示 a 的前 25 帧,然后在 a 和 b 之间进行 25 帧的淡入转场,最后播放 b 的剩余部分。

反转转场

在可视化轨道定义时,我们也会看到这样的场景:

+-------+              +----------+
|a1     |              |a2        |
+---+---+--------------+----+-----+
    |b                      |
    +-----------------------+

我们有两个转场,从 a1 到 b 以及从 b 到 a2。在这种情况下,命令行定义如下:

melt a.dv out=49 -blank 49 a2.dv \
-track \
-blank 24 b.dv out=99 \
-transition luma in=25 out=49 a_track=0 b_track=1 \
-transition luma in=100 out=124 reverse=1 a_track=0 b_track=1

序列化

Melt 内置了序列化机制——你可以逐步构建命令,通过任何消费器测试它,然后添加 -serialise file.melt 开关来保存。保存的文件随后可作为剪辑被 melt 或其他 MLT 应用程序使用。但请注意——文件路径按命令行中提供的原样保存……

使用 xml 消费器可以获得更具表现力的序列化——它将生成一个 XML 文档,可在 melt 和其他 MLT 应用程序中自由使用。

参阅 MLT XML (opens in a new tab) 获取更多信息。

缺失功能

某些滤镜/转场应该应用于输出帧,不论该帧来自哪条轨道——例如,你可能有第三条文字轨道或一个水印,希望将其合成到每一帧上,当然还有那些特殊的滤镜……

Melt 只支持以下两种调用方式——简单示例:

melt a.dv -track -blank 100 b.dv -consumer xml:basic.mlt
melt basic.mlt -filter watermark:watermark.png