#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@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@2025.02.19 from yt-dlp/yt-dlp
 yt-dlp is up to date (stable@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
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac

To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to