V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wsseo
V2EX  ›  FFmpeg

ffmpeg 降低视频分辨率

  •  
  •   wsseo · 2020-04-10 14:37:26 +08:00 · 7767 次点击
    这是一个创建于 1672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个 4K 视频,播放卡顿,想降低分辨。这种写法可以吗?需要尽量保证画质。

    ffmpeg -i 1.mp4 -strict -2 -vf scale=-1:1440 2.mp4 
    
    26 条回复    2020-10-02 12:33:32 +08:00
    hwenwur
        1
    hwenwur  
       2020-04-10 14:50:59 +08:00
    建议用 -crf X, X 的范围是[0, 51], 越小表示清晰度越高。我之前用 -crf 24 文件体积大概减小了 77%,清晰度没有明显变化。
    wsseo
        2
    wsseo  
    OP
       2020-04-10 15:03:50 +08:00
    @hwenwur 是这样吗?
    ffmpeg -i 1.mp4 -strict -2 -crf 24 -vf scale=-1:1440 2.mp4
    wsseo
        3
    wsseo  
    OP
       2020-04-10 15:05:36 +08:00
    小丸工具箱有 crf 这个参数,但是这个分辨率要自己设置,不知道能不能等比例
    clrss
        4
    clrss  
       2020-04-10 15:10:39 +08:00
    别的机器播放卡顿你用高性能机器重编码可行.

    你在放 4K 卡顿的机器上重编码那速度感人...
    wsseo
        5
    wsseo  
    OP
       2020-04-10 15:13:49 +08:00
    @clrss 我是在移动设备上播放,电脑性能还行,可以播放。不过转码时间还是感人,4k 压成 1080p 花了半个小时。
    littlewing
        6
    littlewing  
       2020-04-10 15:33:35 +08:00 via iPhone
    @wsseo 这已经非常快了,我见过之前室友压片子,不过是加了各种滤镜的,速度大概 1.x 帧 1 秒
    wenyifancc
        7
    wenyifancc  
       2020-04-10 15:51:43 +08:00
    ffmpeg -i 1.mp4 -s 1920x1080 -vcodec libx265 -crf 22 -acodec copy 2.mp4 #编码为 H.265 1080p 音频直接复制
    ffmpeg -i 1.mp4 -s 1920x1080 -vcodec libx264 -crf 21 -acodec copy 2.mp4 #编码为 H.264 1080p 音频直接复制
    wsseo
        8
    wsseo  
    OP
       2020-04-10 15:53:51 +08:00
    @wenyifancc 这个能保持宽高比吗?
    chihiro2014
        9
    chihiro2014  
       2020-04-10 15:58:27 +08:00
    降低分辨率,可以用 win10 自带的照片(不要问我怎么知道的,这个自带应用除了卡没别的,某些方面比 PR 还牛逼)
    wenyifancc
        10
    wenyifancc  
       2020-04-10 15:59:05 +08:00
    ffmpeg -i 1.mp4 -s 1920x1080 -vcodec hevc_qsv -preset veryslow -q:v 13 -acodec copy 2.mp4 #使用 Intel 核显硬编码 H.265,质量一般,速度快,q:v 为质量参数,越小质量越高
    ffmpeg -i 1.mp4 -s 1920x1080 -vcodec hevc_nvenc -preset slow -q:v 13 -acodec copy 2.mp4 #使用 Nvidia 显卡硬编码 H.265,质量不错,速度非常快,q:v 为质量参数,越小质量越高,需要 GTX10XX 及以上显卡
    wenyifancc
        11
    wenyifancc  
       2020-04-10 16:00:24 +08:00
    @wsseo 把-s 1920x1080 换成你的-strict -2 -vf scale=-1:1440 就行了,要质量关键还是看编码技术和编码质量参数
    xmoiduts
        12
    xmoiduts  
       2020-04-10 16:04:37 +08:00 via Android
    这些命令行听起来好高端,请问想学压片软件有哪些教程 我只知道一个 crf 一个 cbr/vbv……
    chihiro2014
        13
    chihiro2014  
       2020-04-10 16:17:06 +08:00
    @xmoiduts 啥也不懂,小丸一波走就可以了。CRF 的话一般 23.5 是最佳值,你想视频体积小,不在意画质,调成 30
    jim9606
        14
    jim9606  
       2020-04-10 16:22:05 +08:00
    先确定你的设备能不能支持硬解 HEVC,如果支持可以考虑换用 HEVC

    没查到要求-strict,你是不是用的是老版本?

    ffmpeg -i 1.mp4 -vf scale=-1:1440 -vcodec libx265 -crf 28 -preset slow 2.mp4

    crf 越小质量越好但体积和转码耗时更大,libx264 默认 23,libx265 默认 28,h264 建议添加-profile high 缩小体积

    ffmpeg -i 1.mp4 -vf scale=-1:1440 -vcodec libx264 -crf 23 -preset slow -profile high 2.mp4

    preset 越慢画质越好但耗时更多,一般建议最少 medium,最多 veryslow

    medium 也嫌慢又有新 N 卡(10/16/20 系)的可以用 NVENC ( hevc_nvenc , h264_nvenc ),就算 slow 速度也比较快,不过画质会差些

    ffmpeg -i 1.mp4 -vf scale=-1:1440 -vcodec hevc_nvenc -preset slow 2.mp4

    ffmpeg -i 1.mp4 -vf scale=-1:1440 -vcodec h264_nvenc -preset slow -profile high 2.mp4
    fuxiaopang
        15
    fuxiaopang  
       2020-04-10 16:29:20 +08:00   ❤️ 3
    这个是压缩到优酷超清的最低标准的命令
    ffmpeg -i input -b:v 4000k -minrate 3500k -maxrate 10000k -bufsize 4000k -s 1920x1080 -r 25 -g 25 -c:v libx264 -ar 48000 -b:a 192k -strict -2 output.mp4

    然后给你一个我总结多年经验的终极命令
    这个命令可以帮你把所有奇怪的分辨率自动加黑边遮幅,变成一个没有拉扯的 16:9 的视频,如果本身就是 16:9 那就直接按照最终参数渲染

    ffmpeg -i input.mp4 -filter:v "scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2" -b:v 4000k -minrate 3500k -maxrate 10000k -bufsize 4000k -r 25 -g 25 -c:v libx264 -ar 48000 -b:a 192k -strict -2 output.mp4
    wsseo
        16
    wsseo  
    OP
       2020-04-10 17:04:34 +08:00
    事情的经过是这样的,买了个爱奇艺 VR 一体机播放本地视频 VR 4K ( 4K*2160),谁知道播放的时候卡成 ppt,问客服才知道最大只支持 3840*2160 。
    felixlong
        17
    felixlong  
       2020-04-10 17:35:01 +08:00
    @wsseo 4K*2160 和 3840x2160 难道不是一回事吗?
    pkookp8
        18
    pkookp8  
       2020-04-10 17:44:00 +08:00 via Android
    @wsseo 4k 就是 3840*2160
    客服忽悠你呢吧
    还是帧率问题
    wsseo
        19
    wsseo  
    OP
       2020-04-10 17:47:30 +08:00
    @pkookp8 @felixlong 我下的视频确实是 4000 多*2160,
    pkookp8
        20
    pkookp8  
       2020-04-10 17:51:59 +08:00 via Android
    @wsseo 视频编码界的编码格式果然千奇百怪。。。
    edius
        21
    edius  
       2020-04-10 17:54:12 +08:00
    4K 电影定义为 4096*3112 等标准比较多,电视 4K3840*2160
    kojirou
        22
    kojirou  
       2020-04-11 01:03:04 +08:00
    handbrake 好用一些
    wsseo
        23
    wsseo  
    OP
       2020-04-11 02:22:45 +08:00
    @wenyifancc @jim9606
    今天测试了一下,使用显卡这个参数 vcodec h264_nvenc 都会明显降低码率,画质也降低了很多,转码时间跟 cpu 差不多。

    直接使用主题正文中的命令比较符合我的期望:体积,码率降低一点,画质基本看不出变化,分辨率降低到指定值。
    ungrown
        24
    ungrown  
       2020-10-02 12:20:07 +08:00
    -vf scale=用的没错,不过建议把 -1: 改成 -2:
    -2 能保证伸缩后的边长是 2 的倍数
    因为不少编码器不支持奇数的边长,要求偶数
    搞不好还有要求是 4 的倍数的(这是我猜的)
    总之 -1 换成 -2 基本可以满足绝大多数情况

    如果你不是批量跑,其实也可以计算器算好了手动制定 -s 2560x1440 (举例)
    批量跑,不确定源分辨率,有需要自动保持画面比例,那就 -vf scale=-2:1440
    -2:1440 表示伸缩时以高为基准,宽会以高为基础保持比例调解
    也可以以宽为基础,那就是 -2:1440

    其实 scale 保持比例自动伸缩的话是分 4 种情况的:
    以长边为基准,以短边为基准
    而在横屏和竖屏下宽高长短的关系正好对调
    所以是 4 种情况
    如果只缩不伸的话,还要先判断一下分辨率有没有超过
    你不需要全自动话,就不用考虑这么复杂

    我自己用 python 写了 ffmpeg 的封装脚本,主要是满足自用需求
    https://github.com/mo-han/mo-han-toolbox#wrapffmpeg-aliases-ffmpeg-ff
    里面包含了全自动的输出画面按比例缩小
    目前只有两挡:缩小到全高清 1920x1080 以内,和高清 1280x720 以内
    因为我自己平常不输出全高清以上的分辨率,所以没有写更高分辨率的情况
    但是代码很简单,可以很容易加上
    我这就去加上
    ungrown
        25
    ungrown  
       2020-10-02 12:21:57 +08:00
    上面有笔误,以高为基准是-2:1440,以宽为基准是 2560:-2
    ungrown
        26
    ungrown  
       2020-10-02 12:33:32 +08:00
    草,才发现挖坟了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:50 · PVG 06:50 · LAX 14:50 · JFK 17:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.