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通用规则
- 顺序极其重要;
- 命令行解析的错误检查很弱;
- 请参阅插件文档以了解可用服务模块(services)的详情;
- 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