H.264编码

简介: H.264编码

1.为什么要对视频进行编码

      视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像,由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频,这么多连续的图像数据如果不经过编码则数据量太大了。

2.H.264编码框架

H.264码流文件分为两层

(1)VCL(Video Coding Layer,视频编码层): 负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。

(2)NAL (Network Abstraction layer,网络提取层): 负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。I不管在本地播放还是网络播放,都要通过这一层来传输。

VCL就是被压缩编码后的原始数据

将VCL数据封装到NAL单元中,才可以用于传输和存储

3.H.264码流分析

一般H.264编码器的默认输出为:起始码+NAL单元(NALU)。起始码为:0x00000001或者0x000001

(1)NAL单元

H.264的编码视频序列包括一系列的NAL单元。

一个NAL单元=一个原始字节序列负载(RBSP)+一个对应于视频编码的NAL头文件

H.264码流NAL单元序列如图

(2)NAL Header

通过解析NAL头部,可以确定每个NAL单元的帧类型IPB帧。

l帧:帧内编码帧,关键帧,l帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像。

P:前向预测编码,记录了本帧跟之前的一个关键帧(或P)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。

B帧:双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。

NAL头的组成:

NAL头由一个字节组成,如下所示:

语法:禁止位(1位)、重要性指示位(2位)、NALU类型(5位)

|0|1|2|3|4|5|6|7|

|F|NRI| Type|

NAl头信息的每一位说明如表所示

0 1~2 3~7
简称 F NRI TYPE
全称 forbidden_zero_bit nal_ref_idc nal_unit_type
中文 禁止位 重要性指示位 NALU类型
作用 当网络发现NAL单元有比特错误时,可设置该比特为1,以便接收方丢掉该单元 标志该NAL单元用于重建时的重要性,值越大,越重要,取值为00~11 1~23表示单个NAL包,24~31需要分包或者组合发送。

nal_unit_type取值的含义如下:

   

(3)原始字节序列负载(RBSP)

每个NAL单元包含一个RBSP。典型的RBSP单元序列如图

每个单元都独立的NAL单元传送。NAL单元的信息头(1字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。

RBSP各部分的解释:

RBSP 描述
参数集PS 序列的全局参数
增强信息SEI 视频序列解码的增强信息
图像定界符 视频图像的边界
编码 片(Slice)的头信息和数据
数据分割 DP片层的数据,用于错误恢复解码
序列结束符 表明下一图像为IDR图像
流结束符 表明该流中已没有图像
填充数据 元数据,用于填充字节

片(Slice):

一帧图片经过 H.264 编码器之后,就被编码为一个或多个片 (slice),每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块),NAL单元就是装载着这些片 (slice)的载体。

片的语法结构:片头规定了片的类型,属于哪个图像、有关的参考图像等;片的数据包含了一系列宏块和不编码数据。

4.H.264编码原理

      H.264编码的原理是通过利用帧内和帧间的相关性、运动估计、变换、量化和熵编码等技术来减小视频数据的体积,从而实现高效的视频压缩。解码器在接收到H.264编码的视频流后,通过反向过程将其还原为可视的视频序列,以实现视频的播放和显示。

目录
相关文章
|
存储 编解码 算法
H.264编码及AAC编码基础 1
H.264编码及AAC编码基础
978 0
|
7月前
|
人工智能 自然语言处理 机器人
阿里云计算巢一键部署 OpenClaw (Clawdbot) 及阿里云百炼 API-Key 配置详细教程
2026年,阿里云计算巢针对OpenClaw推出专属一键部署方案,依托云巢平台的预置镜像与可视化管理能力,彻底跳过手动配置依赖、调试参数、安装软件等复杂流程,将原本需要数小时的部署工作压缩至20分钟内完成。该方案最大亮点在于“标准化部署+无缝授权”,用户无需接触任何代码,仅需完成简单配置与授权,即可快速启用专属AI助手,同时支持无缝对接阿里云百炼大模型,实现更智能的自然语言交互与任务拆解。本教程基于阿里云计算巢官方实操指南与多场景测试经验,从部署前准备、核心步骤拆解、API-Key配置、功能验证与拓展,到常见问题排查,进行全流程保姆级讲解,确保零基础用户也能顺利完成部署与配置。
1195 10
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
1811 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
2379 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
网络协议 网络安全 流计算
【流媒体】RTMP、RTSP、HLS、HTTP协议的介绍与对比
【流媒体】RTMP、RTSP、HLS、HTTP协议的介绍与对比
2133 0
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
1836 1
|
Python
Python:Python环境搭建
搭建Python 3.8.5环境,下载amd64安装包,选择自定义安装,添加环境变量。安装完成后,通过Win+R打开CMD输入`python`验证安装,或用`python -V`查看版本。Python运行包括交互式和文件式。初学者可尝试在IDLE中打印"Hello, World!",或进行人名对话练习,输入姓名后输出欢迎语。
655 1
Python:Python环境搭建
|
存储 编解码 算法
H.264视频编码:Slice的艺术与实践
H.264视频编码:Slice的艺术与实践
915 0
|
编解码 缓存 算法
h264编码流程分析
h264编码流程分析
1535 0