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

降低视频文件中画面的码率是怎么个原理?逐帧图片降低质量吗?

  •  
  •   JinTianYi456 · 2021-05-25 16:07:03 +08:00 · 2769 次点击
    这是一个创建于 1059 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是有不同算法吗?用哪个参数来设置的?

    第 1 条附言  ·  2021-05-25 17:01:15 +08:00

    降低视频文件中video流的码率是什么原理?

    12 条回复    2021-05-26 13:11:52 +08:00
    GalaDOS
        1
    GalaDOS  
       2021-05-25 16:22:27 +08:00
    过程是把视频文件解码成原始像素数据,再用更低的码率去编码。参数一般就是编码器的-bitrate,-qp 之类的。
    因为基本都是有损编码,每次转码都会有损失。并且目标码率越低,质量降得越明显。
    jsion
        2
    jsion  
       2021-05-25 16:33:42 +08:00   ❤️ 1
    确实有对每一帧的图片计算压缩,那么必然损失一些像素信息,尤其是运动画面会有不稳定的情况,码率不完全恒定,具体自己去看 ffmpeg 的设置:crf (限制码率) cqp (固定质量) abr(平均码率)
    longbye0
        3
    longbye0  
       2021-05-25 16:37:47 +08:00 via iPhone   ❤️ 1
    帧内和帧间压缩都有。

    帧内你可以简单理解为图像压缩,帧间就计算运动向量,压缩他们的差值。

    不同算法就不同编码器,和选择相应的 profile 。
    JinTianYi456
        4
    JinTianYi456  
    OP
       2021-05-25 16:54:08 +08:00
    @GalaDOS @jsion 是还要深入一层,就是说: 降低画面码率,我知道肯定是要丢失画面信息的,那么如何丢失?是否有不同的丢失策略 /算法?就比如说一个视频画面它 maxrate:v 是 100K 的,然后我加参数-maxrate:v 70K 降低码率。假设默认的降码率算法是 A( 前面的命令就等于`-maxrate:v 70K -降码算法 A` ),然后它还有个其它降码率算法是 B 又或者还有 C 。我想问的就是`-maxrate:v 70K -降码算法 B`这样子
    fgodt
        5
    fgodt  
       2021-05-25 17:34:53 +08:00   ❤️ 1
    这个比较专业了,视频编码需要用到一个 DCT 变换,DCT 变换本来是无损的但是编码会用到一个量化,量化后的数据就变成了有损数据,量化的值就决定了损失的数据的多少,视频的码率控制着量化值。
    码率控制一般以一组图像为标准( GOP ),所以视频的质量确实是逐帧图片降低质量
    GalaDOS
        6
    GalaDOS  
       2021-05-25 17:36:32 +08:00
    @JinTianYi456 画面信息丢失的多少,由编码器选择的量化参数决定。打一个比方,浮点数“1.33”,选择不同的量化参数后,它会被压缩成“1.3”,或者“1”,甚至“0”。参数的选择影响输出数据的多少,以及丢失信息的多少。对应到视频数据,每一帧画面被划分成很多小块,每个小块有一个量化参数,编码器通过控制每个小块的量化参数,调整每一帧画面的数据量,进而控制码率。

    至于实际上这些量化参数如何选择,则是码率控制算法决定的。这个大概就是你想知道的“降码算法”吧。以 x264 为例,它大体有 crf,abr,cqp 这些选择。如果你有特定的目标码率,那基本就只能用 abr 。因为 crf 和 cqp 都只关注画面质量,不控制输出码率。如果你只是想要一个相对比较小的码率,也可以用 crf 和 cqp,给一个比较大的值,也即要求一个比较低的画面质量,码率自然就跟着降低了。

    如果你还想问 abr 这些码控算法的具体原理,这个就很难在论坛里说清楚了,最好还是自己搜文献看吧。
    xmumiffy
        7
    xmumiffy  
       2021-05-25 19:18:34 +08:00 via Android   ❤️ 1
    @JinTianYi456 降码算法就是编码器 h264 h265 av1 之类的
    Rheinmetal
        8
    Rheinmetal  
       2021-05-25 21:31:22 +08:00
    了解原理要去看论文和代码了 比如经典的 x264
    msg7086
        9
    msg7086  
       2021-05-26 00:13:39 +08:00
    没有 降低码率 的算法。

    降低码率本质上是指用更低的码率重新压缩视频。

    比如原始的未压缩视频是 20000kbps,你先压缩到 100kbps,现在要重新压缩到 70kbps,这意味着你先把视频解压成 20000kbps,然后用和第一次压缩类似的算法,丢弃更多的细节后,压缩到 70kbps 。

    至于视频的压缩,这是一个很庞大的话题,几千字是说不清的,可以考虑去啃资料和教程,或者去听一些大学或者研究生课程。简单来说有几步。首先是帧间动态预测,一组相似的画面可以通过帧间压缩来降低码率,整个画面被切割成 MB 或者 CU,然后每个块与前后帧进行比较,如果残差比较省空间,就编码成残差,否则就原样按照画面编码。接下去跑 DCT 转换成频域,然后量化砍细节,最后执行无损压缩。
    urmyfaith
        10
    urmyfaith  
       2021-05-26 09:25:43 +08:00
    嗑瓜子学习
    xrr2016
        11
    xrr2016  
       2021-05-26 09:37:03 +08:00
    离散余弦变换
    no1xsyzy
        12
    no1xsyzy  
       2021-05-26 13:11:52 +08:00
    DCT 会有个问题,在维持总体平均码率的情况下,亮场码率高,暗场码率低
    你可以看看一些画面变动频繁的游戏,比如各种 FPS,或者我刚听说这个的时候正好老菊在更骑砍 2,也是非常明显。
    现在一个技巧就是,在上传时候的视频把亮度直接调高,压制效果就好不少。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4090 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:10 · PVG 12:10 · LAX 21:10 · JFK 00:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.