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 yumu)

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:

  1. 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"
    
  2. 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.

Change History (1)

comment:1 by yumu, 12 months ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.