我堆叠了高质量的电影:1080p,60fps。问题是播放时会延迟。
我尝试使用 ffmpeg 将其转换为 720p:
ffmpeg -i MyMovie.mkv -r 60 -s hd720 MyMovie_720p.mkv
但由于比特率从 32.3 Mbps 降至 2.8 Mbps,因此质量损失很大。如何为视频流指定正确的比特率,同时让所有其他流保持原样?
输入文件mediainfo:
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : [email protected]
Format settings, CABAC : Yes
Format settings, ReFrames : 4 frames
Codec ID : V_MPEG4/ISO/AVC
Duration : 2h 58mn
Bit rate : 32.3 Mbps
Width : 1 920 pixels
Height : 1 080 pixels
Display aspect ratio : 16:9
Frame rate : 59.940 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.260
Stream size : 40.2 GiB (92%)
Writing library : x264 core 116 r2019 9cc407d
Encoding settings : cabac=1 / ref=4 / deblock=1:-2:-1 / analyse=0x3:0x113 / me=umh / subme=10 / psy=1 / psy_rd=0.80:0.20 / mixed_ref=1 / me_range=32 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=6 / sliced_threads=0 / nr=0 / decimate=0 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=6 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=0 / crf=14.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=50000 / vbv_bufsize=62500 / crf_max=0.0 / nal_hrd=none / ip_ratio=1.40 / pb_ratio=1.30 / aq=1:0.60
Language : English
Default : Yes
Forced : No
Matrix coefficients
: BT.709-5, BT.1361, IEC 61966-2-4 709, SMPTE RP177
答案1
以下是一个示例,它应该能为您提供最高质量的视频(我不是在谈论最终文件的大小)。请注意,此视频可能无法在所有设备或播放器上播放:
ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 0 -preset veryslow -c:a copy MyMovie_720p.mkv
为了获得“视觉无损”的质量,您可以使用:
ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 18 -preset veryslow -c:a copy MyMovie_720p.mkv
现在让我们看看这里有什么:
这缩放视频过滤器用于调整视频大小。您只需设置一个尺寸(本例中为高度),并将其用于-1
另一个尺寸。ffmpeg 将自动重新计算正确的值,同时保留纵横比。
质量控制-crf
选项:
量化器比例的范围是 0-51:其中 0 表示无损,23 表示默认值,51 表示最差值。值越低,质量越高,主观上合理的范围是 18-28。将 18 视为视觉上无损或接近无损:它应该看起来与输入相同或接近相同,但从技术上讲它不是无损的。
范围是指数级的,因此将 CRF 值增加 +6 大约是比特率的一半,而将 -6 大约是比特率的两倍。一般用法是选择仍然提供可接受质量的最高 CRF 值。如果输出看起来不错,则尝试更高的值,如果看起来不好,则选择较低的值。
您可以在x264 编码指南。
您可以使用选项来控制视频编码速度和压缩效率之间的权衡-preset
。这些选项包括:超快、超快、非常快、更快、快、中、慢、更慢、非常慢. 默认为中等的。 这非常慢该选项提供了最佳的压缩效率(在相同质量的情况下,文件大小更小),但速度非常慢 - 正如其名称所示。
音频将流已复制直接从输入文件到输出文件而不进行任何更改。
答案2
如果您想要缩放到不同的尺寸,FFMPEG 缩放尺寸会受到一些限制。它不接受每个高度,以下是尺寸的最佳建议小列表。
当宽度和高度(以像素为单位)为 16 的倍数时,视频编解码器的性能会更好。虽然您可以在编码设置中使用任意宽度和高度,但非最佳尺寸可能会导致图像质量不佳和帧速率降低。为了获得最佳图像质量和播放效果,您应该为视频使用宽度和高度尺寸为 16 的倍数;其次是 8 的倍数,然后是 4 的倍数。
Recommended width and height for videos with 16:9 aspect ratios:
Best Choice: 2nd Best: 3rd Best:
Multiples of 16 Multiples of 8 Multiples of 4
1920 x 1080 1792 x 1008 1856 x 1044
1280 x 720 1152 x 648 1216 x 684
1024 x 576 896 x 504 1088 x 612
768 x 432 640 x 360 960 x 540
512 x 288 384 x 216 832 x 468
256 x 144 128 x 72 704 x 396
576 x 324
448 x 252
320 x 180
192 x 108
答案3
缩小到 720p = 将视频调整为 1280x720
ffmpeg \
-i input.mp4 \
-vf scale=w=1280:h=720:force_original_aspect_ratio=decrease:force_divisible_by=2 \
-sws_flags lanczos \
output.mp4
文档:ffmpeg 缩放过滤器
-sws_flags lanczos
比默认的要好-sws_flags bicubic
(来源)
force_divisible_by=2
对于 h264 是必需的:
[libx264 @ 0x853040] height not divisible by 2 (1280x533)
例子:
ratio 1080p 720p
16:9 1920x1080 1280x720
16:10 1728x1080 1152x720
3:2 1620x1080 1080x720
4:3 1440x1080 960x720
5:4 1350x1080 900x720
1:1 1080x1080 720x720
2:1 1920x960 1280x640
24:10 1920x800 1280x534