ffmpeg 奇怪的 x264 编码行为
ffmpeg weird x264 encoding behavior
我捕获了一个显示纵横比为 16:9 的 720x480 视频,我想对其进行裁剪、调整大小和填充,但只是 x264 编码命令让我很头疼。
(Screenshot of input.m2v) 这是我的命令:
ffmpeg -ss 1861 -i input.m2v -c:v libx264 -profile:v main -preset:v medium -level 3.1 -x264opts crf=21.228 -t 60 -y -f mp4 output.mp4
这是 ffmpeg 输出:
Input #0, mpegvideo, from 'input.m2v':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mpeg2video (Main), yuv420p(tv), 720x480 [SAR 32:27 DAR 1
6:9], max. 6605 kb/s, 31.02 fps, 59.94 tbr, 1200k tbn, 59.94 tbc
[libx264 @ 02ba84c0] using SAR=32/27
[libx264 @ 02ba84c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 02ba84c0] profile Main, level 3.1
[libx264 @ 02ba84c0] 264 - core 144 r2525 40bb568 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1
interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scene
cut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=21.2 qcomp=0.60 qpmin
=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf56.19.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 720x48
0 [SAR 32:27 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc
Metadata:
encoder : Lavc56.21.102 libx264
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> h264 (libx264))
输出大小为 720x480,显示为 853x480,符合预期。
但看起来框架已经垂直缩放了 1.18 倍,然后裁剪到 480 的高度,所以我失去了框架的顶部和底部。事实上,行为等同于:
-vf "scale=720:569,crop=720:480:0:0"
虽然我假设宽高比在这里起作用(我认为 1.18 因素实际上是 (16/9)/(720/480))但我很惊讶 ffmpeg 会突然这样做。可能比我更有知识的人可以解释一下吗?
根据屏幕截图,这里没有错误。
您的源是 720x480 和 DAR 16:9,但 Potplayer 将其视频 window 保持在 720x480,同时遵守 M2V 的纵横比,也就是说,第一个视频中的一些信箱填充由 Potplayer 添加,不在视频流中。在输出中,水平 canvas 适当扩展为 853 个像素。没有缩放。
我捕获了一个显示纵横比为 16:9 的 720x480 视频,我想对其进行裁剪、调整大小和填充,但只是 x264 编码命令让我很头疼。
(Screenshot of input.m2v) 这是我的命令:
ffmpeg -ss 1861 -i input.m2v -c:v libx264 -profile:v main -preset:v medium -level 3.1 -x264opts crf=21.228 -t 60 -y -f mp4 output.mp4
这是 ffmpeg 输出:
Input #0, mpegvideo, from 'input.m2v':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: mpeg2video (Main), yuv420p(tv), 720x480 [SAR 32:27 DAR 1
6:9], max. 6605 kb/s, 31.02 fps, 59.94 tbr, 1200k tbn, 59.94 tbc
[libx264 @ 02ba84c0] using SAR=32/27
[libx264 @ 02ba84c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 02ba84c0] profile Main, level 3.1
[libx264 @ 02ba84c0] 264 - core 144 r2525 40bb568 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1
interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scene
cut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=21.2 qcomp=0.60 qpmin
=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf56.19.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 720x48
0 [SAR 32:27 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc
Metadata:
encoder : Lavc56.21.102 libx264
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> h264 (libx264))
输出大小为 720x480,显示为 853x480,符合预期。 但看起来框架已经垂直缩放了 1.18 倍,然后裁剪到 480 的高度,所以我失去了框架的顶部和底部。事实上,行为等同于:
-vf "scale=720:569,crop=720:480:0:0"
虽然我假设宽高比在这里起作用(我认为 1.18 因素实际上是 (16/9)/(720/480))但我很惊讶 ffmpeg 会突然这样做。可能比我更有知识的人可以解释一下吗?
根据屏幕截图,这里没有错误。
您的源是 720x480 和 DAR 16:9,但 Potplayer 将其视频 window 保持在 720x480,同时遵守 M2V 的纵横比,也就是说,第一个视频中的一些信箱填充由 Potplayer 添加,不在视频流中。在输出中,水平 canvas 适当扩展为 853 个像素。没有缩放。