Instrukcje ssim ffmpeg mówią, że odniesienie powinno być drugie, a kiedy porównuję te filmy w tej kolejności (gdzie „copy.avi” powinno być bezstratną kopią H.264 „original.avi”), SSIM i PSNR zwracają bezstratne wyniki. Ale jeśli odwrócę kolejność, wydajność nie będzie bezstratna.

Dlaczego to się dzieje?

Kopiuj jako pierwszy, oryginał jako drugi

> ffmpeg -hide_banner -i copy.avi -i original.avi -lavfi "ssim;[0:v][1:v]psnr" -f null –


[avi @ 0x7ffdee002000] decoding for stream 0 failed
Input #0, avi, from 'copy.avi':
  Metadata:
    encoder         : Lavf58.20.100
  Duration: 00:00:10.67, start: 0.000000, bitrate: 644937 kb/s
    Stream #0:0: Video: h264 (High 4:4:4 Predictive) (H264 / 0x34363248), yuv420p(progressive), 2048x1536, 645930 kb/s, 60 fps, 60 tbr, 60 tbn, 120 tbc
Input #1, avi, from 'original.avi':
  Metadata:
    encoder         : Lavf54.35.100
  Duration: 00:00:10.67, start: 0.000000, bitrate: 1509965 kb/s
    Stream #1:0: Video: rawvideo (Y800 / 0x30303859), gray, 2048x1536, 1512312 kb/s, 60 fps, 60 tbr, 60 tbn, 60 tbc
Stream mapping:
  Stream #0:0 (h264) -> ssim:main
  Stream #0:0 (h264) -> psnr:main
  Stream #1:0 (rawvideo) -> ssim:reference
  Stream #1:0 (rawvideo) -> psnr:reference
  ssim -> Stream #0:0 (wrapped_avframe)
  psnr -> Stream #0:1 (wrapped_avframe)
Press [q] to stop, [?] for help
Output #0, null, to '–':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: wrapped_avframe, yuv420p(progressive), 2048x1536, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc
    Metadata:
      encoder         : Lavc58.35.100 wrapped_avframe
    Stream #0:1: Video: wrapped_avframe, yuv420p, 2048x1536, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc
    Metadata:
      encoder         : Lavc58.35.100 wrapped_avframe
frame=  640 fps= 72 q=-0.0 Lq=-0.0 size=N/A time=00:00:10.66 bitrate=N/A speed=1.21x    
video:670kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[Parsed_ssim_0 @ 0x7ffdef8024c0] SSIM Y:1.000000 (inf) U:1.000000 (inf) V:1.000000 (inf) All:1.000000 (inf)
[Parsed_psnr_1 @ 0x7ffdef802940] PSNR y:inf u:inf v:inf average:inf min:inf max:inf

Oryginał jako pierwszy, kopia jako drugi

> ffmpeg -hide_banner -i original.avi -i copy.avi -lavfi "ssim;[0:v][1:v]psnr" -f null –


Input #0, avi, from 'original.avi':
  Metadata:
    encoder         : Lavf54.35.100
  Duration: 00:00:10.67, start: 0.000000, bitrate: 1509965 kb/s
    Stream #0:0: Video: rawvideo (Y800 / 0x30303859), gray, 2048x1536, 1512312 kb/s, 60 fps, 60 tbr, 60 tbn, 60 tbc
[avi @ 0x7fb74680d600] decoding for stream 0 failed
Input #1, avi, from 'copy.avi':
  Metadata:
    encoder         : Lavf58.20.100
  Duration: 00:00:10.67, start: 0.000000, bitrate: 644937 kb/s
    Stream #1:0: Video: h264 (High 4:4:4 Predictive) (H264 / 0x34363248), yuv420p(progressive), 2048x1536, 645930 kb/s, 60 fps, 60 tbr, 60 tbn, 120 tbc
Stream mapping:
  Stream #0:0 (rawvideo) -> ssim:main
  Stream #0:0 (rawvideo) -> psnr:main
  Stream #1:0 (h264) -> ssim:reference
  Stream #1:0 (h264) -> psnr:reference
  ssim -> Stream #0:0 (wrapped_avframe)
  psnr -> Stream #0:1 (wrapped_avframe)
Press [q] to stop, [?] for help
Output #0, null, to '–':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: wrapped_avframe, gray(progressive), 2048x1536, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc
    Metadata:
      encoder         : Lavc58.35.100 wrapped_avframe
    Stream #0:1: Video: wrapped_avframe, gray, 2048x1536, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc
    Metadata:
      encoder         : Lavc58.35.100 wrapped_avframe
frame=  640 fps= 72 q=-0.0 Lq=-0.0 size=N/A time=00:00:10.66 bitrate=N/A speed=1.19x    
video:670kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[Parsed_ssim_0 @ 0x7fb748101780] SSIM Y:0.998296 (27.684975) All:0.998296 (27.684975)
[Parsed_psnr_1 @ 0x7fb748101c40] PSNR y:56.840774 average:56.840774 min:56.812125 max:56.871584
1
Ian 12 listopad 2018, 00:40

1 odpowiedź

Najlepsza odpowiedź

Jeden format to yuv420p, a drugi jest szary. Aby je porównać, należy przekonwertować szary na yuv420p lub yuv420p na szary. Jak zauważyłeś ta operacja nie zawsze jest bezstratna. Aby porównać tylko płaszczyznę Y, użyj filtra extractplanes=y przed wywołaniem psnr/ssim.

1
user5900538user5900538 12 listopad 2018, 12:21