rob*_*ert 6 video compression ffmpeg colors
我正在尝试压缩用 Nexus 5X(运行 LineageOS)录制的一些 4K 视频(分辨率:3840x2160)。
我的第一次尝试:
./ffmpeg -i VID_20190908_145514.mp4 -c:a copy -crf 23 -vf "scale=1920:-1" VID_20190908_145514.komprimiert.mp4
Run Code Online (Sandbox Code Playgroud)
问题:颜色褪色/饱和度降低。效果还是蛮强的。我使用 VLC 并排比较了视频并为您制作了屏幕截图:
这是原始视频文件的 ffprobe 输出:
./ffprobe VID_20190908_145514.mp4
ffprobe version 4.1.4-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2007-2019 the FFmpeg developers
built with Apple LLVM version 10.0.1 (clang-1001.0.46.4)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'VID_20190908_145514.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2019-09-08T12:58:35.000000Z
com.android.version: 8.1.0
com.android.manufacturer: LGE
com.android.model: Nexus 5X
Duration: 00:03:18.27, start: 0.000000, bitrate: 41991 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuvj420p(pc, bt470bg/bt470bg/smpte170m), 3840x2160, 41963 kb/s, SAR 1:1 DAR 16:9, 29.33 fps, 30 tbr, 90k tbn, 180k tbc (default)
Metadata:
rotate : 180
creation_time : 2019-09-08T12:58:35.000000Z
handler_name : VideoHandle
Side data:
displaymatrix: rotation of -180.00 degrees
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
Metadata:
creation_time : 2019-09-08T12:58:35.000000Z
handler_name : SoundHandle
Run Code Online (Sandbox Code Playgroud)
以下是压缩视频文件的 ffprobe 输出:
./ffprobe VID_20190908_145514.komprimiert.mp4
ffprobe version 4.1.4-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2007-2019 the FFmpeg developers
built with Apple LLVM version 10.0.1 (clang-1001.0.46.4)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'VID_20190908_145514.komprimiert.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:03:18.27, start: 0.000000, bitrate: 6833 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], 6742 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandle
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
Metadata:
handler_name : SoundHandle
Run Code Online (Sandbox Code Playgroud)
问题似乎是颜色空间/颜色转移/颜色原色不匹配。
原始文件指定为:
yuvj420p(pc, bt470bg/bt470bg/smpte170m)
Run Code Online (Sandbox Code Playgroud)
压缩文件指定为:
yuvj420p(pc)
Run Code Online (Sandbox Code Playgroud)
我在网上搜索解决方案并提出了一个改进的命令,尝试模仿/重现原始视频文件的颜色设置:
./ffmpeg -i VID_20190908_145514.mp4 -vf "scale=1920:-1" -color_primaries 5 -colorspace 5 -color_trc 6 -crf 23 -c:a copy -to 10 VID_20190908_145514.komprimiert3.mp4
Run Code Online (Sandbox Code Playgroud)
不幸的是,-color_primaries,-colorspace和-color_trc开关没有被 ffmpeg 很好地记录下来。不管怎样,他们似乎解决了颜色问题。至少,上面的命令现在会产生关于颜色的匹配 ffprobe 输出:
yuvj420p(pc, bt470bg/bt470bg/smpte170m)
Run Code Online (Sandbox Code Playgroud)
但奇怪的是:播放视频时我没有看到任何差异。颜色仍然被洗掉/不饱和。
公平地说......在运行上述命令期间,我收到以下警告:
[swscaler @ 0x115075000] deprecated pixel format used, make sure you did set range correctly
Run Code Online (Sandbox Code Playgroud)
我在初次尝试时收到了相同的警告(没有指定-colorspace等)。
如何使用 ffmpeg 保留原始颜色?我不想丢失颜色信息。我只希望 ffmpeg 压缩视频(通过缩小尺寸并使用比我的智能手机更多的 CPU)。说实话,我没想到会遇到这样的困难……
编辑 1:使用 ffplay 而不是 VLC 或 QuickTime 时,视频的显示方式没有不同。你几乎看不出任何区别。看截图:
编辑 2:这可能是 VLC/Quicktime 中的播放问题/错误。也许问题在于他们误解了视频文件中的颜色元数据。我发现 VLC 和 ffprobe 不同意......
VLC 在“媒体信息”窗口中显示有关 VID_20190908_145514.mp4 的信息(我目前无法上传屏幕截图):
...
Color primaries: ITU-R BT.2020
Color transfer function: ITU-R BT.709
Color space: ITU-R BT.2020 Range
Chroma location: Left
...
Run Code Online (Sandbox Code Playgroud)
相比之下,ffprobe -show_streams VID_20190908_145514.mp4说道:
...
pix_fmt=yuvj420p
level=51
color_range=pc
color_space=bt470bg
color_transfer=smpte170m
color_primaries=bt470bg
chroma_location=left
...
Run Code Online (Sandbox Code Playgroud)
显然,假设错误的(输入)色彩空间会在播放时产生扭曲的(输出)颜色。我开始认为褪色/不饱和的颜色实际上是正确的颜色。
之前在ffmpeg的Trac上也报告过这样的问题:https ://trac.ffmpeg.org/ticket/7180
VLC 检测到的 BT.2020 可以正确描述文件的颜色编码。您可以轻松地在容器和比特流级别进行更改,而无需重新编码
ffmpeg -i VID_20190908_145514.komprimiert.mp4 -c copy -color_primaries bt2020 -color_trc bt709 -colorspace bt2020_ncl -color_range pc -bsf:v h264_metadata=video_full_range_flag=1:colour_primaries=9:transfer_characteristics=1:matrix_coefficients=9 out.mp4
(BT.2020颜色空间/矩阵系数实际上有两种可能,如果ncl和9不对,请尝试bt2020_ncl和10)
| 归档时间: |
|
| 查看次数: |
7677 次 |
| 最近记录: |