长视频转码的正确姿势
暑假在老家待着,闲着看电视,不管是综艺还是电影。不过用的是各种不知名的app看的,主打一个海量免费,问题是广告多,画质在85吋的电视上惨不忍睹,还经常卡。
这种流媒体服务公司应该想办法提升自己的用户体验,广告商在这里投放广告,效果也不好啊。这里最核心的涉及到的视频技术是长视频转码。
这个技术放在现在应该不是什么问题了,hevc与av1都已经成熟,av1的视频即使在老电视上用dav1d解码问题也不在话下。转码的资源也不用太多投入,没有强大的服务器,根本不是事。每年淘汰的手机这么多,想想办法用手机主版搭一个转码集群,电费也不高。
下面讨论正事,如何转码,带宽低画质高,转码效率也高。小投入大产出,这是我们的做事原则。乐视当年每上一级45分钟的电视,花24小时转码,那都是土豪干的事。
首先、码率控制
码率控制是视频编码器的核心技术模块,核心目标是在满足信道带宽、存储空间等约束的前提下,平衡输出码率与视频编码质量,避免码流溢出或带宽浪费。
1.基本原理
它通过动态调整量化参数QP和拉格朗日因子λ,结合分级比特分配、缓冲机制实现码流稳定输出,核心支撑模型包括R-λ模型、R-Q模型等。
- 先按目标码率和视频复杂度,为GOP、帧、编码单元逐层分配目标比特数
- 再通过率失真优化计算对应QP,让实际输出比特尽可能匹配预设目标
2.主流控制模式
|
模式 |
特点与适用场景 |
|
CBR(恒定比特率) |
全程输出码率稳定,适合直播、传统广播电视场景 |
|
VBR(可变比特率) |
随画面复杂度动态分配码率,同等画质下可节省30%-50%带宽,适配流媒体、离线存储场景 |
|
ABR(平均比特率) |
保证长时段平均码率达标,多用于自适应流媒体业务 |
|
CRF(恒定速率因子) |
锁定编码质量水平,优先保障主观观看体验 |
3.技术演进
- H.264/AVC阶段:形成成熟的JVT-H017、JVT-N046方案,采用GOP/帧/基本单元三层R-Q模型完成码率控制
- HEVC阶段:演进出URQ像素级控制模型、更贴合码率失真关系的R-λ模型,控制精度大幅提升
- 最新方向:结合深度学习实现精准带宽预测,开发超低延迟VBR算法,适配AR/VR等实时交互场景
4.典型优化手段
- 2-pass编码:先全量分析源视频复杂度,再二次编码精准分配比特,画质表现更优
- Lookahead预分析:提前预判后续帧复杂度,提前预留比特资源,避免复杂帧画质骤降
- 低延迟窗口控制:用双窗口分别管控码率延迟与视频质量,适配实时视频编码场景
第二、率失真包络
每个编码器,即使是不同的编码参数,每一个视频的在不同分辨率编码都会遵循类似如下的率失真包络图:

多分辨率编码率失真包络图(引自“微帧”)
这个图AI画不出来,网上找的。
这个图每条曲线左上的点可以拟合成一个更大曲线,使得每个分辨率的曲线与这个拟合曲线相切。那么这几个点就是不同分辨率下的清晰度编码甜点。
第三、编码器preset与多线程编码
如下以libx264为例说明:
libx264编码器的preset是一套预定义的编码参数集合,核心作用是在编码速度和压缩效率之间做灵活权衡:同等画质下,选择速度越慢的preset,最终生成的视频文件体积越小、压缩率越高;反之速度越快的preset,编码耗时越短,但文件体积会明显更大。
1.预设等级总览
libx264一共提供10个按编码速度降序排列的预设档位,默认值为medium:
ultrafast > superfast > veryfast > faster > fast > medium > slow > slower > veryslow > placebo
其中placebo属于极端优化档位,相比veryslow仅能获得约1%的画质/压缩率提升,编码耗时却会成倍增加,实际生产环境几乎不会使用,通常可以直接忽略。
2.各档位特性与适用场景
- ultrafast:编码速度接近文件直接复制,几乎关闭了所有复杂优化逻辑,生成的文件体积最大。适合实时屏幕录制、快速预览的临时编码场景,比如1小时的演示视频仅需数分钟即可完成编码。
- superfast:画质和压缩效率略优于ultrafast,仍保留了极快的编码速度,适合批量快速处理会议录像等对耗时敏感的场景。
- veryfast:是直播推流遇到性能瓶颈时的常用应急档位,在保证编码实时性的前提下,能提供可接受的基础画质。
- faster / fast:属于中等偏快的档位,逐步开启更多运动估计、参考帧优化,兼顾了速度和压缩率,适合日常批量转码的通用场景。
- medium:libx264的默认预设,参数配置均衡,在编码速度和画质压缩比之间取得了最普适的平衡,绝大多数常规转码场景都可以直接使用该档位。
- slow / slower:开启B帧双向预测、更精细的运动搜索等优化,细节保留度显著提升,压缩效率明显优于默认档位,适合制作4K宣传片、高质量存档视频这类对画质要求较高的场景。
- veryslow:是实用场景下最慢的预设,会启用全部高级编码优化逻辑,相比ultrafast最终生成的文件体积可缩小30%左右,适合对文件体积敏感、不限制编码耗时的高质量母带存档场景。
3.多线程编码与压缩率
编码器开启多线程主要是为了提高编码速度,但是由于线程的增加,会破坏编码图像的时空相关性,最终导致压缩率损失。默认线程数一般是cpu物理核心数的1.5倍。单线程一般比4线程的压缩率提高20%。
第四、长视频编码器转码
根据以上讨论,我们要最后落地到文章开篇所提到的场景。如何快速找到每个视频每个分辨率编码的甜点。回答这个问题这前先要定下来,我们的编码器策略。
1.二次编码
2pass的码率控制一般对比crf编码,在同样的编码体积下,画质能提升10%左右
2.单线程
刚才提到过,单线程对默认线程数至少压缩率提升20%
3.Preset的确定
虽然是离线转码,但是我们没有在为5%的压缩率去数倍的提高编码复杂度的必要。我们选定默认档medium之后的两档的preset:slower.
4.快速找到编码甜点
2015年前,我们的业务以长视频为主,至少2分钟以上那种。
我们的办法:
1)对每个视频进行gop全量分析(5~10秒左右片段),特征:码率,gop-qp. 进行二维逆变换采样,取其中8个片段。
注:毫秒级任务,不解码视频帧。对于非h.264流,可以跳过gop-qp解析,增加采样片数,直接进入2)并对输出码率分布做逆变换采样,求取本视频的最终码率。
2)对每个片段做一次 scale:-1:360;preset:veryfast;crf:28转码。得到8个码率,去掉最高码率与最低码率取加权平均值。
注:1秒级任务。所有片段并行,毫秒级输出码率,然后求解。
3)对长视频重新分段。分段原则可以自己定义,我们是如下:
- 每段视频不小于2分钟
- 长视频最多分段数为10
注:毫秒级任务。
4)基于2)所得码率进行换算到当前分辨率的码率,对每段视频进行二次转码。采用2pass,单线程,preset:slower转码。
注:主要耗时任务。一次转码是快速编码,并且多分辨率可复用。主要耗时在二次转码,多核心cpu开启并行任务,并行实现倍速转码。对于现代cpu起步8核心,至少提速6倍。1小时视频转码任务时长压缩成分钟级。
5)分段转码视频,音频的合并
注:毫秒级任务。
通过上述转码的原则,我们比crf:23转码在同样清晰度下压缩率提升一倍以上。分段转码的启动任务可以根据本地的cpu核心数进行调度,充分利用本地算力。当然这个方法更适合在服务器上做集群调度转码,任务的粒度可控,调度算法简单可靠可预知。
最后,可以接合现在的超分算法更进一步提升端侧清晰度,这个需要对超分模型进行微调。当然上述方法是可以完全迁移到hevc和av1转码的。我们这里也提供x264,x265与svt-av1的优化编码器,编码速度与压缩率都有相应的提升。欢迎交流接洽。
我先找找15年的脚本,找到了就分享给大家试用哈。
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)