ffmpeg:在RGB通道上计算PSNR

时间:2016-01-21 12:05:13

标签: ffmpeg

我有2个rgb48le tif图像,我想与ffmpeg进行比较以计算PSNR

ffmpeg自动计算YUV通道上的PSNR而不是RGB。 这是我在“ffmpeg-20160119-git-cc83177-win64-static”上使用的命令:

ffmpeg -y -an -i image1.tif -i image2.tif -filter_complex "psnr" output.tif

这是输出:

[tiff_pipe @ 045b36a0] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, tiff_pipe, from 'image1.tif':
  Duration: N/A, bitrate: N/A
Stream #0:0: Video: tiff, rgb48le, 7680x4320 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
[tiff_pipe @ 045c53a0] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #1, tiff_pipe, from 'image2.tif':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Video: tiff, rgb48le, 7680x4320 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Output #0, image2, to 'output.tif':
  Metadata:
encoder         : Lavf56.40.101
Stream #0:0: Video: tiff, rgb48le, 7680x4320 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
  encoder         : Lavc56.60.100 tiff
Stream mapping:
  Stream #0:0 (tiff) -> psnr:main
  Stream #1:0 (tiff) -> psnr:reference
  psnr -> Stream #0:0 (tiff)
Press [q] to stop, [?] for help
frame=    1 fps=0.3 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A
video:195568kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[Parsed_psnr_0 @ 045cf760] PSNR y:46.00 u:49.32 v:50.34 average:48.14 min:48.14 max:48.14

这是正常的吗? 有没有办法强制PSNR在RGB48上计算每个通道?

1 个答案:

答案 0 :(得分:2)

vf_psnr.c不支持rgb48,因此您需要转换为某种支持的格式。最简单的(无损)转换可能是gbrp16;这基本上是相同的像素数据,只是平面而不是打包(即GGGG [..] BBBB [..] RRRR [..]而不是RGBRGBRGBRGB [..])。

不幸的是,libswscale only supports output(在GBRP中)高达14bpp,而不是16bpp,所以你需要转换为gbr14p,直到修复为止:

ffmpeg -i image1.tif -i image2.tif \
    -lavfi '[0:v]format=gbrp14[o1];[1:v]format=gbrp14[o2];[o1][o2]psnr' \
    -f null -nostats -

这实际上是14bpp RGB的PSNR。输出仍然声称YUV,因为drawutils.c中的错误,它不会将GBRP14识别为实际上是RGB。我会为此提交patch。因此,即使控制台上的输出显示'y','u','v',通道顺序实际上是'g','b','r'。