]> git.sesse.net Git - mlt/blob - docs/melt.txt
Add -query formats and codecs to melt.
[mlt] / docs / melt.txt
1 Melt Documentation
2
3 Copyright (C) 2004-2009 Ushodaya Enterprised Limited
4 Author: Charles Yates <charles.yates@pandora.be>
5 Author: Dan Dennedy <dan@dennedy.org>
6 Last Revision: 2011-04-03
7
8
9 MELT
10 -----
11
12 Preamble:
13
14         Melt was developed as a test tool for the MLT framework. It can be thought
15         of as a powerful, if somewhat obscure, multitrack command line oriented 
16         video editor.
17
18         The following details the usage of the tool and as a result, provides a lot 
19         of insight into the workings of the MLT framework.
20
21
22 Usage:
23
24     melt [options] [producer [name=value]* ]+
25     Options:
26       -attach filter[:arg] [name=value]*       Attach a filter to the output
27       -attach-cut filter[:arg] [name=value]*   Attach a filter to a cut
28       -attach-track filter[:arg] [name=value]* Attach a filter to a track
29       -attach-clip filter[:arg] [name=value]*  Attach a filter to a producer
30       -audio-track | -hide-video               Add an audio-only track
31       -blank frames                            Add blank silence to a track
32       -consumer id[:arg] [name=value]*         Set the consumer (sink)
33       -debug                                   Set the logging level to debug
34       -filter filter[:arg] [name=value]*       Add a filter to the current track
35       -group [name=value]*                     Apply properties repeatedly
36       -help                                    Show this message
37       -join clips                              Join multiple clips into one cut
38       -mix length                              Add a mix between the last two cuts
39       -mixer transition                        Add a transition to the mix
40       -null-track | -hide-track                Add a hidden track
41       -profile name                            Set the processing settings
42       -progress                                Display progress along with the position
43       -remove                                  Remove the most recent cut
44       -repeat times                            Repeat the last cut
45       -query                                   List all of the registered services
46       -query "consumers" | "consumer"=id       List consumers or show info about one
47       -query "filters" | "filter"=id           List filters or show info about one
48       -query "producers" | "producer"=id       List producers or show info about one
49       -query "transitions" | "transition"=id   List transitions or show info about one
50       -query "profiles" | "profile"=id         List profiles or show info about one
51       -query "formats"                         List audio/video formats
52       -query "audio_codecs"                    List audio codecs
53       -query "video_codecs"                    List video codecs
54       -serialise [filename]                    Write the commands to a text file
55       -silent                                  Do not display position/transport help
56       -split relative-frame                    Split the last cut into two cuts
57       -swap                                    Rearrange the last two cuts
58       -track                                   Add a track
59       -transition id[:arg] [name=value]*       Add a transition
60       -verbose                                 Set the logging level to verbose
61       -version                                 Show the version and copyright message
62       -video-track | -hide-audio               Add a video-only track
63
64
65 General rules:
66
67         1. Order is incredibly important;
68
69         2. Error checking on command line parsing is weak;
70
71         3. Please refer to services.txt for details on services available;
72
73         4. The MLT framework, from which melt has inherited its naming convention,
74         is very mlt-centric. Producers produce MLT frame objects and consumers 
75         consume MLT frame objects.  The distinction is important - a DV producer 
76         does not produce DV, it produces MLT frames from a DV source, and similarly
77         a DV consumer does not consume DV, it consumes MLT frames and produces DV
78         frames.
79
80
81 Terminology:
82
83         'Producers' typically refer to files but may also indicate devices (such as
84         dv1394 input or video4linux). Hence, the more generic term is used [the more 
85         generic usage is out of scope for now...].
86
87         'Filters' are frame modifiers - they always guarantee that for every frame 
88         they receive, they output *precisely* one frame.  Never more, never less, 
89         ever. Nothing says that a filter cannot generate frames though
90         
91         'Transitions' collect frames from two tracks (a and b) and output 1 
92         modified frame on their 'a track', and 1 unmodified frame on their 'b track'.
93         Never more, never less, ever.
94         
95         'Consumers' collect frames from a producer, do something with them and
96         destroy them.
97         
98         Collectively, these are known as 'services'. 
99         
100         All services have 'properties' associated to them. These are typically
101         defaulted or evaluated and may be overriden on a case by case basis.
102         
103         All services except consumers obey in and out properties.
104         
105         Consumers have no say in the flow of frames [though they may give the
106         illusion that they do]. They get frames from a connected producer, use them, 
107         destroy them and get more.
108
109
110 Basics:
111
112         To play a file with the default SDL PAL consumer, usage is:
113         
114         $ melt file
115
116         Note that 'file' can be anything that melt has a known 'producer' mapping 
117         for (so this can be anything from .dv to .txt).
118
119         You can also specify the producer directly, for example:
120
121         $ melt avformat:file.mpeg
122
123         Would force the direct use of avformat for loading the file.
124
125
126 Properties:
127
128         Properties can be assigned to the producer by adding additional name=value
129         pairs after the producer:
130         
131         $ melt file in=50 out=100 something="something else"
132         
133         Note that while some properties have meaning to all producers (for example:
134         in, out and length are guaranteed to be valid for all, though typically, 
135         length is determined automatically), the validity of others are dependent on 
136         the producer - however, properties will always be assigned and silently 
137         ignored if they won't be used.
138
139
140 Multiple Files:
141
142         Multiple files of different types can be used:
143         
144         $ melt a.dv b.mpg c.png
145         
146         Properties can be assigned to each file:
147         
148         $ melt a.dv in=50 out=100 b.mpg out=500 c.png out=500
149
150         MLT will take care of 'normalising' the output of a producer to ensure
151         that the consumer gets what it needs. So, in the case above, the mlt
152         framework will ensure that images are rescaled and audio resampled to meet
153         the requirements of your configuration (which, by default, will be PAL).
154         See 'Appendix A: Normalisation Rules' below.
155
156
157 Filters:
158
159         Filters are frame modifiers - they can change the contents of the audio or
160         the images associated to a frame.
161
162         $ melt a.dv -filter greyscale
163
164         As with producers, properties may be specified on filters too.
165         
166         Again, in and out properties are common to all, so to apply a filter to a
167         range of frames, you would use something like:
168         
169         $ melt a.dv -filter greyscale in=0 out=50
170         
171         Again, filters have their own set of rules about properties and will
172         silently ignore properties that do not apply.
173
174
175 Groups:
176
177         The -group switch is provided to force default properties on the following
178         'services'. For example:
179         
180         $ melt -group in=0 out=49 clip*
181         
182         would play the first 50 frames of all clips that match the wild card
183         pattern.
184         
185         Note that the last -group settings also apply to the following filters, 
186         transitions and consumers, so:
187         
188         $ melt -group in=0 out=49 clip* -filter greyscale
189         
190         is *probably not* what you want (ie: the greyscale filter would only be 
191         applied to the first 50 frames).
192         
193         To shed the group properties, you can use any empty group:
194         
195         $ melt -group in=0 out=49 clip* -group -filter greyscale
196
197
198 Attached Filters:
199
200         As described above, the -filter switch applies filters to an entire track. To
201         localise filters to a specific clip on a track, you have to know information
202         about the lengths of the clip and all clips leading up to it. In practise, 
203         this is horrifically impractical, especially at a command line level (and not
204         even that practical from a programing point of view...).
205
206         The -attach family of switches simplify things enormously. By default, -attach
207         will attach a filter to the last service created, so:
208
209         $ melt clip1.dv clip2.dv -attach greyscale clip3.dv
210
211         would only apply the filter to clip2.dv. You can further narrow down the area of
212         the effect by specifying in/out points on the attached filter.
213
214         This might seem simple so far, but there is a catch... consider the following:
215
216         $ melt clip1.dv -attach watermark:+hello.txt -attach invert
217
218         The second attached filter is actually attached to the watermark. You might 
219         think, yay, nice (and it is :-)), but, it might not be what you want. For example
220         you might want to attach both to clip1.dv. To do that, you can use:
221
222         $ melt clip1.dv -attach-cut watermark:+hello.txt -attach-cut invert
223
224         As you shall see below, there are still another couple of gotchas associated to 
225         -attach, and even another variant :-).
226
227
228 Mixes:
229
230         The -mix switch provides the simplest means to introduce transitions between
231         adjacent clips.
232
233         For example:
234
235         $ melt clip1.dv clip2.dv -mix 25 -mixer luma -mixer mix:-1
236
237         would provide both an audio and video transition between clip1 and clip2.
238
239         This functionality supercedes the enforced use of the -track and -transition
240         switches from earlier versions of melt and makes life a lot easier :-).
241
242         These can be used in combination, so you can for example do a fade from black
243         and to black using the following:
244
245         $ melt colour:black out=24 clip1.dv -mix 25 -mixer luma \
246                 colour:black out=24 -mix 25 -mixer luma 
247         
248         while this may not be immediately obvious, consider what's happening as the 
249         command line is being parsed from left to right:
250
251         Input:                  Track
252         ----------------------- -----------------------------------------------------
253         colour:black out=24     [black]
254         clip1.dv                [black][clip1.dv]
255         -mix 25                 [black+clip1.dv][clip1.dv]
256         -mixer luma             [luma:black+clip1.dv][clip1.dv]
257         colour:black out=24     [luma:black+clip1.dv][clip1.dv][black]
258         -mix 25                 [luma:black+clip1.dv][clip1.dv][clip1.dv+black]
259         -mixer luma             [luma:black+clip1.dv][clip1.dv][luma:clip1.dv+black]
260
261         Obviously, the clip1.dv instances refer to different parts of the clip, but 
262         hopefully that will demonstrate what happens as we construct the track.
263
264         You will find more details on the mix in the framework.txt.
265
266
267 Mix and Attach:
268
269         As noted, -attach normally applies to the last created service - so, you can 
270         attach a filter to the transition region using:
271
272         $ melt clip1.dv clip2.dv -mix 25 -mixer luma -attach watermark:+Transition.txt
273
274         Again, nice, but take care - if you want the attached filter to be associated
275         to the region following the transition, use -attach-cut instead.
276
277
278 Splits, Joins, Removes and Swaps:
279
280         COMPLEX - needs simplification....
281
282
283 Introducing Tracks and Blanks:
284
285         So far, all of the examples have shown the definition of a single
286         playlist, or more accurately, track.
287
288         When multiple tracks exist, the consumer will receive a frame
289         from the 'highest numbered' track that is generating a non-blank
290         frame.
291         
292         It is best to visualise a track arrangement, so we'll start with
293         an example:
294         
295         $ melt a.dv -track b.dv in=0 out=49
296         
297         This can be visualised as follows:
298         
299         +------------------+
300         |a                 |
301         +-------+----------+
302         |b      |
303         +-------+
304
305         Playout will show the first 50 frames of b and the 51st frame shown will be
306         the 51st frame of a.
307
308         This rule also applies to audio only producers on the second track, for
309         example, the following would show the video from the a track, but the audio
310         would come from the second track:
311
312         $ melt a.dv -track b.mp3 in=0 out=49
313
314         To have the 51st frame be the first frame of b, we can use the -blank switch:
315         
316         $ melt a.dv out=49 -track -blank 49 b.dv
317         
318         Which we can visualise as:
319         
320         +-------+
321         |a      |
322         +-------+-------------------+
323                 |b                  |
324                 +-------------------+
325         
326         Now playout will continue as though a and b clips are on the
327         same track (which on its own, is about as useful as reversing the 
328         process of slicing bread).
329
330
331 Transitions:
332
333         Where tracks become useful is in the placing of transitions.
334         
335         Here we need tracks to overlap, so a useful multitrack
336         definition could be given as:
337         
338         $ melt a.dv out=49 \
339                 -track \
340                 -blank 24 b.dv \
341                 -transition luma in=25 out=49 a_track=0 b_track=1
342         
343         Now we're cooking - our visualisation would be something like:
344         
345         +-------+
346         |a      |
347         +---+---+--------------+
348             |b                 |
349             +------------------+
350         
351         Playout will now show the first 25 frames of a and then a fade
352         transition for 25 frames between a and b, and will finally
353         playout the remainder of b.
354
355
356 Reversing a Transition:
357
358         When we visualise a track definition, we also see situations
359         like:
360         
361         +-------+              +----------+
362         |a1     |              |a2        |
363         +---+---+--------------+----+-----+
364             |b                      |
365             +-----------------------+
366         
367         In this case, we have two transitions, a1 to b and b to a2. 
368         
369         In this scenario, we define a command line as follows:
370         
371         $ melt a.dv out=49 -blank 49 a2.dv \
372                 -track \
373                 -blank 24 b.dv out=99 \
374                 -transition luma in=25 out=49 a_track=0 b_track=1 \
375                 -transition luma in=100 out=124 reverse=1 a_track=0 b_track=1
376
377
378 Serialisation:
379
380         Melt has a built in serialisation mechanism - you can build up
381         your command, test it via any consumer and then add a -serialise
382         file.melt switch to save it.
383         
384         The saved file can be subsequently used as a clip by melt or other
385         MLT applications. Take care though - paths to files are saved as
386         provided on the command line....
387
388         A more expressive serialisation can be obtained with the xml consumer
389         - this will provide an xml document which can be used freely in melt and
390         other MLT applications.
391
392         See mlt-xml.txt for more information.
393
394
395 Missing Features:
396
397         Some filters/transitions should be applied on the output frame regardless
398         of which track it comes from - for example, you might have a 3rd text 
399         track or a watermark which you want composited on every frame, and of 
400         course, there's the obscure filter.... 
401         
402         melt only supports this in two invocations - as a simple example:
403
404         $ melt a.dv -track -blank 100 b.dv -consumer xml:basic.mlt
405         $ melt basic.mlt -filter watermark:watermark.png
406