Opened 12 months ago
Last modified 12 months ago
#10365 new defect
Order of metadata in mkv changes on its own
Reported by: | yumu | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avformat |
Version: | git-master | Keywords: | mkv matroska metadata order |
Cc: | Blocked By: | ||
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description (last modified by )
Summary of the bug:
The order of metadata changes on its own each time mkv is processed.
I think it's a mkv (matroska) problem because it didn't reproduce for avi, mov, mp4, ogg containers.
I don't think metadata should be reordered unintentionally.
How to reproduce:
- Create a mkv with some metadata. (or an existing one)
ffmpeg -f lavfi -i smptehdbars=d=2 -f lavfi -i sine=d=2 -metadata artist=ARTIST -metadata comment=COMMENT -metadata date=20230101 ".mkv"
- Copy
> ffmpeg -i ".mkv" -c copy "copied.mkv" ffmpeg version N-110589-g30c71ef98e-20230514 Copyright (c) 2000-2023 the FFmpeg developers built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf) configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514 libavutil 58. 7.100 / 58. 7.100 libavcodec 60. 11.100 / 60. 11.100 libavformat 60. 5.100 / 60. 5.100 libavdevice 60. 2.100 / 60. 2.100 libavfilter 9. 8.100 / 9. 8.100 libswscale 7. 2.100 / 7. 2.100 libswresample 4. 11.100 / 4. 11.100 libpostproc 57. 2.100 / 57. 2.100 Input #0, matroska,webm, from '.mkv': Metadata: DATE : 20230101 ARTIST : ARTIST COMMENT : COMMENT ENCODER : Lavf60.5.100 Duration: 00:00:02.00, start: 0.000000, bitrate: 43 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn Metadata: ENCODER : Lavc60.11.100 libx264 DURATION : 00:00:02.003000000 Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp Metadata: ENCODER : Lavc60.11.100 libvorbis DURATION : 00:00:02.003000000 Output #0, matroska, to 'copied.mkv': Metadata: DATE : 20230101 ARTIST : ARTIST COMMENT : COMMENT encoder : Lavf60.5.100 Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(tv, bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 25 fps, 25 tbr, 1k tbn Metadata: ENCODER : Lavc60.11.100 libx264 DURATION : 00:00:02.003000000 Stream #0:1: Audio: vorbis (oV[0][0] / 0x566F), 44100 Hz, mono, fltp Metadata: ENCODER : Lavc60.11.100 libvorbis DURATION : 00:00:02.003000000 Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Press [q] to stop, [?] for help [out#0/matroska @ 000001efc70c2f00] video:2kB audio:3kB subtitle:0kB other streams:0kB global headers:3kB muxing overhead: 85.019422% frame= 50 fps=0.0 q=-1.0 Lsize= 11kB time=00:00:01.99 bitrate= 44.0kbits/s speed= 663x
Then the order of the metadata changes.
For some reason, it does not change in the output of step 2, but you can see it in the output of ffprobe.
in the output of ffprobe, the COMMENT tag is moved to the top, but in binary, the DATE tag is moved to the top and the order is from ARTIST,COMMENT,DATE,ENCODER to DATE,ARTIST,COMMENT,ENCODER.
Why ffprobe's output is not in binary order is a mystery.
> ffprobe ".mkv" ffprobe version N-110589-g30c71ef98e-20230514 Copyright (c) 2007-2023 the FFmpeg developers built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf) configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514 libavutil 58. 7.100 / 58. 7.100 libavcodec 60. 11.100 / 60. 11.100 libavformat 60. 5.100 / 60. 5.100 libavdevice 60. 2.100 / 60. 2.100 libavfilter 9. 8.100 / 9. 8.100 libswscale 7. 2.100 / 7. 2.100 libswresample 4. 11.100 / 4. 11.100 libpostproc 57. 2.100 / 57. 2.100 Input #0, matroska,webm, from '.mkv': Metadata: DATE : 20230101 ARTIST : ARTIST COMMENT : COMMENT ENCODER : Lavf60.5.100 Duration: 00:00:02.00, start: 0.000000, bitrate: 43 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn Metadata: ENCODER : Lavc60.11.100 libx264 DURATION : 00:00:02.003000000 Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp Metadata: ENCODER : Lavc60.11.100 libvorbis DURATION : 00:00:02.003000000
> ffprobe "copied.mkv" ffprobe version N-110589-g30c71ef98e-20230514 Copyright (c) 2007-2023 the FFmpeg developers built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf) configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514 libavutil 58. 7.100 / 58. 7.100 libavcodec 60. 11.100 / 60. 11.100 libavformat 60. 5.100 / 60. 5.100 libavdevice 60. 2.100 / 60. 2.100 libavfilter 9. 8.100 / 9. 8.100 libswscale 7. 2.100 / 7. 2.100 libswresample 4. 11.100 / 4. 11.100 libpostproc 57. 2.100 / 57. 2.100 Input #0, matroska,webm, from 'copied.mkv': Metadata: COMMENT : COMMENT DATE : 20230101 ARTIST : ARTIST ENCODER : Lavf60.5.100 Duration: 00:00:02.01, start: 0.000000, bitrate: 43 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn Metadata: ENCODER : Lavc60.11.100 libx264 DURATION : 00:00:02.003000000 Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp Metadata: ENCODER : Lavc60.11.100 libvorbis DURATION : 00:00:02.013000000
Copying copied.mkv again will change the order of the metadata.
> ffmpeg -i "copied.mkv" -c copy "copied2.mkv" ... > ffprobe -hide_banner "copied2.mkv" Input #0, matroska,webm, from 'copied2.mkv': Metadata: ARTIST : ARTIST COMMENT : COMMENT DATE : 20230101 ENCODER : Lavf60.5.100 Duration: 00:00:02.01, start: 0.000000, bitrate: 43 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn Metadata: ENCODER : Lavc60.11.100 libx264 DURATION : 00:00:02.003000000 Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp Metadata: ENCODER : Lavc60.11.100 libvorbis DURATION : 00:00:02.013000000
My ffmpeg is the Windows version downloaded from https://github.com/BtbN/FFmpeg-Builds/releases.