1

我正在尝试将 m2ts(MPEG-2 传输流)文件编码为 mp4(H.264)并获取 ssim 值。
我确实得到了一些 SSIM 值,但结果与我的预期相反。

ffmpeg 有错误的命令选项吗?

编码和 SSIM 计算命令

# encode
$ ffmpeg -hide_banner -fflags +discardcorrupt -i input.m2ts \
  -c:v libx264 -crf <CRF> -preset:v medium \
  -c:a copy -bsf:a aac_adtstoasc \
  output_ff_crf-<CRF>.mp4

# calculate ssim
$ ffmpeg -hide_banner -i <A> -i <B> \
  -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" \
  -f null -

SSIM的结果

(a) A=input.m2ts,          B=input.m2ts,           ssim=0.973266
(b) A=input.m2ts,          B=output_ff_crf-0.mp4,  ssim=0.813347
(c) A=input.m2ts,          B=output_ff_crf-30.mp4, ssim=0.819897
(d) A=output_ff_crf-0.mp4, B=output_ff_crf-0.mp4,  ssim=1.000000
(e) A=output_ff_crf-0.mp4, B=output_ff_crf-30.mp4, ssim=0.972911
  • (d)(e):这些都是我所期望的。
  • (a):文件相同,但ssim≠1。
  • (b)(c):虽然图像质量不同,但 CRF=0 和 CRF=30 的 SSIM 值几乎相同。

在 HandBrakeCLI 的情况下

为了确定 input.m2ts 是否有问题,我使用与 ffmpeg 几乎相同的参数运行 HandBrakeCLI。

# encode
HandBrakeCLI --verbose --format av_mp4 --encoder x264 --quality <CRF> --x264-preset medium \
  --aencoder copy \
  --input input.m2ts --output output_hb_crf-<CRF>.mp4

# calculate ssim (same as ffmpeg)
$ ffmpeg -hide_banner -i <A> -i <B> \
  -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" \
  -f null -
(b') A=input.m2ts,          B=output_hb_crf-0.mp4,  ssim=0.999999
(c') A=input.m2ts,          B=output_hb_crf-30.mp4, ssim=0.972886
(d') A=output_hb_crf-0.mp4, B=output_hb_crf-0.mp4,  ssim=1.000000
(e') A=output_hb_crf-0.mp4, B=output_hb_crf-30.mp4, ssim=0.972886

这一切都如我所料。(虽然 A 不是 ssim=1.0)因此,我看不到 input.m2ts 有问题。

有关视频文件和工具的信息

ffprobe 的结果

输入.m2ts

[mpeg2video @ 0x5655577c1680] Invalid frame dimensions 0x0.
    Last message repeated 1 times
[mpegts @ 0x5655577bd080] start time for stream 2 is not set in estimate_timings_from_pts
[mpegts @ 0x5655577bd080] PES packet size mismatch
Input #0, mpegts, from 'input.m2ts':
  Duration: 00:30:02.68, start: 39593.392600, bitrate: 19019 kb/s
  Program 211
    Stream #0:0[0x140]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x141]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 255 kb/s
    Stream #0:2[0x138]: Data: bin_data ([6][0][0][0] / 0x0006)
Unsupported codec with id 100359 for input stream 2

输出_ff_crf-0.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output_ff_crf-0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:30:02.67, start: 0.000000, bitrate: 109301 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 109040 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 252 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

output_hb_crf-0.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output_hb_crf-0.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2020-05-17T06:22:06.000000Z
    encoder         : HandBrake 1.1.0 2018042400
  Duration: 00:30:02.22, start: 0.000000, bitrate: 109661 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 109405 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2020-05-17T06:22:06.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 252 kb/s (default)
    Metadata:
      creation_time   : 2020-05-17T06:22:06.000000Z
      handler_name    : Stereo

工具

版本

  • ffmpeg:3.4.6-0ubuntu0.18.04.1
  • HandBrakeCLI:1.1.0

ldd

$ ldd /usr/bin/ffmpeg
...
libx264.so.152 => /usr/lib/x86_64-linux-gnu/libx264.so.152 (0x00007efbf1f33000)
...

$ ldd /usr/bin/HandBrakeCLI
...
libx264.so.152 => /usr/lib/x86_64-linux-gnu/libx264.so.152 (0x00007efbfb38f000)
...

ffmpeg 和 HandBrakeCLI 使用相同的 libx264。

4

0 回答 0