news 2026/8/27 12:07:02

音视频开发之H.264 入门知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
音视频开发之H.264 入门知识

大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考。

基础概念

H.264又称为MPEG-4, 它是一种面向块,基于运动补偿的视频编码标准,是目前市面上最常用的一种视频编码格式,在Android中你可以通过MediaCodec.createEncoderByType(“video/avc”)的形式来创建一个编码器,也可以通过软编avcodec_find_encoder(AV_CODEC_ID_H264) / avcodec_find_encoder_by_name(“libx264”)的形式来创建一个编码器。因为该篇文章的主题是分析 H.264 码流,就不再过多介绍怎么来进行编码了。现在就直接来了解一些常用概念吧。

GOP

两个 I 帧之间形成的一组图片,就是 GOP (Group Of Picture) 的概念。

I 帧

I 帧又称为视频的关键帧,你可以理解为它是一帧画面的完整图像,可以直接拿这个 I 帧来解码

特点:

1、它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码及传输

2、解码时仅用 I 帧的数据就可以重构完整图像

3、I 帧描述了图像背景和运动主体的详情

4、I 帧不需要参考其它画面而生成

5、I 帧是 P/B 帧的参考帧(其质量直接影响到同组中以后个帧的质量)

6、I 帧是帧组GOP的第一帧,在一组中只有一个 I 帧

7、I 帧不需要考虑运动矢量

8、I 帧所占数据的信息量比较大

B 帧

B 帧又称为双向差别帧,也就是本帧与前后帧的差别,大白话的意思就是要解码 B 帧,不仅要拿到之前缓存的画面,还要解码之后的画面,通过前后画面的叠加来还原最终的画面。

特点:

1、B 帧是由前面的 I 帧或 P 帧和后面的 P 帧来进行预测的

2、B 帧传送的是它前面的 I 帧或 P 帧和后面的 P 帧之前的预测误差及运动矢量

3、B 帧是双向预测编码帧

4、B 帧压缩率最高,因为它只反映参考帧间运动主体的变化情况,预测比较准确

5、B 帧不是参考帧,不会造成解码错误的扩散

P 帧

P 帧又称为前预测编码帧。P 帧表示的是这一帧跟之前的一个 I 或 P 帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,来生成最终画面。

特点:

1、P 帧是 I 帧后面相隔 1~2 帧的编码帧

2、P 帧采用运动补偿的方法传送它与前面的 I 或 P 真的差值及运动矢量

3、解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像

4、P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 或者 P 帧

5、P 帧可以是其后面的 P 帧的参考帧,也可以是其前后的 B 帧的参考帧

6、由于 P 帧是参考帧,所以它可能造成解码错误的扩散

7、由于是差值传送,所以 P 帧的压缩率比较高

基本的帧概念了解的差不多了,下一步我们基于代码来分析码流

码流分析

H.264又称为裸流,是由多个NALU组成。如果NALU对应的Slice为一帧的开始,那么就用 4 个 字节表示,即 0x00 00 00 01 , 否则用 3 字节表示,0x00 00 01。要分析H.264码流首先是从码流中搜索起始位,也就是刚刚说的0x00 00 00 01 或者 0x00 00 01起始位,然后在分离 NALU, 最后再解析各个字段。下面我们先来看下NALU Headertype 代表的含义:

type说明
0保留
1非 IDR 图像中不采用数据划分的片段
2非 IDR 图像中 A 类数据划分的片段
3非 IDR 图像中 B 类数据划分的片段
4非 IDR 图像中 C 类数据划分的片段
5IDR 图像的片段
6补充增强信心 (SEI)
7SPS (序列参数集)
8PPS (图像参数集)
9分割符
10序列结束符
11流结束符
12填充数据
13序列参数集扩展
14带前缀的 NAL 单元
15子序列参数集
16 - 18保留
19不采用数据划分的辅助编码图像片段
20编码片段扩展
21 - 23保留
24 - 31保留

在实际开发中用的最多的也就是 1 、5 、7、8 , 下面我们用代码来进行分析:

代码分析

代码很简单,就是读文件,搜索起始码然后一个字节一个字节读,这里直接贴结果吧

如何进阶学习

成体系的音视频入门进阶的资料少之又少,一个刚毕业小白可能很难切入理解,因为音视频中涉及大量理论知识,而代码的书写需要结合这些理论,所以搞懂音视频,编解码等理论知识至关重要。

本人也是从实习开始接触音视频项目,看过很多人的文章,无意中在GitHub上发现一个标星6.8K的开源项目,在这里分享给大家,让更多准备学习音视频的同学更快入门进阶。

以下是这份开发文档的部分章节:

阶段一:Android多媒体

第1章 三种方式绘制图片

第2章 AudioRecord录制PCM音频

第3章 AudioTrack播放PCM音频

第4章 Camera视频采集

第5章 MediaExtractor MediaMuxer 实现视频的解封装与合成

第6章 MediaCodec硬编解流程与实践

阶段二:OpenGL ES

第7章 OpenGL ES 基本概念

第8章 GLSL及Shader的渲染流程

第9章 OpenGL ES 绘制平面图形

第10章 GLSurfaceView源码解析&EGL环境

第11章 OpenGL ES矩阵变换与坐标系统

第12章 OpenGL ES之纹理

第13章 OpenGL ES 滤镜 (篇一)

第14章 OpenGL ES 实时滤镜

第15章 OpenGL ES粒子系统 - 喷泉

第16章 OpenGL ES粒子效果-烟花爆炸

阶段三::JNI&NDK

第17章 JNI与NDK的学习和使用

第18章 JNI - 引用类型、异常处理、函数注册

第19章 NDK构建方式 ndk-build与cmake

第20章 指针、内存模型、引用

第21章 运算符重载、继承、多态、模版

第22章 STL 之 容器

子系列 算法

第23章 算法系列 - 冒泡排序

第24章 算法系列-快速排序

第25章 算法系列-堆排序

第26章 算法系列-选择、插入排序以及STL中sort的实现

第27章 算法序列 - 二叉查找树

第28章 算法序列 - 平衡二叉树

第29章 算法序列 - 散列表

阶段四 : FFmpeg

第30章 音视频基础知识

第31章 FFMPEG常用命令

第32章 FFMPEG +OPENSL ES实现音频解码和播放

第33章 FFMPEG + OPENGLES 边解码边播放视频

由于篇幅限制,这里只能展示部分内容,朋友们如果需要这份完整版的PDF资料合集,微信扫描下方CSDN官方二维码【免费获取】。

小结

音视频行业已经发展很多年了,随着近几年移动端越来越多的音视频APP的出现,将音视频推向一个高潮,但是由于音视频的学习成本很高,很多开发者望而却步,为了跟紧时代的步伐,需要的朋友可以免费获取一下上文的资料,给大家破除音视频的“高门槛”,希望可以共同进步。

总之,音视频已经强势崛起,相信未来的十年一定是音视频的十年。并且将音视频技术与计算机视觉和人工智能结合将引领未来二十年。

以后我将多多分享相关文章,关注我不要迷路!

现在正是学习音视技术的最佳时机,大家一定要把握住机会,跟上时代的步伐,让自己可以在未来大有作为。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 12:04:08

Agentic事件响应:数字孪生与多尺度规划打造安全智能运维闭环

如果你负责过线上系统的事件响应,大概率经历过这样几个场景:凌晨两点告警群突然刷屏,你一边翻 Runbook 一边手动查监控;同一个故障,上下游同学各查各的,最后发现是同一个根因;最麻烦的是&#x…

作者头像 李华
网站建设 2026/8/27 12:02:04

简单讲解Java中的synchronized

1. 为什么需要 synchronized?在多线程环境下,多个线程可能同时访问和修改共享资源,导致数据不一致的问题。例如:两个线程同时对同一个银行账户余额进行“取款”操作,可能因为操作的非原子性(读-改-写&#…

作者头像 李华
网站建设 2026/8/27 11:58:59

WorldCup Arena:无泄漏的前瞻性LLM锦标赛评测框架

这次我们来看一个不太一样的 LLM 评估项目:WorldCup Arena。它把大模型评测做成了持续进行的“世界杯”锦标赛,模型要像球队一样实时对抗、现场作答,评测题目在设计时还没有出现。换句话说,这不是又一套静态 benchmark&#xff0c…

作者头像 李华
网站建设 2026/8/27 11:58:23

Coze+Dify工作流实战:从在线验证到本地部署与API封装

这次我们来看一个职场向 AI 落地组合:Coze Dify 工作流。很多人纠结这两个平台到底该选哪个,其实它们不是二选一的关系。Coze(扣子)是字节跳动推出的 AI 智能体开发平台,走的是在线 SaaS 路线,胜在开箱即用…

作者头像 李华
网站建设 2026/8/27 11:58:22

java学习过程中遇到的问题

//打印菱形,分为两部分:正等腰三角形,倒等腰三角形 public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入奇数:");int num sc.nextInt();if (num % 2 0) {return;}int mid num / 2;//第一部分:正等腰三角形--…

作者头像 李华
网站建设 2026/8/27 11:57:02

Grasshopper参数化曲面AI着色:从颜色映射到自动化配色

在 Rhino 里完成一个复杂曲面之后,最容易被低估的一步是表达。曲面本身只有几何信息,没有材质、没有颜色、也没有语义;一旦需要把建筑表皮分层、产品渐变、数据可视化结果或 3D 打印样件涂上颜色,手动贴图很快就会失控。Grasshopp…

作者头像 李华