如何在保持画质的同时使用ffmpeg将4k采样到1080p?


21

我有一些需要将MP4格式的4K 3840x2160素材降低到1080p。我尝试跑步

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

但是结果却是非常差的质量,整个图像都是由正方形的“平铺”组成,好像我在放大4:1。

这是运行此命令的输出:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

我从经验中知道ffmpeg是一个出色的工具,因此我必须以某种方式搞乱选项/参数...

我怎样才能做到这一点?


请显示命令的完整,完整的控制台输出。您可以只编码一小段,因此添加-t 10以产生10秒的输出。为什么要缩小尺寸?您的缩放输出的用例是什么?此信息将帮助我提供更准确的答案。
llogan

@LordNeckbeard我刚刚添加了控制台输出。我想缩小尺寸,以便与与我一起工作的人更轻松地共享这些剪辑。
lara michaels's

1
不要忘记-c:a copy,因为您不需要或不需要重新编码音频流。使用-map 0复制任何章节元数据,或其他的东西。(默认情况下,ffmpeg只需要1 vid + 1 aud。)
Peter Cordes

1
而且,-sws_flags lanczos+print_info将使用比默认更好的缩放算法(我认为是双线性的)。stlb的答案涵盖了过程的视频编码部分。
彼得·科德斯

2
@PeterCordes或者,scale=1920:-2:flags=lanczos。我还打算-2在我不存在的答案中提及规模。对于那些谁不知道,你可以把-2在宽度或高度,并同时保持纵横比它会自动提供正确的价值制作由2的值整除(由libx264为YUV420P输出需要)。
llogan 2015年

Answers:


17

ffmpeg的默认设置质量很低,并且由于您未指定任何编解码器或质量参数,因此仅使用默认设置(我不知道开发人员为什么不解决该问题,因为它在论坛上引发了很多问题到处)。

编辑:默认值现在很理智。使用最新版本的ffmpeg,您无需指定任何输入和输出文件即可获得良好的可用结果。您当然可以调整自己的内心需求。

尝试添加-c:v libx264 -crf 20 -preset slow到命令。

  • -c:v libx264 告诉它使用libx264编码器,
  • crf 20 使用值为20的“恒定速率因子”量化器(这在寄生上意味着可变的比特率,但是质量恒定)(质量很好;较低的质量较好/文件较大,较高的则更糟/较小),
  • 所述slow预设为一堆编码器设置,装置它把更多的精力投入到它比默认(介质)的快捷方式。

您可以调整这些设置,有关旋转哪些旋钮的说明,请参阅h.264编码指南

如果您原样使用音频,请添加c:a copy。这样就可以直接复制音频流,而无需重新编码。


默认值取决于编码器。libx264通常默认情况下用于MP4输出,它产生的输出质量不错,没有其他选项,但是问题中的ffmpeg构建似乎不支持此编码器,因此使用古老的编码器来mpeg4生成MPEG-4 Part 2视频,并且它的默认设置在全盛时期更为合理(例如320x240等)。
llogan 2015年

很高兴听到libx264现在是默认值。
stib 2015年

我会说20瑞士法郎简直太棒了。18在功能上是无损的。我做了我的大部分影片在23
user24601

我的大部分工作都显示在通过SD卡在本地工作的播放设备上。我不需要为尺寸做很多优化,因此我将质量保持在最高水平。我同意,如果要通过网络进行传递,则可以将其拨号。
stib

这对我没有帮助。无论视频中哪里出现运动,我仍然会感觉很怪异。crf为18,预设为慢速。2.7k-> 1080p。
13:59重新

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.