[FFmpeg-trac] #11493(undetermined:new): ffmpeg causes mkv corruption when remuxing existing MKV with WEBVTT (.vtt) subtitles that have empty cue blocks
FFmpeg
trac at avcodec.org
Thu Mar 6 12:58:38 EET 2025
#11493: ffmpeg causes mkv corruption when remuxing existing MKV with WEBVTT (.vtt)
subtitles that have empty cue blocks
-------------------------------------+-------------------------------------
Reporter: | Type: defect
agH94PeodEE9 |
Status: new | Priority: normal
Component: | Version:
undetermined | unspecified
Keywords: mkv | Blocked By:
corrupted webvtt remux |
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
-If I download - e.g. with yt-dlp - a video (including video, audio, vtt-
subtitle(s) & thumbnail), merge the audio, video & subtitle streams into a
MKV and then remux this MKV to include the thumbnail, the output MKV is
corrupted: timeframes are dropped at different times of the track
How to reproduce:
- Merge WEBVTT subtitle streams together with audio/video streams into a
MKV.
- The WEBVTT subtitles must have empty CUE blocks, as e.g.
{{{
00:00:49.620 --> 00:00:51.620
That's the beginning
00:00:54.120 --> 00:00:56.220
00:00:56.220 --> 00:00:58.220
Reason and rhyme of hide and seek
}}}
- Then, this MKV file must be remuxed to a MKV again, e.g. to include a
thumbnail.
- The result is a corrupted MKV: Timerframes are dropped - most likely
where CUE blocks of WEBVTT subtitles are empty.
- The bug is already documented here:
https://github.com/yt-dlp/yt-dlp/issues/6918#issuecomment-1523817935
- Here is the complete yt-dlp command including ffmpeg commands
{{{
Summary of the bug:
-If I download - e.g. with yt-dlp - a video (including video, audio, vtt-
subtitle(s) & thumbnail), merge the audio, video & subtitle streams into a
MKV and then remux this MKV to include the thumbnail, the output MKV is
corrupted: timeframes are dropped at different times of the track
How to reproduce:
- Merge WEBVTT subtitle streams together with audio/video streams into a
MKV.
- The WEBVTT subtitles must have empty CUE blocks, as e.g.
{{{
00:00:49.620 --> 00:00:51.620
That's the beginning
00:00:54.120 --> 00:00:56.220
00:00:56.220 --> 00:00:58.220
Reason and rhyme of hide and seek
}}}
- Then, this MKV file must be remuxed to a MKV again, e.g. to include a
thumbnail.
- The result is a corrupted MKV: Timerframes are dropped- most likely
where CUE blocks of WEBVTT subtitles are empty.
Here is the complete yt-dlp command including ffmpeg commands
{{{
[debug] Command-line config: ['--format', 'bestvideo*+HLS-audio0-Deutsch
+HLS-audio0-Français+HLS-audio0-Italiano', '--sub-langs', 'de,fr,it,en',
'--parse-metadata', 'mkv_corruption_test_file:%(title)s', '--username',
'PRIVATE', '--password', 'PRIVATE', '--no-part', '--embed-metadata',
'--embed-thumbnail', '--embed-subs', '--audio-multistreams', '--remux-
video', 'mkv', '--concurrent-fragments', '5', '--output',
'mkv_corruption_test_file.%(ext)s', '-vU',
'https://www.playsuisse.ch/watch/804449?episodeId=812574']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error
utf-8, screen utf-8
[debug] yt-dlp version stable at 2025.02.19 from yt-dlp/yt-dlp [4985a4041]
(debian*)
[debug] Python 3.12.7 (CPython x86_64 64bit) - Linux-6.11.0-19-generic-
x86_64-with-glibc2.40 (OpenSSL 3.3.1 4 Jun 2024, glibc 2.40)
[debug] exe versions: ffmpeg 7.0.2 (setts), ffprobe 7.0.2
[debug] Optional libraries: brotli-1.1.0, certifi-2024.06.02,
mutagen-1.46.0, pyxattr-0.8.1, requests-2.32.3, sqlite3-3.46.1,
urllib3-2.0.7
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests
[debug] Loaded 1841 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-
dlp/releases/latest
Latest version: stable at 2025.02.19 from yt-dlp/yt-dlp
yt-dlp is up to date (stable at 2025.02.19 from yt-dlp/yt-dlp)
[PlaySuisse] Requesting session ID
[PlaySuisse] Submitting username
[PlaySuisse] Submitting password
[PlaySuisse] Logging in
[PlaySuisse] Downloading token
[PlaySuisse] Extracting URL:
https://www.playsuisse.ch/watch/804449?episodeId=812574
[PlaySuisse] 812574: Downloading JSON metadata
[PlaySuisse] 812574: Downloading m3u8 information
[info] 812574: Downloading subtitles: de, fr, it
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps,
hdr:12(7), vcodec, channels, acodec, size, br, asr, proto, vext, aext,
hasaud, source, id
[debug] Searching for '(?P<title>.+)' in '%(mkv_corruption_test_file)s'
[MetadataParser] Parsed title from '%(mkv_corruption_test_file)s': 'NA'
[info] 812574: Downloading 1 format(s): HLS-3111+HLS-audio0-Deutsch+HLS-
audio0-Français+HLS-audio0-Italiano
[info] Writing video subtitles to: mkv_corruption_test_file.de.vtt
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f11.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.de.vtt
[download] 100% of 50.55KiB in 00:00:03 at 15.83KiB/s
[info] Writing video subtitles to: mkv_corruption_test_file.fr.vtt
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f12.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.fr.vtt
[download] 100% of 60.41KiB in 00:00:03 at 17.80KiB/s
[info] Writing video subtitles to: mkv_corruption_test_file.it.vtt
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f10.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.it.vtt
[download] 100% of 48.89KiB in 00:00:03 at 15.21KiB/s
[info] Downloading video thumbnail thumbnail-
5ea76155aab1480c8ec1dee1453876b4 ...
[info] Writing video thumbnail thumbnail-5ea76155aab1480c8ec1dee1453876b4
to: mkv_corruption_test_file.jpg
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f6-v1.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.fHLS-3111.mp4
[download] 100% of 1.28GiB in 00:00:13 at 97.29MiB/s
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f7-a1.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.fHLS-audio0-Deutsch.mp4
[download] 100% of 30.22MiB in 00:00:03 at 8.09MiB/s
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f9-a1.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.fHLS-audio0-Français.mp4
[download] 100% of 30.22MiB in 00:00:03 at 7.98MiB/s
[debug] Invoking hlsnative downloader on "https://stipo2-vod-
prod.akamaized.net/stipo/812574_0893624b52c1293545497f2f4b715e12/hdntl=exp=1741344203~acl=%2fstipo%2f812574_0893624b52c1293545497f2f4b715e12%2f*~data=hdntl,allowedCountries%3dswiss~hmac=9176a066e899e650d50baa9af90102e72e50baead1b910fce9134240e1982243/index-f8-a1.m3u8"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 438
[download] Destination: mkv_corruption_test_file.fHLS-audio0-Italiano.mp4
[download] 100% of 30.22MiB in 00:00:03 at 8.53MiB/s
[debug] ffmpeg command line: ffprobe -show_streams
file:mkv_corruption_test_file.fHLS-audio0-Deutsch.mp4
[debug] ffmpeg command line: ffprobe -show_streams
'file:mkv_corruption_test_file.fHLS-audio0-Français.mp4'
[debug] ffmpeg command line: ffprobe -show_streams
file:mkv_corruption_test_file.fHLS-audio0-Italiano.mp4
[Merger] Merging formats into "mkv_corruption_test_file.mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i
file:mkv_corruption_test_file.fHLS-3111.mp4 -i
file:mkv_corruption_test_file.fHLS-audio0-Deutsch.mp4 -i
'file:mkv_corruption_test_file.fHLS-audio0-Français.mp4' -i
file:mkv_corruption_test_file.fHLS-audio0-Italiano.mp4 -c copy -map 0:v:0
-map 1:a:0 -bsf:a:0 aac_adtstoasc -map 2:a:0 -bsf:a:1 aac_adtstoasc -map
3:a:0 -bsf:a:2 aac_adtstoasc -movflags +faststart
file:mkv_corruption_test_file.temp.mkv
Deleting original file mkv_corruption_test_file.fHLS-3111.mp4 (pass -k to
keep)
Deleting original file mkv_corruption_test_file.fHLS-audio0-Deutsch.mp4
(pass -k to keep)
Deleting original file mkv_corruption_test_file.fHLS-audio0-Français.mp4
(pass -k to keep)
Deleting original file mkv_corruption_test_file.fHLS-audio0-Italiano.mp4
(pass -k to keep)
[VideoRemuxer] Not remuxing media file "mkv_corruption_test_file.mkv";
already is in target format mkv
[EmbedSubtitle] Embedding subtitles in "mkv_corruption_test_file.mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i
file:mkv_corruption_test_file.mkv -i file:mkv_corruption_test_file.de.vtt
-i file:mkv_corruption_test_file.fr.vtt -i
file:mkv_corruption_test_file.it.vtt -map 0 -dn -ignore_unknown -c copy
-map -0:s -map 1:0 -metadata:s:s:0 language=deu -map 2:0 -metadata:s:s:1
language=fra -map 3:0 -metadata:s:s:2 language=ita -movflags +faststart
file:mkv_corruption_test_file.temp.mkv
Deleting original file mkv_corruption_test_file.fr.vtt (pass -k to keep)
Deleting original file mkv_corruption_test_file.it.vtt (pass -k to keep)
Deleting original file mkv_corruption_test_file.de.vtt (pass -k to keep)
[Metadata] Adding metadata to "mkv_corruption_test_file.mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i
file:mkv_corruption_test_file.mkv -map 0 -dn -ignore_unknown -c copy
-write_id3v1 1 -metadata title=NA -metadata 'description=Luc fehlen zwar
handfeste Beweise, aber er ist sicher, dass der korrupte Anwalt Lorenz
Ilgner etwas mit dem Mord an seinem besten Freund Bernhard Mäder zu tun
hat. Ein persönliches Treffen mit dem aalglatten Erfolgstyp endet
handgreiflich: Luc packt Ilgner am Kragen. In der folgenden Nacht wird Luc
von Puffmutter Adriana Wanner, einer ehemaligen Schulkollegin, in ein
Luxusbordell bestellt, um dort einen Toten abzuholen. Zu seiner
Riesenüberraschung handelt es sich um Lorenz Ilgner. Ehe Luc Hilfe holen
kann, um die Leiche abzutransportieren, marschiert bereits die Polizei mit
Anna-Maria an der Spitze im Club auf. Adriana Wanner hat die
Kriminalbeamtin in ihr Etablissement bestellt und Luc schwer belastet: Der
Bestatter höchstpersönlich habe Lorenz Ilgner umgebracht. Anna-Maria
bleibt nichts anderes übrig, als Luc zu verhaften.
Die resolute Erika ist schockiert. Sie besucht Luc im Gefängnis und
informiert ihn über die Lage im Institut. Ihre selbstgebackene Rüeblitorte
versöhnt Luc ein bisschen mit der Welt. Vertrauensvoll legt er die
Bestattung eines jungen Lehrers und den damit verbundenen Auftrag, ein
Referat über den Tod in der Schule zu halten, in ihre und Fabios Hände.
Luc gelingt es, Anna-Maria davon zu überzeugen, dass er in eine Falle
gelockt wurde. Sie glaubt an seine Unschuld und erwirkt bei Staatsanwalt
Odermatt seine Freilassung. Luc ist verblüfft, dass Regina Ilgner, die
Witwe des ermordeten Anwalts, ausgerechnet ihn mit der Bestattung
beauftragt. Die geheimnisvolle Frau weiss sehr viel mehr, als sie zugeben
mag. In ihrem Haus stösst Luc auf eine alte Geschichte im Umfeld eines
Pontonier-Clubs, die seinem Fall eine überraschende Wendung gibt und ihn
auf eine ganz neue Spur führt.
Der Mörder von Illgner setzt unterdessen alles daran, Mitwisser und Zeugen
auszuschalten, und schreckt nicht vor weiteren Anschlägen zurück. Dabei
gerät auch Anna-Maria in tödliche Gefahr.' -metadata 'synopsis=Luc fehlen
zwar handfeste Beweise, aber er ist sicher, dass der korrupte Anwalt
Lorenz Ilgner etwas mit dem Mord an seinem besten Freund Bernhard Mäder zu
tun hat. Ein persönliches Treffen mit dem aalglatten Erfolgstyp endet
handgreiflich: Luc packt Ilgner am Kragen. In der folgenden Nacht wird Luc
von Puffmutter Adriana Wanner, einer ehemaligen Schulkollegin, in ein
Luxusbordell bestellt, um dort einen Toten abzuholen. Zu seiner
Riesenüberraschung handelt es sich um Lorenz Ilgner. Ehe Luc Hilfe holen
kann, um die Leiche abzutransportieren, marschiert bereits die Polizei mit
Anna-Maria an der Spitze im Club auf. Adriana Wanner hat die
Kriminalbeamtin in ihr Etablissement bestellt und Luc schwer belastet: Der
Bestatter höchstpersönlich habe Lorenz Ilgner umgebracht. Anna-Maria
bleibt nichts anderes übrig, als Luc zu verhaften.
Die resolute Erika ist schockiert. Sie besucht Luc im Gefängnis und
informiert ihn über die Lage im Institut. Ihre selbstgebackene Rüeblitorte
versöhnt Luc ein bisschen mit der Welt. Vertrauensvoll legt er die
Bestattung eines jungen Lehrers und den damit verbundenen Auftrag, ein
Referat über den Tod in der Schule zu halten, in ihre und Fabios Hände.
Luc gelingt es, Anna-Maria davon zu überzeugen, dass er in eine Falle
gelockt wurde. Sie glaubt an seine Unschuld und erwirkt bei Staatsanwalt
Odermatt seine Freilassung. Luc ist verblüfft, dass Regina Ilgner, die
Witwe des ermordeten Anwalts, ausgerechnet ihn mit der Bestattung
beauftragt. Die geheimnisvolle Frau weiss sehr viel mehr, als sie zugeben
mag. In ihrem Haus stösst Luc auf eine alte Geschichte im Umfeld eines
Pontonier-Clubs, die seinem Fall eine überraschende Wendung gibt und ihn
auf eine ganz neue Spur führt.
Der Mörder von Illgner setzt unterdessen alles daran, Mitwisser und Zeugen
auszuschalten, und schreckt nicht vor weiteren Anschlägen zurück. Dabei
gerät auch Anna-Maria in tödliche Gefahr.' -metadata
'purl=https://www.playsuisse.ch/watch/804449?episodeId=812574' -metadata
'comment=https://www.playsuisse.ch/watch/804449?episodeId=812574'
-metadata 'artist=Markus Fischer' -metadata 'show=Der Bestatter' -metadata
season_number=1 -metadata 'episode_id=Stachel im Fleisch' -metadata
episode_sort=4 -metadata:s:1 language=deu -metadata:s:2 language=fra
-metadata:s:3 language=ita -movflags +faststart
file:mkv_corruption_test_file.temp.mkv
[debug] ffprobe command line: ffprobe -hide_banner -show_format
-show_streams -print_format json file:mkv_corruption_test_file.mkv
[EmbedThumbnail] ffmpeg: Adding thumbnail to
"mkv_corruption_test_file.mkv"
[debug] ffmpeg command line: ffmpeg -y -loglevel repeat+info -i
file:mkv_corruption_test_file.mkv -map 0 -dn -ignore_unknown -c copy
-attach file:mkv_corruption_test_file.jpg -metadata:s:7
mimetype=image/jpeg -metadata:s:7 filename=cover.jpg -movflags +faststart
file:mkv_corruption_test_file.temp.mkv
[1]+ Done yt-dlp --format "bestvideo*+HLS-
audio0-Deutsch+HLS-audio0-Français+HLS-audio0-Italiano" --sub-langs
de,fr,it,en --parse-metadata "mkv_corruption_test_file:%(title)s"
--username 'PRIVATE' --password 'PRIVATE' --no-part --embed-metadata
--embed-thumbnail --embed-subs --audio-multistreams --remux-video mkv
--concurrent-fragments 5 --output "mkv_corruption_test_file.%(ext)s" -vU
https://www.playsuisse.ch/watch/804449?episodeId=812574
}}}
Patches should be submitted to the ffmpeg-devel mailing list and not this
bug tracker.
}}}
Patches should be submitted to the ffmpeg-devel mailing list and not this
bug tracker.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/11493>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list