type
status
date
slug
summary
tags
category
icon
password
Property
Mar 25, 2023 12:51 PM
前置知识
H.264 基础知识
- 视频为什么需要进行编码压缩?
- 为什么压缩的原始数据一般采用YUV格式?
- 视频压缩原理-数据冗余
- 图像帧的类型 (I帧、P帧和B帧)
- GOP(一组图像,Group of Pictures)和GOP长度
- GOP之Closed GOP和Open GOP
- GOP间隔
- H264编码原理
- 宏块扫描
- 宏块扫描是视频编码中的一个重要概念,用于将视频图像分割成更小的块,并对每个块进行编码。在视频编码中,图像通常被分割为一系列的宏块,每个宏块包含 16x16 个像素。
- 宏块扫描算法决定了在对图像进行编码时,应如何对宏块进行排列和扫描。常见的宏块扫描算法包括行扫描、逐行扫描、斜向扫描等。行扫描算法是指在每一行上依次扫描每个宏块;逐行扫描算法是指在每一列上依次扫描每个宏块;斜向扫描算法是指按照一定的斜线方向依次扫描每个宏块。
- 宏块扫描算法的选择会影响编码的效率和压缩率。例如,行扫描算法可以更好地利用视频压缩中的局部性原理,因为宏块之间通常具有很高的相似性。而斜向扫描算法可以减少图像中的局部冗余,从而提高压缩率。因此,不同的宏块扫描算法在不同的场景下具有不同的优劣。
- 残缺块
- 帧内预测
- 帧间预测
- DCT 变换和量化
- DCT变换
- 量化步长
- 量化步长表
编码原理总结
FFmpeg 流程
相关 API
av_image_get_buffer_size()
: 用于计算给定图像参数的图像数据所需的缓冲区大小。具体来说,它可以计算使用给定图像格式、宽度、高度和对齐方式的图像所需的最小缓冲区大小。pix_fmt
:表示图像的像素格式width
:表示图像的宽度height
:表示图像的高度align
:表示缓冲区对齐方式,此参数是设定内存对⻬的对⻬数,也就是按多⼤的字节进⾏内存对⻬- ⽐如设置为1,表示按1字节对⻬,那么得到的结果就是与实际的内存⼤⼩⼀样。
- 再⽐如设置为4,表示按4字节对⻬。也就是内存的起始地址必须是4的整倍数。
- 返回值表示所需的缓冲区大小,以字节为单位
函数原型如下:
av_image_alloc()
:用于分配给定图像参数的图像数据缓冲区。具体来说,它可以根据给定图像格式、宽度、高度和对齐方式分配缓冲区,并将缓冲区指针、每行数据大小和总体数据大小返回给调用方。pointers
是一个指针数组,用于返回分配的缓冲区指针;linesizes
是一个整型数组,用于返回每行数据的大小;w
和h
分别表示图像的宽度和高度;pix_fmt
表示图像的像素格式;align
表示缓冲区对齐方式。- 返回值:所申请的内存空间的总⼤⼩。如果是负值,表示申请失败。
函数原型如下:
av_image_fill_arrays()
:用于填充给定图像参数的图像数据缓冲区。具体来说,它可以根据给定的缓冲区指针、每行数据大小和图像格式,将图像数据缓冲区分割成不同平面,并将平面数据指针、每行数据大小和对应的高度返回给调用方。dst_data
是一个指针数组,用于返回图像数据缓冲区的平面指针;dst_linesize
是一个整型数组,用于返回每行数据的大小;src
是源数据缓冲区的指针;pix_fmt
表示图像的像素格式;width
和height
分别表示图像的宽度和高度;align
表示缓冲区对齐方式。
av_image_fill_arrays()函数⾃身不具备内存申请的功能,此函数类似于格式化已经申请的内存,即通过av_malloc()函数申请的内存空间,或者av_frame_get_buffer()函数申请的内存空间。
函数原型如下:
H.264 码率设置
- 什么是视频码率?
视频码率是视频数据(包含视频⾊彩量、亮度量、像素量)每秒输出的位数。⼀般⽤的单位是kbps。
- 设置视频码率的必要性
- 手机设置码率建议
FFmpeg 与 H.264 编码指南
鉴于x264的参数众多,各种参数的配合复杂,为了使⽤者⽅便,x264建议如⽆特别需要可使
⽤preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整⼀些具体参数以
符合⾃⼰需要,⼿动设定的参数会覆盖preset和tune⾥的参数。
- 使⽤ffmpeg -h encoder=libx264 命令查询相关⽀持的参数
英⽂地址:https://trac.ffmpeg.org/wiki/Encode/H.264 。内容有⼀定出⼊,但是可以借鉴学习。
- x264是⼀个 H.264/MPEG4 AVC 编码器,本指南将指导新⼿如何创建⾼质量的H.264视频。 对于普通⽤户通常有两种码率控制模式:CRF(Constant Rate Factor)和Two pass ABR。码率控制是⼀种决定为每⼀个视频帧分配多少⽐特数的⽅法,它将决定⽂件的⼤⼩和质量的分配。 如果你在编译和安装libx264 ⽅⾯需要帮助,请查看ffmpeg和x264编译指南: http://ffmpeg.org/trac/ffmpeg/wiki/CompilationGuide
CRF(Constant Rate Factor):
选择⼀个CRF值
选择⼀个preset和tune
- preset
- tune
- profile
低延迟
x264提供了⼀个 -tune zerolatency 选项。
兼容性
X264 参数之 zerolatency 的分析
YUV 编码为 H.264 代码
视频花屏、绿屏、黑屏黄屏的排查思路
- 作者:OctalZero
- 链接:https://octalzero.com/article/e5d3e585-936a-4ae8-a974-0e85879e814d
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章