美文网首页Android技术知识Android开发经验谈Android开发
音视频开发需要你懂得的 H264 编码原理

音视频开发需要你懂得的 H264 编码原理

作者: 程序老秃子 | 来源:发表于2022-09-07 15:57 被阅读0次

    引言

    音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性, 码流的结构,码流中一些重要信息sps,pps,vps,start code 以及基本的工作原理,而大多同学都只是一知半解,所以导致代码中的部分内容虽可以简单理解却不知其意

    H264 视频压缩算法无疑是现在所有视频压缩技术中使用最广泛,最流行的;随着 x264/openh264 以及 ffmpeg开源库的推出,大多数使用者无需再对 H264 的细节做过多的研究,这大降低了人们使用 H264的成本

    但为了用好 H264,我们还是要对 H264的基本原理弄清楚才行;今天我们就来介绍以下 H264 的相关基本原理

    H264 编码(帧内预测)

    帧内预测模式中,预测块P是基于已编码重建块和当前块形成的;对亮度像素而言, P 块用于 4×4 子块或者 16×16 宏块的相关操作

    4×4亮度子块有9种可选预测模式,独立预测每一个4×4亮度子块,适用于带有大量细节的图像编码;16×16亮度块有4种预测模式,预测整个16×16亮度块,适用于平坦区域图像编码;色度块也有4种预测模式,类似于16×16亮度块预测模式;编码器通常选择使P块和编码块之间差异最小的预测模式

    H.264 中,预测编码与变换/量化编码、熵编码并列的重要组成部分,对编解码器的性能具有重大影响;预测编码主要包括两部分:帧内预测和帧间预测

    帧内预测

    帧内编码的图像其最主要特点是可以不依赖参考图像,可以独立解码,因而可以作为一个GOP的起点和随机接入点,即IDR帧

    然而另一方面,按照帧内编码输出的码率相对较高,即压缩率较低;究其原因在于,帧内编码为了确保可独立解码这一最关键的特性只利用了图像的空间冗余进行压缩,无法充分利用视频信息前后帧之间的关联

    帧间预测

    与帧内编码不同帧间编码所利用的是视频的时间冗余;通常在视频信息中,每一帧所包含的物体对象与其前后帧之间存在运动关系,这种物体的运动关系即构成帧与帧之间的时间冗余;由于帧与帧之间物体的运动相关性大于一帧内部相邻像素之间的相关性,尤其对于时间相近的图像之间,时间冗余比空间冗余更加明显

    H264 运动补偿理论

    运动补偿包括全局运动补偿分块运动补偿两类

    运动补偿是一种描述相邻帧(相邻在这里表示在编码关系上相邻,在播放顺序上两帧未必相邻) 差别的方法,具体来说是描述前面一帧(相邻在这里表示在编码关系上的前面,在播放顺序上未必在当前帧前面)的每个小块怎样移动到当前帧中的某个位置去

    这种方法经常被视频压缩/视频编解码器用来减少视频序列中的空域冗余;它也可以用来进行去交织(deinterlacing)的操作

    一个视频序列包含一定数量的图片--通常称为帧;相邻的图片通常很相似,也就是说,包含了很多冗余;使用运动补偿的目的是通过消除这种冗余,来提高压缩比

    全局运动补偿

    全局运动补偿中,运动模型基本上就是反映摄像机的各种运动,包括平移,旋转,变焦等等。这;模型特别适合对没有运动物体的静止场景的编码;全局运动补偿有下面的一些优点

    • 该模型仅仅使用少数的参数对全局的运行进行描述,参数所占用的码率基本上可以忽略不计

    • 该方法不对帧进行分区编码,这避免了分区造成的块效应

    • 在时间方向的一条直线的点如果在空间方向具有相等的间隔,就对应了在实际空间中连续移动的点;其它的运动估计算法通常会在时间方向引入非连续性

    至此,我们今天 H264 的相关编码原理就介绍到这里了;希望以上的内容能够对大家有所帮助,关于 H264 的相关技术问题,我们还要去好好的学习剖析;因此我把工作中遇到的 音视频 H264 编码器问题,以及对网上大部分的资料的收集和整理,最终整合出了一份 《高级音视频开发学习笔记》,有需要这份学习笔记的朋友,可以 简信 发送 “笔记” 即可 免费获取

    内容展示如下:

    高级音视频开发学习笔记目录

    基础部分

    • C++ 基本知识总结
    • C 和C++ 的主要区别是什么?
    • 结构程序设计和面向对象程序设计的概念
    • 什么是类和对象?
    • 面向对象程序设计的三大特征是什么?
    • 类的组成
    • 结构体和类的区别是什么?
    • 类对象的定义方法和对象成员的表示方法
    • 构造函数和析构函数

    JNI 编程

    • Android 中 JNI & NDK 入门(一) 之 初识 NDK 和 JNI
    • Android 中 JNI & NDK 入门(二) 之 Java 与 Native 相互调用
    • JNI 静态注册与动态注册详解
    • 静态注册
    • 动态注册

    高级音视频开发学习笔记获取方式 :简信发送 “笔记” 即可 免费获取

    【JNI编程】JNI 中进行线程同步

    • 预备知识
    • 约束限制
    • API
    • MonitorEnter
    • MonitorExit
    • 监视器的入口和出口
    • 实际使用

    FFmpeg 编译过程

    • 准备资料
    • ndk 环境配置
    • 编写脚本文件

    FFmpeg 引入 AndroidStudio

    • 新建项目
    • 配置 build.gradle
    • 配置 CMakeLists.txt 文件
    • 编写测试代码(头文件一定要用 extern 包含住)

    高级音视频开发学习笔记获取方式 :简信发送 “笔记” 即可 免费获取

    音视频格式封装原理

    • 视频解码基础 01 -封裝格式
    • 视频文件封装格式
    • 音视频编码方式简介
    • 视频编码方式
    • 音频编码方式
    • MP3
    • AAC
    • WMA

    H264 编码基础 06 -- 编码标准之战

    • 一个视频标准的普及其实是商业利益博弈的结果
    • 一个视频标准能普及还在于他的对手
    • WMV
    • VP8
    • AV1

    H264 编码基础 01 帧与场

    • 视频序列帧、场编码方式
    • H264 编码(帧内预测)
    • 视频流 H264 的组装
    • 三种帧的说明
    • 压缩算法的说明
    • 手写 H264 编码器

    有需要完整版高级音视频开发学习笔记的朋友:可以 简信 发送 “笔记” 即可 免费获取

    对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

    技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

    加油!让我们早日成为音视频高级开发者

    相关文章

      网友评论

        本文标题:音视频开发需要你懂得的 H264 编码原理

        本文链接:https://www.haomeiwen.com/subject/dfugnrtx.html