使用 ffmpeg 在 MP4 中嵌入自定义 ICC 配置文件

使用 ffmpeg 在 MP4 中嵌入自定义 ICC 配置文件

我正在尝试在 MP4 中嵌入自定义 ICC 配置文件,但找不到如何使用 ffmpeg 来执行此操作。

我将动画的帧保存为 PNG,并嵌入了自定义 ICC 配置文件。PNG 经过色彩管理,以宽色域显示。

我曾尝试在视频中写入相同的 ICC 配置文件,但没有成功。

https://ffmpeg.org/ffmpeg-codecs.html我找到了“flags2 icc_profiles”,但由于我没有找到指定 ICC 文件的方法,我推测应该使用第一个 PNG 中嵌入的配置文件。但是它不起作用。

https://vectronic.io/posts/ffmpeg-now-supports-icc-profiles-in-mp4/有一个嵌入了 ICC 配置文件的 MP4,但没有解释如何将配置文件写入样本。

我的批处理命令是:

ffmpeg -i“frame%%4d.png”-c:v libsvtav1-pix_fmt yuv420p10le-color_range pc-svtav1-params crf=10:mbr=20M-movflags faststart 输出.mp4

(“color_range” 对我来说没什么区别)

如果我使用选项“-colorspace bt709 -color_primaries bt709 -color_trc bt709”,Firefox 和 Ffplay 将显示视频色彩管理(看起来像 BT709 或足够接近)。

如果我使用“movflags + write_colr + prefer_icc”,视频也会进行色彩管理(看起来与上面的 BT709 相同)。

编辑(日志):

C:\icctest>"C:\icctest\ffmpeg.exe" -y -framerate 30 -i "C:\icctest\frames\frame%4d.png" -c:v libsvtav1 -pix_fmt yuv420p10le -flags2 icc_profiles -color_range pc -svtav1-params crf=10:mbr=20M:keyint=2s -movflags faststart "C:\icctest\output.mp4"
ffmpeg version 2022-08-22-git-f23e3ce858-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 33.101 / 57. 33.101
  libavcodec     59. 42.102 / 59. 42.102
  libavformat    59. 30.100 / 59. 30.100
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 46.103 /  8. 46.103
  libswscale      6.  8.103 /  6.  8.103
  libswresample   4.  8.100 /  4.  8.100
  libpostproc    56.  7.100 / 56.  7.100
Input #0, image2, from 'C:\icctest\frames\frame%4d.png':
  Duration: 00:00:00.30, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: png, rgb48be(pc), 1920x1080 [SAR 3780:3780 DAR 16:9], 30 fps, 30 tbr, 30 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> av1 (libsvtav1))
Press [q] to stop, [?] for help
[image2 @ 000002a6a9063cc0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 1)
Svt[info]: -------------------------------------------
Svt[info]: SVT [version]:       SVT-AV1 Encoder Lib v1.2.1-7-g5f4c0fe8
Svt[info]: SVT [build]  :       GCC 12.2.0       64 bit
Svt[info]: LIB Build date: Aug 21 2022 13:29:44
Svt[info]: -------------------------------------------
Svt[info]: Number of logical cores available: 4
Svt[info]: Number of PPCS 37
Svt[info]: [asm level on system : up to avx2]
Svt[info]: [asm level selected : up to avx2]
Svt[info]: -------------------------------------------
Svt[info]: SVT [config]: main profile   tier (auto)     level (auto)
Svt[info]: SVT [config]: width / height / fps numerator / fps denominator               : 1920 / 1080 / 30 / 1
Svt[info]: SVT [config]: bit-depth / color format / compressed 10-bit format            : 10 / YUV420 / 0
Svt[info]: SVT [config]: preset / tune / pred struct                                    : 10 / PSNR / random access
Svt[info]: SVT [config]: gop size / mini-gop size / key-frame type                      : 61 / 16 / key frame
Svt[info]: SVT [config]: BRC mode / rate factor / max bitrate (kbps)                    : capped CRF / 10 / 20000
Svt[info]: -------------------------------------------
Output #0, mp4, to 'C:\icctest\output.mp4':
  Metadata:
    encoder         : Lavf59.30.100
  Stream #0:0: Video: av1 (av01 / 0x31307661), yuv420p10le(pc, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn
    Metadata:
      encoder         : Lavc59.42.102 libsvtav1
    Side data:
      cpb: bitrate max/min/avg: 20000000/0/0 buffer size: 0 vbv_delay: N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0kb[mp4 @ 000002a6a90730c0] Starting second pass: moving the moov atom to the beginning of the file
frame=    9 fps=5.5 q=10.0 Lsize=    2431kB time=00:00:00.26 bitrate=74668.8kbits/s speed=0.163x
video:2430kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.036133%

EDIT2(ffprobe):

C:\icctest>"C:\icctest\ffprobe.exe" "C:\icctest\output.mp4"
ffprobe version 2022-08-22-git-f23e3ce858-full_build-www.gyan.dev Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 33.101 / 57. 33.101
  libavcodec     59. 42.102 / 59. 42.102
  libavformat    59. 30.100 / 59. 30.100
  libavdevice    59.  8.101 / 59.  8.101
  libavfilter     8. 46.103 /  8. 46.103
  libswscale      6.  8.103 /  6.  8.103
  libswresample   4.  8.100 /  4.  8.100
  libpostproc    56.  7.100 / 56.  7.100
[libdav1d @ 0000026b98308e40] libdav1d 1.0.0-46-gcd5e415
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\icctest\output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomav01iso2mp41
    encoder         : Lavf59.30.100
  Duration: 00:00:00.30, start: 0.000000, bitrate: 66372 kb/s
  Stream #0:0[0x1](und): Video: av1 (Main) (av01 / 0x31307661), yuv420p10le(pc, progressive), 1920x1080, 66347 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.42.102 libsvtav1
[libdav1d @ 0000026b988a3c80] libdav1d 1.0.0-46-gcd5e415

答案1

搜索 FFmpeg 的文档,似乎不支持向 MP4 文件添加自定义 ICC 配置文件。

我们可能会使用MP4盒反而:

  • 创建不带嵌入 ICC 配置文件的 MP4 视频。
  • 使用以下方法从 PNG 图像中提取 ICC 配置文件图像魔术师或者外置工具
    • 使用 ImageMagick:magick icc_image.png profile.icc
    • 使用 exiftool:exiftool -icc_profile -b icc_image.png > profile.icc
  • 使用 MP4Box 将 ICC 配置文件添加到 MP4 视频文件(使用 ICC 配置文件作为附加数据创建新的视频文件):
    MP4Box -add video.mp4#video:colr=prof,profile.icc -new icc_video.mp4

示例:
我使用 GIMP 将 ICC 配置文件添加到切尔西
icc_chelsea.png
在此处输入图片描述

创建没有 ICC 配置文件的 MP4 视频(用于测试):
ffmpeg -y -loop 1 -framerate 1 -i icc_chelsea.png -vcodec libx265 -t 10 chelsea.mp4

提取 ICC 配置文件:
magick icc_chelsea.png profile.icc

使用 MP4Box 将 ICC 配置文件添加到 MP4 视频文件:
MP4Box -add video.mp4#video:colr=prof,profile.icc -new icc_video.mp4

使用 FFprobe 进行测试:
ffprobe icc_chelsea.mp4


结果:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'icc_chelsea.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    creation_time   : 2022-08-26T09:15:00.000000Z
  Duration: 00:00:10.00, start: 0.000000, bitrate: 44 kb/s
  Stream #0:0[0x1](und): Video: hevc (Rext) (hev1 / 0x31766568), gbrp(pc, gbr/unknown/unknown, progressive), 385x256 [SAR 1:1 DAR 385:256], 40 kb/s, 1 fps, 1 tbr, 16384 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.37.100 libx265
    Side data:
      ICC Profile

相关内容