mlt segfaults at end of program execution
Describe the bug
mlt segfaults at the end of the program execution, whether the command melt is executed itself, or is given additional parameters.
To Reproduce
Steps to reproduce the behavior:
- Run
meltas a standalone command.
Expected behavior
When run without arguments, for it to print out usage information and exit cleanly. When run with arguments, for it to render the video as specified via the given script file.
Desktop (please complete the following information):
- OS: Arch
- OS Version
6.17.8-arch1-1 - MLT/melt version:
7.34.1
Additional context
I first noticed this when trying to render a video in Kdenlive. From further investigation I found that mlt is segfaulting when run. The command that was being run from Kdenlive to render the video was,
$ melt -loglevel verbose -progress2 ~/Videos/kdenlive-renderqueue/export-1.mlt
Running this exact same command results in a segfault near the end of the program's execution,
[libx264 @ 0x7fe290201a00] i8c dc,h,v,p: 100% 0% 0% 0%
[libx264 @ 0x7fe290201a00] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fe290201a00] kb/s:223.17
[aac @ 0x7fe290202cc0] Qavg: 65536.000
[AVIOContext @ 0x7fe29038ba80] Statistics: 842396 bytes written, 4 seeks, 7 writeouts
[1] 37542 segmentation fault (core dumped) melt -loglevel verbose -progress2 ~/Videos/kdenlive-renderqueue/export-1.mlt
Even running melt with no arguments results in a similar error,
$ melt
...
-timings Set the logging level to timings
-version Show the version and copyright
-video-track | -hide-audio Add a video-only track
For more help: <https://www.mltframework.org/>
[1] 46685 segmentation fault (core dumped) melt
From running melt under GDB I was able to get the following backtrace,
[~]$ gdb melt
GNU gdb (GDB) 16.3
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from melt...
(gdb) r
Starting program: /usr/bin/melt
Usage: 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 position
-progress2 Display progress along with position on a new line
-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 "links" | "link"=id List links or show info about one
-query "producers" | "producer"=id List producers or show info about one
-query "transitions" | "transition"=id List transitions, show info about one
-query "profiles" | "profile"=id List profiles, show info about one
-query "presets" | "preset"=id List presets, 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
-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
-timings Set the logging level to timings
-version Show the version and copyright
-video-track | -hide-audio Add a video-only track
For more help: <https://www.mltframework.org/>
[Thread 0x7fffd79ff6c0 (LWP 36593) exited]
Thread 1 "melt" received signal SIGSEGV, Segmentation fault.
0x00007ffff056a5f8 in QCoreApplication::notifyInternal2 (receiver=0x55555556f970, event=0x7fffffffdb50)
at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1109
1109 return qApp->notify(receiver, event);
(gdb)
(gdb) bt -full 16
#0 0x00007ffff056a5f8 in QCoreApplication::notifyInternal2 (receiver=0x55555556f970, event=0x7fffffffdb50)
at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1109
d = <optimized out>
threadData = 0x55555594bfe0
selfRequired = <optimized out>
result = false
cbdata = {0x55555556f970, 0x7fffffffdb50, 0x7fffffffdaef}
scopeLevelCounter = {threadData = 0x55555594bfe0}
#1 0x00007ffff05c532b in QCoreApplication::sendEvent (receiver=<optimized out>, event=0x7fffffffdb50)
at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1549
No locals.
#2 QObjectPrivate::setParent_helper (this=0x555555ab1140, o=0x0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:2255
e = {<QEvent> = {_vptr.QEvent = 0x7ffff0a25f28 <vtable for QChildEvent+16>, static staticMetaObject = {d = {superdata = {direct = 0x0},
stringdata = 0x7ffff08df568 <QEvent::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN6QEventE_t>+1512>,
data = 0x7ffff08def80 <QEvent::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN6QEventE_t>>, static_metacall = 0x0,
relatedMetaObjects = 0x0,
metaTypes = 0x7ffff0a26180 <QEvent::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN6QEventE_t>>,
extradata = 0x0}}, t = 71, m_posted = false, m_spont = false, m_accept = true, m_unused = false, m_reserved = 0, m_inputEvent = 0,
m_pointerEvent = 0, m_singlePointEvent = 0}, c = 0x5555559599b0}
index = <optimized out>
parentD = 0x555555718730
q = <optimized out>
__PRETTY_FUNCTION__ = <optimized out>
#3 0x00007ffff05c316c in QObject::~QObject (this=<optimized out>, this=<optimized out>)
at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:1128
d = <optimized out>
sharedRefcount = <optimized out>
cd = <optimized out>
d = <optimized out>
sharedRefcount = <optimized out>
cd = <optimized out>
ownThread = <optimized out>
privThread = <optimized out>
signalSlotMutex = <optimized out>
locker = <optimized out>
receiverCount = <optimized out>
signal = <optimized out>
connectionList = <optimized out>
c = <optimized out>
m = <optimized out>
needToUnlock = <optimized out>
node = <optimized out>
sender = <optimized out>
m = <optimized out>
needToUnlock = <optimized out>
senderData = <optimized out>
slotObj = <optimized out>
locksAreTheSame = <optimized out>
#4 0x00007fffd7e17385 in QtWaylandClient::QWaylandGlibEventDispatcher::~QWaylandGlibEventDispatcher (this=<optimized out>, this=<optimized out>)
at /usr/src/debug/qt6-base/build/src/plugins/platforms/wayland/WaylandClient_autogen/EWIEGA46WW/../../../../../../../qtbase/src/plugins/platforms/wayland/qwaylandeventdispatcher_p.h:55
No locals.
#5 QtWaylandClient::QWaylandGlibEventDispatcher::~QWaylandGlibEventDispatcher (this=<optimized out>, this=<optimized out>)
at /usr/src/debug/qt6-base/build/src/plugins/platforms/wayland/WaylandClient_autogen/EWIEGA46WW/../../../../../../../qtbase/src/plugins/platforms/wayland/qwaylandeventdispatcher_p.h:55
No locals.
#6 0x00007ffff072e13f in operator() (__closure=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:492
d = 0x5555558f0e10
locker = {m_mutex = <optimized out>, m_isLocked = false}
eventDispatcher = 0x5555559599b0
this = <optimized out>
#7 (anonymous namespace)::terminate_on_exception<QThreadPrivate::cleanup()::<lambda()> >(struct {...} &&) (t=...)
at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:367
No locals.
#8 0x00007ffff07308d8 in QThreadPrivate::cleanup (this=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:475
No locals.
#9 destroy_current_thread_data (data=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:174
thread_p = <optimized out>
thread = <optimized out>
#10 (anonymous namespace)::QThreadDataDestroyer::EarlyMainThread::~EarlyMainThread (this=<optimized out>, this=<optimized out>)
--Type <RET> for more, q to quit, c to continue without paging--
at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:232
data = <optimized out>
data = <optimized out>
#11 0x00007ffff7c40c71 in __run_exit_handlers (status=1, listp=0x7ffff7e08680 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true,
run_dtors=run_dtors@entry=true) at exit.c:118
atfct = <optimized out>
onfct = <optimized out>
cxafct = <optimized out>
arg = <optimized out>
f = <optimized out>
new_exitfn_called = 804
cur = 0x555555718b30
restart = <optimized out>
#12 0x00007ffff7c40d4e in __GI_exit (status=<optimized out>) at exit.c:148
No locals.
#13 0x00007ffff7c2763c in __libc_start_call_main (main=main@entry=0x555555556020 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffde88)
at ../sysdeps/nptl/libc_start_call_main.h:74
result = <optimized out>
unwind_buf = {cancel_jmp_buf = {{jmp_buf = {0, -326869677258909579, 140737488346760, 1, 140737354125312, 93824992262872, -326869677349087115,
-326887306860636043}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x7fffffffde88}, data = {prev = 0x0, cleanup = 0x0,
canceltype = 0}}}
not_first_call = <optimized out>
#14 0x00007ffff7c276e9 in __libc_start_main_impl (main=0x555555556020 <main>, argc=1, argv=0x7fffffffde88, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffde78) at ../csu/libc-start.c:360
No locals.
#15 0x0000555555557e45 in _start ()
No symbol table info available.
Below is the package details of mlt installed on my system,
[~]$ pacman -Qi mlt
Name : mlt
Version : 7.34.1-1
Description : An open source multimedia framework
Architecture : x86_64
URL : https://www.mltframework.org
Licenses : LGPL-2.1-only
Groups : None
Provides : None
Depends On : gcc-libs glibc libebur128
Optional Deps : ffmpeg: ffmpeg plugin [installed]
fftw: plus plugin [installed]
fontconfig: gdk plugin [installed]
frei0r-plugins: for additional effects [installed]
gdk-pixbuf2: gdk plugin [installed]
glib2: gdk plugin [installed]
jack: JACK sound output plugin [installed]
ladspa: LADSPA plugins [installed]
libepoxy: opengl plugin [installed]
libexif: auto rotate plugin [installed]
libglvnd: opengl plugin [installed]
libsamplerate: libavresample plugin [installed]
libvorbis: vorbis plugin [installed]
libx11: SDL1 plugin [installed]
libxml2: XML plugin [installed]
movit: opengl plugin [installed]
opencv: openCV plugin [installed]
qt5-base: QT5 plugins [installed]
qt5-svg: Qt5 plugins [installed]
qt6-base: Qt6 plugin [installed]
qt6-5compat: Qt6 plugin [installed]
qt6-svg: Qt6 plugin [installed]
pango: gdk plugin [installed]
python: python bindings [installed]
rtaudio: rtaudio plugin [installed]
rubberband: audio pitch plugin [installed]
sdl2: SDL2 plugin [installed]
sdl_image: SDL1 plugin [installed]
sdl12-compat: SDL1 plugin [installed]
sox: SOX (Audio Swiss Army Knife) plugin [installed]
vid.stab: video stabilize plugin [installed]
zlib: glaxnimate plugin [installed]
Required By : kdenlive shotcut
Optional For : None
Conflicts With : None
Replaces : None
Installed Size : 9.68 MiB
Packager : Antonio Rojas <[email protected]>
Build Date : Wed 05 Nov 2025 17:15:43 GMT
Install Date : Tue 25 Nov 2025 09:21:29 GMT
Install Reason : Explicitly installed
Install Script : No
Validated By : Signature
I've looked around the Internet and haven't come across anyone else experiencing a similar error, so I have a feeling the problem might be with my system and the libraries I have installed, though I don't know what. I first noticed this error after doing a system upgrade, so this only furthers my suspicions about the problem being with something on my end.
Bug Confirmation: melt 7.34.1 Segfault
Confirmed the segfault issue on Arch Linux with melt 7.34.1. Reverting to 7.32.0 fixes it.
Environment
- OS: Arch Linux (kernel 6.17.8-arch1-1)
- melt 7.34.1: Broken
- melt 7.32.0: Working
- Test file: MP4 with AAC audio
Verified Logs
melt 7.34.1 - Segfault on preview:
$ timeout 10 melt "/mnt/videos/Editing/Pickup/2024/Faridkot/1721756229824.mp4"
[aac @ 0x7fa1a85a8c80] Could not update timestamps for skipped samples.
Current Frame: ... (progress)
timeout: the monitored command dumped core
melt 7.34.1 - Encoding sometimes works, sometimes segfaults:
$ melt "/mnt/videos/Editing/Pickup/2024/Faridkot/1721756229824.mp4" -consumer avformat:/tmp/test.mp4 vcodec=libx264 acodec=none
[aac @ 0x7f117839eac0] Could not update timestamps for skipped samples.
Current Position: 750
zsh: segmentation fault (core dumped)
melt 7.32.0 - Preview works:
$ timeout 10 melt "/mnt/videos/Editing/Pickup/2024/Faridkot/1721756229824.mp4"
[aac @ 0x7fdd9c5b7c00] Could not update timestamps for skipped samples.
Current Frame: ... (progress to frame 303, no segfault)
Workaround
Downgrade to melt 7.32.0:
# Download from https://archive.archlinux.org/packages/m/mlt/mlt-7.32.0-6-x86_64.pkg.tar.zst
sudo pacman -U mlt-7.32.0-6-x86_64.pkg.tar.zst
The bug affects both preview and encoding modes inconsistently. Shotcut fails because it uses melt for rendering. Regression between 7.32.0 and 7.34.1.
In the first post the following suggests the file was actually written OK as it is a x264 end-of-job summary from FFmpeg libs:
[libx264 @ 0x7fe290201a00] i8c dc,h,v,p: 100% 0% 0% 0% [libx264 @ 0x7fe290201a00] Weighted P-Frames: Y:0.0% UV:0.0% [ libx264 @ 0x7fe290201a00] kb/s:223.17 [aac @ 0x7fe290202cc0] Qavg: 65536.000 [AVIOContext @ 0x7fe29038ba80] Statistics: 842396 bytes written, 4 seeks, 7 writeouts
That and the backtrace suggests something fails during cleanup at exit (even though it is not required; kernel will cleanup). The posted backtrace does not show any MLT function names. Please test adding melt command line option -abort that tells it to exit abruptly, reducing the cleanup. However, it appears that Qt has installed something using atexit().
Shotcut fails because it uses melt for rendering.
Test one of Shotcut's builds (not Arch package).
I cannot reproduce crash running MLT from master on Arch and Manjaro.
Encoding works. Preview only the audio works, the video I get a black screen. (But that is another issue.)
@frdbr Are you running Wayland? I think you are using nvidia too, right?
@frdbr Are you running Wayland? I think you are using nvidia too, right?
Yup, both Wayland and Nvidia.
I have exactly that problem, archlinux, wayland and amd+nvidia gpus. I can check if disabling nvidia makes any difference
I get the same problem on Arch + Wayland + AMD GPU.
$ fastfetch
-` nick@nimo
.o+` ---------
`ooo/ OS: Arch Linux x86_64
`+oooo: Host: N155L (Version 1.0)
`+oooooo: Kernel: Linux 6.17.9-arch1-1
-+oooooo+: Uptime: 50 mins
`/:-:++oooo+: Packages: 954 (pacman)
`/++++/+++++++: Shell: zsh 5.9
`/++++++++++++++: Display (BOE0C4E): 1920x1080 in 15", 60 Hz [Built-in]
`/+++ooooooooooooo/` WM: niri (Wayland)
./ooosssso++osssssso+` Cursor: default (24px)
.oossssso-````/ossssss+` Terminal: ghostty 1.2.3-arch2
-osssssso. :ssssssso. Terminal Font: Inconsolata Nerd Font (10pt)
:osssssss/ osssso+++. CPU: AMD Ryzen 7 6800H (16) @ 4.79 GHz
/ossssssss/ +ssssooo/- GPU: AMD Radeon 680M [Integrated]
`/ossssso+/:- -:/+osssso+- Memory: 2.42 GiB / 30.59 GiB (8%)
`+sso+:-` `.-/+oso: Swap: 0 B / 4.00 GiB (0%)
`++:. `-/+/ Disk (/): 43.25 GiB / 914.82 GiB (5%) - ext4
.` `/ Local IP (wlan0): 192.168.50.213/24
Battery (SR Real Battery): 54% (2 hours, 58 mins remaining) [Discharging]
Locale: en_US.UTF-8
nick@nimo ~ $ pacman -Q --info mlt
Name : mlt
Version : 7.34.1-1
Description : An open source multimedia framework
Architecture : x86_64
URL : https://www.mltframework.org
Licenses : LGPL-2.1-only
Groups : None
Provides : None
Depends On : gcc-libs glibc libebur128
Optional Deps : ffmpeg: ffmpeg plugin [installed]
fftw: plus plugin [installed]
fontconfig: gdk plugin [installed]
frei0r-plugins: for additional effects [installed]
gdk-pixbuf2: gdk plugin [installed]
glib2: gdk plugin [installed]
jack: JACK sound output plugin [installed]
ladspa: LADSPA plugins [installed]
libepoxy: opengl plugin [installed]
libexif: auto rotate plugin [installed]
libglvnd: opengl plugin [installed]
libsamplerate: libavresample plugin [installed]
libvorbis: vorbis plugin [installed]
libx11: SDL1 plugin [installed]
libxml2: XML plugin [installed]
movit: opengl plugin [installed]
opencv: openCV plugin
qt5-base: QT5 plugins [installed]
qt5-svg: Qt5 plugins [installed]
qt6-base: Qt6 plugin [installed]
qt6-5compat: Qt6 plugin [installed]
qt6-svg: Qt6 plugin [installed]
pango: gdk plugin [installed]
python: python bindings [installed]
rtaudio: rtaudio plugin
rubberband: audio pitch plugin [installed]
sdl2: SDL2 plugin [installed]
sdl_image: SDL1 plugin
sdl12-compat: SDL1 plugin
sox: SOX (Audio Swiss Army Knife) plugin
vid.stab: video stabilize plugin [installed]
zlib: glaxnimate plugin [installed]
Required By : shotcut
Optional For : None
Conflicts With : None
Replaces : None
Installed Size : 9.68 MiB
Packager : Antonio Rojas <[email protected]>
Build Date : Wed 05 Nov 2025 12:15:43 PM EST
Install Date : Mon 01 Dec 2025 08:32:18 AM EST
Install Reason : Installed as a dependency for another package
Install Script : No
Validated By : Signature
nick@nimo ~ $ pacman -Q --info shotcut
Name : shotcut
Version : 25.10.31-1
Description : Cross-platform Qt based Video Editor
Architecture : x86_64
URL : https://www.shotcut.org
Licenses : GPL3
Groups : None
Provides : None
Depends On : qt6-base qt6-declarative qt6-imageformats qt6-multimedia qt6-translations mlt movit ffmpeg libx264 libvpx
lame frei0r-plugins ladspa qt6-charts qt6-websockets
Optional Deps : swh-plugins: Several audio filters
opencv: For motion tracking
Required By : None
Optional For : None
Conflicts With : None
Replaces : None
Installed Size : 28.34 MiB
Packager : Leonidas Spyropoulos <[email protected]>
Build Date : Fri 07 Nov 2025 06:27:40 PM EST
Install Date : Mon 01 Dec 2025 08:32:18 AM EST
Install Reason : Explicitly installed
Install Script : No
Validated By : Signature
https://github.com/mltframework/shotcut/issues/1759 has more details.
I made a change that might have fixed this, but I have no way of knowing. I do not have an Arch system, but I have a PC with an AMD card that is only a couple of years old. I was hoping to repro this from a live USB, but I have not been able to install it in a live scenario thus far. I did not reproduce it with a Garuda VirtualBox I had and updated.
It would be nice if someone can build and test it. Maybe ask the Arch maintainer to make a patch for the package from the commit 5646c2f.
melt still calls the same thing that atexit() was calling. However, with the patch applied (or git master build), you can run melt with the -abort option to disable cleanup at the end. It still writes and closes the output file, but abort makes it exit without bothering to close threads and free memory, which is not necessary because the kernel automatically cleans up those things from exited processes.
Based on your comments it sounds like this patch would be ok to release as is because you confirmed the Linux kernel will free this up, it wouldn't be specific to a distro like Arch? Are mostly Arch users reporting this because Arch typically provides the latest release of a package? Other distros might be using an older release that's not affected. I only do web development with Python and Ruby so I'm not sure how memory management is done at the OS level. Sorry for the dumb question here but, are you sure this won't cause a memory leak?
Side topic about Arch, I'm fairly new to it, typically the official Arch repos are dedicated to the latest stable release of a package. However, there is the AUR which is self-guided and can contain anything. Packages from the AUR typically get compiled on the end user's machine. Oftentimes projects use this to push their latest main commits so folks can test it out before a stable release lands in the main package repository. You become your own package maintainer with the AUR.
With that said, AUR packages can be created without needing to push them anywhere by following https://wiki.archlinux.org/title/Creating_packages. It really comes down to adding AUR specific files in specific locations and making sure your build scripts can run successfully (all dependencies are installed, etc.).
Today I installed Omarchy on a USB hard drive on my PC with an AMD Radeon RX 7600, and I did not reproduce the problem. It is using the latest arch packages including mlt 7.34.1. Of course, it is using wayland but under hyprland if that matters. I also installed Shotcut, and I can export without failure. Probably some other software installed even though omarchy installs a lot initially. Or something else is different about the environment. I have no plan for what else to do for this; someone who has the problem should try doing something.
What can we do? A few of us reported the issue who are using Arch.
Is there more system information you want from us?
I'm not using Omarchy btw. It's vanilla Arch with the ISO from their official site. I'm using Niri which is a scrolling window manager.
Maybe you can try using the official Arch ISO instead of Omarchy since Omarchy installs a million packages it will be more difficult to figure out what the discrepancy is.
Looks like Omarchy sets a ton of environment variables that configure certain things related to Wayland at https://github.com/basecamp/omarchy/blob/master/default/hypr/envs.conf.
I don't have any of those set. Maybe you can try unsetting all of those and relogging back in, then seeing if that makes a difference?
Those environment variables either set hyprland things or force wayland usage in libs. I am not doing anything else for this. I know you are not using Omarchy, and that is not the point. If you really want me to use exactly your setup then you need to send me your computer. What you or others can do is compile MLT, reproduce it from your build, and then you can try changes beginning with what I mentioned previously. You do not need to make a package, and I am not going to make a package.
Alright, hopefully someone with more knowledge will be able to help you isolate the problem with your library.
It is reproducible btw, it has happened 8 out of 8 times when I tried.
Maybe you can run a git bisect on your code base because someone else in this thread confirmed 7.32.0 works. Maybe something got broken in between that build and the latest one. GitHub makes it easy to see all the changes between those releases: https://github.com/mltframework/mlt/compare/v7.32.0...v7.34.1
Do you know how git bisect works? You need to be able to reproduce the problem. If you can reproduce it then you do it.
Sorry, I don't know C. It's not easy for an outsider to jump into a 13+ year old project and fix a bug in a library of a program they're using. That's why I mentioned hopefully someone with more knowledge can help you with figure out where the bug is. I was trying to provide whatever help I could by mentioning how to see a diff of commits between a known working version the latest version.
Nick, thank you for your interest and attempt to help. Hopefully, you will not need to know C to make a build and try some things with my help. Are you down for that? If so, clone the git repo and try to compile it using the README. Don’t worry yet about trying to install and run it. Just get it to compile on your system and I’ll guide you from there. Pretty please?
It compiled after tracking down a number of dependencies it needed. On my system I had to install sudo pacman -Syu movit eigen3 sox.
[ 99%] Building C object src/modules/xml/CMakeFiles/mltxml.dir/producer_xml-clip.c.o
[100%] Linking C shared module ../../../out/lib/mlt/libmltxml.so
[100%] Built target mltxml
A ton of warnings were thrown though, there's too many to paste.
I wasn't sure how to install it in a way where Shotcut would use it. I compiled it where the latest commit is a2541fea32be993f69d4aca0460cd7e79c638952 (the opacity change from Dec 6th).
Great! As I said, do not install it because you do not want to mess up your clean system. Following the README, next in a terminal cd to the mlt dir, and run source setenv (the README says . setenv, which is equivalent shorthand). You can cat setenv to understand a little. It sets environment variables that will tell melt where to look for things, most importantly dynamically loaded libs a.k.a. plugins that are not installed.
Now, run melt -query, and that will list all of the plugins. It should be a rather long list and not show "segmentation fault (core dumped)" as reported above. Did it? Immediately after executing that command, you can echo $? to print melt's exit code, which should be 0.
If you still get an error, run melt -query -abort and see if the problem still occurs.
Thank you
melt -query ran successfully, it exited cleanly with no errors.
What's the next step to see if it works with Shotcut's exports?
Btw just a heads up, I use zsh and . setenv did not work, it says file not found. Using source setenv works, but also if you want to use . you need to explicitly reference the relative path with ./ so . ./setenv works as well. Apparently zsh's . won't look in the current directory by default. You might want to update the docs to use source or add ./ to your path with ..
You can't easily, and I am not going to try to walk you through that. Instead, you should test the Shotcut 25.12 beta: https://github.com/mltframework/shotcut/releases/tag/v25.12.2
I suggest the AppImage. If instead you choose portable, you need to run Shotcut.app/shotcut and NOT Shotcut.app/bin/shotcut.
However, none of these guarantees the next Arch package update will still not have the problem. I think to verify that you need to get its PKGBUILD file, update it to git master, build and install it.
Ok, in that case I'm going to remove the build dependencies and call it a day.
I'll wait until the Arch repos have a version that doesn't crash and check out alternatives in the meantime. I do not want to use an AppImage, no other software on my system requires using that.
Thanks.
No other mainstream operating systems expect developers to run hundreds of software distributions and debug their packages. Should I say I am not doing anything for Arch and I can only help you if you run CentOS like Blackmagic Design does? It is not really a big deal to download a single file and execute it. I see you are a Docker user. It is like that but more for desktop apps and even easier. Why the double standard?
Docker helps me build and run my multi-service web apps in a reproducible way. I personally don't use it as a runtime for system level tools or desktop-tier apps, although technically it is capable of that.
The difference here is every package and tool on this system is working except this library. You're asking me to stop using Arch's mechanism for distributing tools and make a 1 off exception.
For fun I did download the AppImage (v25.10) and it didn't crash on export, but I don't have Fuse and I had to extract the whole thing somewhere. Now I have a 750mb directory on my system and no way to launch Shotcut efficiently unless I figure out how to integrate that into my app launcher.
Then I would have to write a whole custom set of shell scripts to automate downloading it from GitHub and also research how to verify the file hasn't been tampered with by making sure it's signed by the creator. Basically reinventing a small package manager.
Personally I'd rather have the app crash than do all of that long term. I feel fortunate the crash is only mostly cosmetic since the editor and video appear to work.
When you asked me to build the package locally, did you gain new knowledge about what's causing Shotcut to crash?
When you asked me to build the package locally, did you gain new knowledge about what's causing Shotcut to crash?
Not really. You would need to switch to the release tag and rebuild to see if it crashes. All we know is that building the git master does not crash on exit, but we do not know if it is related to how the package is built or the changes since the release.
Is the expectation that if it were built with the latest release's tag it would have crashed when running the query command and this query command is running the same code path Shotcut uses on export and is also related to the 1 line change you made?
How can I tell which version of mlt is used by the AppImage? I downloaded v25.10.31 which is the same version as the Arch package. In theory both should be using the same mlt version right? But in practice 1 crashes and 1 does not.
I have the same issues with mlt on my Arch system (mlt version 7.34.1-1). So I tried building it directly from source as described in the README. Then, I called setenv in a fresh Bash instance. Here, Melt no longer segfaults. Also when starting Kdenlive in the Bash instance, it no longer reports an error at the end of rendering. So everything works.
The interesting thing is, when building from source, both the current master and v7.34.1 works. So I can't reproduce the issue when doing a fresh build from source and I guess there is an issue specific to the Arch packaging of mlt.
Next, I will try building mlt on Arch using the Arch package itself.
The arch package has 25.10.31-1 built on Nov 7th 2025 but someone flagged it out of date on December 3rd 2025. The shotcut GitHub release shows v25.10.31 as being created on October 31st 2025 but an AppImage was created on Nov 2nd 2025 along with updating the md5 checksums.
Did something change between Oct 31st and Nov 2nd where new code was added to the AppImage and maybe the Arch package was built with whatever existed on Oct 31st?