type
status
date
slug
summary
tags
category
icon
password
Property
Mar 25, 2023 12:51 PM
前置知识

H.264 基础知识

  • 视频为什么需要进行编码压缩?
    • notion image
  • 为什么压缩的原始数据一般采用YUV格式?
    • notion image
  • 视频压缩原理-数据冗余
    • notion image
  • 图像帧的类型 (I帧、P帧和B帧)
    • notion image
  • GOP(一组图像,Group of Pictures)和GOP长度
    • notion image
    • GOP之Closed GOP和Open GOP
      • notion image
    • GOP间隔
      • notion image
  • H264编码原理
    • notion image
    • 宏块扫描
      • notion image
      • 宏块扫描是视频编码中的一个重要概念,用于将视频图像分割成更小的块,并对每个块进行编码。在视频编码中,图像通常被分割为一系列的宏块,每个宏块包含 16x16 个像素。
      • 宏块扫描算法决定了在对图像进行编码时,应如何对宏块进行排列和扫描。常见的宏块扫描算法包括行扫描、逐行扫描、斜向扫描等。行扫描算法是指在每一行上依次扫描每个宏块;逐行扫描算法是指在每一列上依次扫描每个宏块;斜向扫描算法是指按照一定的斜线方向依次扫描每个宏块。
      • 宏块扫描算法的选择会影响编码的效率和压缩率。例如,行扫描算法可以更好地利用视频压缩中的局部性原理,因为宏块之间通常具有很高的相似性。而斜向扫描算法可以减少图像中的局部冗余,从而提高压缩率。因此,不同的宏块扫描算法在不同的场景下具有不同的优劣。
    • 残缺块
      • notion image
    • 帧内预测
      • notion image
    • 帧间预测
      • notion image
    • DCT 变换和量化
      • notion image
      • DCT变换
        • notion image
      • 量化步长
        • notion image
          notion image
      • 量化步长表
        • notion image

编码原理总结

notion image

FFmpeg 流程

notion image

相关 API

  • av_image_get_buffer_size() : 用于计算给定图像参数的图像数据所需的缓冲区大小。具体来说,它可以计算使用给定图像格式、宽度、高度和对齐方式的图像所需的最小缓冲区大小。
    • 函数原型如下:
    • pix_fmt :表示图像的像素格式
    • width :表示图像的宽度
    • height :表示图像的高度
    • align :表示缓冲区对齐方式,此参数是设定内存对⻬的对⻬数,也就是按多⼤的字节进⾏内存对⻬
      • ⽐如设置为1,表示按1字节对⻬,那么得到的结果就是与实际的内存⼤⼩⼀样。
      • 再⽐如设置为4,表示按4字节对⻬。也就是内存的起始地址必须是4的整倍数。
    • 返回值表示所需的缓冲区大小,以字节为单位
  • av_image_alloc() :用于分配给定图像参数的图像数据缓冲区。具体来说,它可以根据给定图像格式、宽度、高度和对齐方式分配缓冲区,并将缓冲区指针、每行数据大小和总体数据大小返回给调用方。
    • 函数原型如下:
    • pointers是一个指针数组,用于返回分配的缓冲区指针;
    • linesizes 是一个整型数组,用于返回每行数据的大小;
    • wh分别表示图像的宽度和高度;
    • pix_fmt表示图像的像素格式;
    • align表示缓冲区对齐方式。
    • 返回值:所申请的内存空间的总⼤⼩。如果是负值,表示申请失败。
  • av_image_fill_arrays()用于填充给定图像参数的图像数据缓冲区。具体来说,它可以根据给定的缓冲区指针、每行数据大小和图像格式,将图像数据缓冲区分割成不同平面,并将平面数据指针、每行数据大小和对应的高度返回给调用方。
    • av_image_fill_arrays()函数⾃身不具备内存申请的功能,此函数类似于格式化已经申请的内存,即通过av_malloc()函数申请的内存空间,或者av_frame_get_buffer()函数申请的内存空间。
      函数原型如下:
    • dst_data是一个指针数组,用于返回图像数据缓冲区的平面指针;
    • dst_linesize是一个整型数组,用于返回每行数据的大小;
    • src是源数据缓冲区的指针;
    • pix_fmt表示图像的像素格式;
    • widthheight分别表示图像的宽度和高度;
    • align表示缓冲区对齐方式。

H.264 码率设置

  • 什么是视频码率?
    • 视频码率是视频数据(包含视频⾊彩量、亮度量、像素量)每秒输出的位数。⼀般⽤的单位是kbps。
  • 设置视频码率的必要性
    • notion image
  • 手机设置码率建议
    • notion image

FFmpeg 与 H.264 编码指南

鉴于x264的参数众多,各种参数的配合复杂,为了使⽤者⽅便,x264建议如⽆特别需要可使 ⽤preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整⼀些具体参数以 符合⾃⼰需要,⼿动设定的参数会覆盖preset和tune⾥的参数。
  • 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值

notion image

选择⼀个preset和tune

  • preset
    • notion image
  • tune
    • notion image
      notion image
  • profile
    • notion image

低延迟

x264提供了⼀个 -tune zerolatency 选项。

兼容性

notion image
notion image

X264 参数之 zerolatency 的分析

notion image
notion image
notion image

YUV 编码为 H.264 代码

视频花屏、绿屏、黑屏黄屏的排查思路

notion image
notion image
 
算法合集FFmpeg 音频编码