The easiest way to try out and learn MLT is by downloading
Shotcut.
You can download it from GitHub.
The highlights of this version are a new placebo GPU module based on libplacebo,
a 32-bit float default audio sample format, and Adjustment Clips (fx_cut) that
filter only the tracks below them.
mlt_frame.
Use mlt_frame_append_convert_image() to register a converter instead of
setting frame->convert_image directly. Multiple converters are tried in
registration order; the first that succeeds wins. New public API:
mlt_frame_prepend_convert_image()mlt_frame_append_convert_image()mlt_frame_convert_image()mlt_frame_next_convert_image()mlt_frame_has_convert_image()mlt_frame_copy_convert_image()mlt_frame_s::convert_image is now read-only after
init and is permanently set to the dispatcher mlt_frame_convert_image().
A custom function written directly to this field is no longer called.
If you really need that (I have never heard of anyone who does), clear the frame’s
_convert_image_callbacks property
and use mlt_frame_append_convert_image() instead.fx_cut (Adjustment Clip) now applies its filters only to tracks
below it. Higher tracks composite on top of the filtered result.
New image-stack helpers are used by tractor stacking and by fx_cut:
mlt_frame_prepend_image_from_service()mlt_frame_push_image_with_fx_cut()fx_cut (Adjustment Clip).
Cross-producer image sharing (including the reverse fx_cut share) finalizes
an in-progress Movit chain as rgba64 and does not copy producer-keyed
_movit chain state. Same-producer prepends keep the GPU chain. Playlist
fx_cut frames now set _producer so Movit can key the chain.meta. and set. properties are now copied from the producer onto fx_cut frames
so producer annotations reach tractor output. New public API:
mlt_producer_pass_frame_properties()Mlt::Producer::pass_frame_properties()float32 (mlt_audio_f32le).
Added mlt_audio_format_id() and an mlt_audio_format property on the
multi consumer. Conversion between integer and float is lossless and symmetric
(s16 and u8 round-trip exactly).sox filter, which only supports 32-bit integer samples.volume filter’s normalize parameter because it forces
16-bit integer audio. Use dynamic_loudness instead. The volume filter
itself still supports float samples.meta.audio.*).mlt_property_is_anim() so strings that merely contain =
(for example URLs) are not treated as animation.mlt_properties_get_data() no longer returns a data pointer for rect
properties.mlt_luma_map_from_pgm.fx_cut in-point handling in mlt_transition.mlt++ builds by disabling ELF symbol versioning.setlocale.
Parsing and formatting no longer change the process LC_NUMERIC.movit.convert, avcolor_space, imageconvert) are
now attached from data in loader.ini, using the image_convert key.rgba64 is now a valid input as well as an output: FlatInput is
created with GL_UNSIGNED_SHORT and set_pixel_data() uses the 16-bit
overload. Previously, rgba64 was uploaded as 8-bit, which distorted the
image when an OpenGL filter ran on an fx_cut.placebo GPU module (placebo.render, placebo.shader) using
libplacebo for scaling, debanding, dithering, tonemapping, and mpv-style
.hook shaders (D3D11 / Vulkan / OpenGL).decklink consumer when pausing, seeking, and
resuming playback.mix transition (duck_threshold, duck_attenuation,
duck_level, duck_fade_in, duck_fade_out, and an optional prefix
that records the level on the frame as <prefix>duck_level).#frame+1# keyword in dynamictext (1-based frame number).audiolevel filter.avformat.hevc_vaapi encoding.avformat consumer now logs when it finishes.rnnoise so it works at sample rates other than 48 kHz by resampling.frei0r.kaleid0sc0pe and frei0r.squigglevision now report internal threading.frei0r.camerashake (and its blur) with preview scaling.USE_LV2 and USE_VST2 require USE_LADSPA. The LADSPA blacklist.txt
is installed even without JACK, and LV2_PATH is expanded correctly on Windows.affine and qtblend inside mask_apply.qtblend transition so it does not apply pixel-aspect normalization twice.invert property.shape filter alpha subtraction for rgba.qimage and pixbuf.crop when hardware decode and scale are combined with preview scaling.subtitle_feed end-frame calculation.gpsgraphic and gpstext.sdl2 consumer so it no longer freezes on Windows after a few seconds.sdl2_audio so it no longer hangs in consumer_stop() when stopped while paused.s32, float, s32le, f32le, and u8 to the noise producer,
and s16, s32, s32le, f32le, and u8 to tone. Fixed tone
integer conversion to match audioconvert.xml producer when a filter, transition,
link, or producer fails to load.movit.convert leaking a Movit input on every frame when an
effect chain is reused.gpstext (#gps_hr#).gpsgraphic no longer sets time_offset when a GPS file is first loaded.melt prints its progress when it finishes and exits with a non-zero status
when interrupted by a signal.melt on Windows so it no longer ignores window resizing and keyboard transport.melt -jack option not working with PipeWire.You can download it from GitHub.
The highlights of this version are expanded compatibility and capabilities for OpenFX plugins and a new audio noise reduction filter and link.
win32_fopen().mlt_properties.ante & post properties in mlc_consumer.metaschema.yaml (new version 7.2):
audio_formatsvideo_formatslayout-hinthide-labelnormalized_defaultaudio_formats and image_formats properties to all service metadata.openfx module:
snprintf() callsmlt_rect)choice (values in metaschema.yaml) parametersrnnoise module for background audio noise reduction (depends on librnnoise).decklink consumer:
hdr_red_xhdr_red_yhdr_green_xhdr_green_yhdr_blue_xhdr_blue_yhdr_white_xhdr_white_yhdr_max_luminancehdr_min_luminancehdr_max_cllhdr_max_fall.lot file name extension for the loader producer to use glaxnimate.qtblend filter and transition.spatialaudio module to the libspatialaudio 0.4.0 API.pgm producer.kdenlivetitle producer and frei0r, plusgpl, jackrack, openfx, rtaudio, & resample modules.decklink consumer.frame_duration in avformat consumer.avformat consumer with unsupported attached_pic format.vst2 filters on macOS.consumer producer.vorbis producer.typewriter in qtext filter lags when rate properties changed.melt.You can download it from GitHub.
The highlights of this version are basic, minimal support for OpenFX plugins and hardware scaling for preview scaling with hwaccel decoding.
mlt_properties for better performance.mlt_pool.mlt_properties.getTime())hwaccel_scale filter with preview scaling (scale_vaapi, scale_vulkan, scale_d3d11, scale_vt (macOS)).MLT_AVFORMAT_HWACCEL_PPS to provide a
limiter to hwaccel because transfering uncompressed video between memory
CPU and GPU memory is heavy.
PPS = maximum pixels per second. Anything over it skips hwaccel.lut parameter to avformat producer.attached_pic property to avformat consumer.movit.overlay_blend video filter.compositing property to movit.overlay transition.mix audio transition.rect in kdenlivetitle.subtitle filter.text and qtext filters.qtext style property to support family named styles.qtblend.kdenlivetitle.QImage scaling when downscaling in qtblend.obscure and watermark filters.avformat no-validate mode.linearblend deinterlacer.movit linear color not matching CPU filters.multi consumer making extra linear color conversions.qtblend filter returning unexpectedly large frames.qtext outline encroaching on fill color.eof=loop in Glaxnimate.brightness filter on track below a clip with transparency.melt.You can download it from GitHub.
This version adds image processing in linear color on the CPU (previously only Movit). Plus, it extends 10-bit video processing on the CPU to many more services.
mlt_image_default_colorspace()mlt_image_default_trc()mlt_image_default_primaries()mlt_color_convert_trc()mlt_consumer property mlt_color_trc to drive a new
color_transform normalizer filter. This sets the color transfer
function to use for image/video effects. It is beneficial and
correct to use linear color for any pixel mixing whether for blending
or interpolation.atexit(mlt_factory_close) in mlt_factory_init(). Close the
factory yourself if you feel the need to (not generally needed when
exiting a process).mlt_service_connect_producer().mlt_profile_is_valid() and Mlt::Profile::is_valid().mlt_consumer_start()mlt_factory_producer()xml producerluma transition’s dissolve (regression in v7.34.0).decklink consumer (regression in v7.34.0).avformat consumer.hwaccel=vulkan to the avformat producer.color_transform normalizer filter to the core module to convert
all image/video producers to and from linear color. It is abstract in the
core module and drives the following filters:
avfilter.zscalesws_colortransformavfilter.scalesws_colortransform that is more efficient than avfilter.swscale
but requires FFmpeg 8.null consumer:
real_time: -1terminate_on_pause: 1luma and movit.luma transitions to progress linearly with
linear color_trc.xml-clip producer.mlt_image_rgba64 format to:
avcolor_space filteravdeinterlace filteraffine filter and transitionaudiolevelgraph filteraudiospectrum filteraudiowaveform filterautofade filteravformat producer and consumersbox_blur filterbrightness filterpillar_echo filtercolor producerdropshadow filterdynamictext filter (when used with qtext)frei0r.alpha0ps filterfrei0r.alphagrad filterfrei0r.alphaspot filterfrei0r.bluescreen0r filterfrei0r.select0r filterfrei0r.transparency filtergpsgraphic filtergpstext filtergradientmap filterhslprimaries filterhslrange filterkdenlivetitle producerlift_gamma_gain filterlightshow filtermask_apply (when used with qtblend)movit.convert filteroutline filterqtblend filter and transitionqtcrop filterqtext producershape filterspot_remover filterstrobe filtersubtitle filter (when used with qtext)swscale filtertext filter (when used with qtext)timeremap linktimer filter (when used with qtext)vqm transitionmask_apply filter default transition to qtblend.alpha property on the brightness filter
so that you can increase the opacity of an existing alpha channel.gpsgraphic filter.avformat producer.avformat presets.win32/strptime.c and replaced with Qt functions.melt usage on error exit.You can download it from GitHub.
This versions adds 10-bit video processing on the CPU, but you must ensure you are using compatible filters and transitions.
mlt_image_rgba64 format. This change touched core, avformat, and qt modules as well.mlt_color_trc, mlt_color_primaries, and more mlt_colorspaces along with functions:
mlt_image_color_trc_namemlt_image_color_trc_idmlt_image_colorspace_namemlt_image_colorspace_idmlt_image_color_pri_namemlt_image_color_pri_idcppcheck.luma transition.affine filter and transition.qtblend transition.avformat module.panner filter for 5.1 channel layout.avformat producer (regression in v7.30.0).kdenlivetitle producer.mask_apply filter with custom transition.input_chmask & output_chmask properties to mono filter.channel_mask property to LADSPA/LV2/VST2 filters.channel_mask to the volume filter.outline video filter.% in the name in qimage producer.decklink consumer.& not decoded to & in the xml producer.avformat module.ladspa module without JACK as dependency.jackrack and ladspa modules.qtblend_mode.qtblend.avformat producer.opencv_tracker filter on cut playlist clips.avfilters that use it (e.g. avfilter.colorspace).qtext filter.avformat producer.melt now exits with 1 if the producer is invalid.melt.-progress2 option for melt.find_package().libgen.c and libgen.h for MSVC.