JinTianYi456
V2EX  ›  FFmpeg

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

  •  
  •   JinTianYi456 · May 25, 2021 · 3686 views
    This topic created in 1816 days ago, the information mentioned may be changed or developed.

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

    Supplement 1  ·  May 25, 2021

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

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

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

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

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

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

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

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

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