我正在尝试在 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
- 使用 ImageMagick:
- 使用 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