ffmpeg:针对不良结果推荐基线选项

ffmpeg:针对不良结果推荐基线选项

我每年运行 Windows 服务来转换大约 10k 个视频。大多数视频都没有问题,但有些视频我没有发现问题:

源视频

转换后的视频

=> 如果机器支持 GPU 编码,则从 FFProbe 中提取 -b:v 的值以获得更好的结果

大多数视频都在这个相同的命令上运行:

-i in.mp4 -an -vcodec libx264 -vprofile baseline -pix_fmt yuv420p -b:v 55600 -vf yadif -g 25 -movflags +faststart -y out.mp4

据我了解,问题在于:FFProbe 仅返回平均比特率,这太低了。我尝试切换到 -b:v、-maxrate:v、-bufsize:v,效果一般。视频质量好多了,但仍然低于 org 文件。即使比特率与 org 文件相同。

问题:

  1. 有没有更好的方法将所有视频转换为基线?
  2. 如果必须支持大多数设备(PC/Mac/Android/IPhone),是否仍建议将视频转换为基线?
  3. 知道如何在没有人为干预的情况下检测我的转换已毁坏的视频吗?

不幸的是,这些视频是保密的,但我截取了一个样本,以下是组织元数据。糟糕的结果如下:

Video 
ID                             : 1
Format                         : AVC
Format/Info                    : Advanced Video Codec
Format profile                 : High@L4
Format settings, CABAC         : Yes
Format settings, RefFrames     : 5 frames
Codec ID                       : avc1
Codec ID/Info                  : Advanced Video Coding
Duration                       : 19 min 2 s
Bit rate                       : 801 kb/s
Width                          : 1 920 pixels
Height                         : 1 080 pixels
Display aspect ratio           : 16:9
Frame rate mode                : Constant
Frame rate                     : 30.000 FPS
Color space                    : YUV
Chroma subsampling             : 4:2:0
Bit depth                      : 8 bits
Scan type                      : Progressive
Bits/(Pixel*Frame)             : 0.013
Stream size                    : 109 MiB (76%)
Writing library                : x264 core 160 r10 33f9e14
Encoding settings              : cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=8 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=34 / lookahead_threads=5 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / stitchable=1 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=infinite / keyint_min=30 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=20.0 / qcomp=0.60 / qpmin=5 / qpmax=69 / qpstep=4 / vbv_maxrate=5500 / vbv_bufsize=15000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.40 / aq=1:1.00
Encoded date                   : UTC 2020-05-07 15:14:22
Tagged date                    : UTC 2020-05-07 15:14:22
Color range                    : Limited
Color primaries                : BT.709
Transfer characteristics       : BT.709
Matrix coefficients            : BT.709

答案1

问题到底是什么?你为什么要尝试匹配比特率?为什么不使用 crf 编码?

如果必须支持大多数设备(PC/Mac/Android/IPhone),是否仍建议将视频转换为基线?

上一部无法高调播放的 iPhone 是在 8 年前发布的。除非你需要 iPhone 4 的支持,否则不行。

有什么想法可以在没有人工干预的情况下检测误导视频吗?

什么是“误导性”视频?

答案2

感谢 szatmary 推动我走向正确的方向!

  1. 有没有更好的方法将所有视频转换为基线?

    答:是的,不要使用基线

  2. 如果必须支持大多数设备(PC/Mac/Android/IPhone),是否仍建议将视频转换为基线?

    答:不会!我们将切换到 High Profile,并尝试使用 crf 进行流式传输(大量静态内容)

  3. 知道如何在没有人为干预的情况下检测我的转换已毁坏的视频吗?

    答:在 org. 编码设置中搜索“crf”。将它们转换为恒定比特率需要其他策略

相关内容