|
|
今晚的信息量有点大。我还是从结论开始说吧。用ffmpeg封装。我一开始考虑了直接用原生内核,但
视频编码探究日记
一般来说一种编码器lib都会有不同厂家封装。我认为是有3层。你可以直接用最核心的编码第一层,也可以用厂家(如英特尔、英伟达)优化过的第二层,也可以用第二或第三层ffmpeg调用原生或调用封装过的(比如SVT、NV版)像套娃一样。如果是在生产环境或者下载安装的时候就区分好硬件,那无疑是用第二层的封装最直接(不冗余)。
但如果需要兼容不同的系统和硬件软件编码等因素,确实ffmpeg是包全了。没有更好的方案了
Tips:记得开启AV1全拓展功能,编码命令-threads 0 的时候可以压榨全部CPU核心。且还有其他功能值得使用
以下是额外扩展,可能需要手动指定编译,编码的时候肯定也要带一大堆参数(注意编译和编码是不一样的)
超分辨率预测(Super Res)
- 这是 AV1 的标志性特性。编码时先把视频帧下采样缩小(比如 1080P 缩到 720P),对缩小后的低分辨率帧进行编码;解码时再通过 AV1 内置的超分辨率算法,把低分辨率帧还原回原始分辨率。
核心逻辑是:低分辨率帧的冗余信息更少,编码后体积更小,而超分算法能保证解码画质。 - 在 4K/8K 等高分辨率视频中,可提升 5%~15% 的压缩率(同等画质下文件体积更小)。
分辨率越高,收益越大 —— 比如 8K 视频用 Super Res,压缩率提升比 1080P 高 2~3 倍。
缺点是会增加编解码的计算量(编码时多了下采样,解码时多了超分)。
循环滤波增强(Loop Filter Enhancement)
- 视频编码会把帧拆分成小块(宏块),块与块之间容易出现 “块效应”(画面有格子感)。循环滤波是在编码的环路中(编码→预测→残差→解码反馈)对块边缘进行平滑处理,消除块效应。
AV1 的循环滤波增强是在传统滤波基础上,增加了自适应强度调整—— 根据画面内容(平坦区 / 纹理区)动态改变滤波力度。 - 原理是:消除块效应后,画面的 “主观画质” 更好,因此可以用更低的码率达到相同的观感;同时,滤波后的帧冗余信息更少,后续帧的预测更精准。
自适应变换(Adaptive Transform)
- 视频编码中,“变换” 是把像素域的信号转换成频域信号(比如 DCT 变换),频域信号更容易压缩(高频信息可丢弃)。
AV1 的自适应变换支持多种变换类型(DCT、DST、Identity 等),并能根据每个宏块的内容自动选择最优变换方式—— 比如纹理复杂的块用 DST 变换,平坦的块用 DCT 变换。 - 相比传统编码固定用一种变换,自适应变换能让每个块的变换残差更小(残差越小,需要编码的数据越少),从而直接降低码率。在纹理丰富的画面(比如 AI 生成的细节图、自然风景)中收益更高。
帧内预测模式扩展(更多角度 / 分区)
- 帧内预测是 “用同一帧内已编码的像素,预测未编码的像素”,减少帧内冗余。传统编码(如 H.265)的帧内预测角度较少(比如 33 种),而 AV1 扩展了预测角度数量(增加到上百种),同时支持更精细的分区(比如 4x4、8x8 小尺寸块)。
简单说:能更精准地匹配画面的纹理方向(比如斜线、曲线)。 - 在包含大量斜线、曲线、复杂纹理的画面(比如 AI 绘画的人物发丝、建筑轮廓)中效果显著 —— 精准的预测能大幅减少残差数据;在平坦画面(比如纯色背景)中收益较低。
熵编码优化(CDEF/CFL 滤波)
- 熵编码是编码的最后一步,对 “变换后的残差数据” 进行无损压缩(类似 ZIP 压缩)。AV1 的熵编码优化结合了两种前置滤波:
- CDEF(循环去块效应滤波):进一步消除块效应,让残差数据更集中;
- CFL(循环帧内预测滤波):优化帧内预测的残差,减少冗余。
滤波后的数据熵值更低,熵编码的压缩效率更高。
- 它不直接改变编码的预测逻辑,而是通过优化输入熵编码器的数据,让无损压缩阶段能 “挤” 出更多体积空间。对所有类型的视频都有收益,没有明显短板。
叠加效应:
同时启用这五项特性,总压缩率提升不是简单相加,而是协同增益—— 在 4K 视频中,总压缩率可比基础 AV1 编码提升 15%~30%,这也是 libaom 全功能版压缩率优于其他编码器的核心原因。
示例:
ffmpeg -i input_ai.mp4 \ -c:v libaom-av1 \ # 核心压缩/画质参数(针对8bit AI素材) -crf 22 \ # 肉眼无损失,平衡体积 -cpu-used 1 \ # 压缩率优先,速度可接受 -threads 0 \ # 自动拉满CPU # 启用所有高级压缩特性 -enable-superres 1 \ -enable-intra-angle-ext 2 \ -enable-adaptive-transform 2 \ -enable-cdef 1 -enable-cfl 1 \ # 10bit编码+编辑器兼容关键配置 -pix_fmt yuv420p10le \ # 10bit输出,兼容主流编辑器 -color_range limited \ # 匹配8bit素材的有限色域(避免过曝) -colorspace bt709 \ # 标准SDR色域,AE/剪映默认支持 -color_trc bt709 \ # gamma曲线匹配,避免偏色 # 画质均匀性优化 -aq-mode 3 \ -g 120 \ # 适配AI视频帧间差异大的特点 # 音频(适配后期编辑) -c:a aac -b:a 192k \ # AAC兼容性比Opus更好,AE/剪映直接识别 output_ai_av1_10bit.mp4
视频编码探究日记
关于有没有必要把8位转为10位编码,颠覆了我的认知。毕竟不管是输入还是输出,实际用到的都是8位256色。
我自己AE合成师 多年的经验和心得:哪怕真实数据是以8位输入、8位输出、或8位显示。但是中间的编码过程都可以用10位或16位来保证避免”舍入误差“。
这真的是需要像素级、1/255色差的肉眼识别力 才会发现的细节。当然,8转16工作空间,在多图层乘除的时候优势差距就很明显了!2018年的时候做龟派气功叠了很多光效 那时候已经有所直觉了。后来在2024年接触游戏引擎浮点色、LED灯珠 的时候也栽了跟头,吃了”舍入误差“的亏。
硬编码确实会损质量,所以UHQ是必须开启的(小小丸1.5.4没开,所以差距明显)
视频编码探究日记
GPU型号说明(需要2022年之后的)
- NVIDIA:AV1 硬编码是 Ada Lovelace 及更新架构的 8th Gen NVENC 专属,RTX 30 系及更早(Ampere/Turing)均不支持编码,仅能解码NVIDIA。
- AMD:RDNA3 架构的 VCN 4.0 才支持 AV1 编码,RDNA2(RX 6000 系)仅支持解码,且部分低端型号(如 RX 6400/6500)解码也受限。
- Intel:仅 Arc 锐炫独显支持 AV1 硬编码,DG1 仅解码;Intel 所有核显(包括 UHD 770)均不支持 AV1 硬编码。
- (这我要是做到小小丸里,不就坑得要命?大多数用户可能没那么新的显卡)
还有一个坑:Direct3D 12 AV1 编码仅支持 Windows 11 24H2(WDDM 3.2)及以上,且仅支持新显卡。果然还是太超前了,没用户没业务就不会有人探究。
但是总的来说。如果过个5年再开发这软件,D3D肯定是最方便的选择了。不然跟小小丸一样还得前置判断硬件型号(这也是小丸不支持GPU的原因)
但是ffmpeg会提供mp4等视频容器,导致解密门槛降低。不然光凭码流无容器,都不需要加密了,正常人是打不开的。
|
|