我正在使用这些命令从同一个输入 mpeg2 文件生成 tiff 和 jpeg 输出
ffmpeg -ss 14 -i'../test/test-in.mpg'-q:v 3 -vframes 1 -aspect 4:3 -vf"crop=22/23*in_w:22/23*in_h,yadif,scale=736:539,pad=736:552:0:7"'../test/test-out.jpg'
和
ffmpeg -ss 14 -i'../test/test-in.mpg'-vframes 1 -aspect 445:326 -vf"crop=22/23*in_w:22/23*in_h,yadif,scale=720:527"'../unit-test/out.tiff'
tiff 非常紫/粉红色。jpeg 还不错。
问:什么原因造成 TIFF 输出的颜色偏移?我该如何防止这种情况发生?
命令行输出
ffmpeg -ss 15 -i '../test/test.mpg' -vframes 1 -aspect 4:3 -vf "crop=21/23*in_w:21/23*in_h ,yadif,scale=720:540" -vstats_file /home/factory/log/20140630143715-mpg2stills.log '../test/test.tiff'
ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers
built on Oct 26 2013 23:16:12 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
[mpeg @ 0xa4a1440] max_analyze_duration 5000000 reached at 5016000 microseconds
Input #0, mpeg, from '../test/test.mpg':
Duration: 00:00:30.62, start: 0.384000, bitrate: 7746 kb/s
Stream #0:0[0x1c0]: Audio: mp2, 48000 Hz, stereo, s16p, 384 kb/s
Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
Output #0, image2, to '../test/test.tiff':
Metadata:
encoder : Lavf54.63.104
Stream #0:0: Video: tiff, yuv420p, 720x540 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 90k tbn, 25 tbc
Stream mapping:
Stream #0:1 -> #0:0 (mpeg2video -> tiff)
Press [q] to stop, [?] for help
[mpeg2video @ 0xa4a3060] warning: first frame is no keyframe
frame= 1 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A
video:563kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.003817%
输入 mpg 的裁剪版本(由 vlc 拍摄)
输出 tiff 的裁剪版本(转换为 png 以便上传)
答案1
问题出在 tiff 图像的色彩空间上。ffmpeg 从 mpeg 文件中复制色彩空间,该文件是 YUV 编码的。tiff 文件的 exif 数据显示它是“YCbCr”,即 YUV。
生成的 tiff 文件可以在某些应用程序上查看,但其他应用程序(尤其是 photoshop)报告文件损坏。不确定这是否是 ffmpeg 中的错误。因此,我将结果通过 imagemagick 传输,未进行任何转换,这似乎修复了文件。
但是,imagemagick 假设它是 RGB,并将 exif 数据设置为 RGB,而实际上没有更改图像数据。这就是色调偏移发生的原因。同样,不确定这是否是 imagemagick 的一个错误。
jpeg 没有任何问题。
一个合适的解决方案是在 ffmpeg 命令中指定要使用的 pix_fmt。请参阅 https://ffmpeg.org/ffmpeg.html#Advanced-Video-options
所以这样做了:
ffmpeg -ss 14 -i '../test/test-in.mpg' -vframes 1 -aspect 445:326 -pix_fmt rgb24 -vf "crop=22/23*in_w:22/23*in_h,yadif,scale=720:527" '../unit-test/out.tiff'