【知识点】H264, H265硬件编解码基础及码流分析
前言
1. 概览
1.1. 为什么要编码
1.2. 编码技术
1.3. 编码分类
- 软件编码(简称软编):使用CPU进行编码。
- 硬件编码(简称硬编):不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。
- 软编:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。
- 硬编:性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
1.4. 编码原理
- I帧:关键帧.完整编码的帧.可以理解成是一张完整画面,不依赖其他帧
- P帧:参考前面的I帧或P帧,即通过前面的I帧与自己记录的不同的部分可以形成完整的画面.因此,单独的P帧无法形成画面.
- B帧:参考前面的I帧或P帧以及后面的P帧
补充: I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50. 但是iOS中一般不开启B帧,因为B帧的存在会导致时间戳同步较为复杂.
- 帧内压缩

- 帧间压缩: P帧与B帧的压缩算法
帧间压缩11.jpg
- 有损压缩: 解压缩后的数据与压缩前的数据不一致.在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复
- 无损压缩: 压缩前和解压缩后的数据完全一致.优化数据的排列等.
- DTS:主要用于视频的解码,在解码阶段使用.
- PTS:主要用于视频的同步和输出.在渲染的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的。
1.dtspts
2. 编码数据码流结构
2.1 刷新图像概念.
- 逐行扫描:每次扫描得到的信号就是一副图像,也就是一帧. 逐行扫描适合于运动图像
- 隔行扫描:扫描下来的一帧图像就被分为了两个部分,这每一部分就称为「场」,根据次序分为:「顶场」和「底场」.适合于非运动图像

帧与场.png2.2. 重要参数
- 视频参数集VPS(Video Parameter Set)
- 序列参数集SPS(Sequence Parameter Set)
- 图像参数集PPS(Picture Parameter Set)
- 档次: 主要规定编码器可采用哪些编码工具或算法。
- 级别: 指根据解码端的负载和存储空间情况对关键参数(最大采样率、最大图像尺寸、分辨率、最小压缩比、最大比特率、解码缓冲区DPB大小等)加以限制。
2.3. 原始码流
- IDR
- 结构
RBSP = SODB + RBSP trailing bits
NALU = NAL header(1 byte) + RBSP
H.264 = Start Code Prefix(3 bytes) + NALU + Start Code Prefix(3 bytes) + NALU +…

- 组成
2.3.1. H.264码流

- StartCode : Start Code 用于标示这是一个NALU 单元的开始,必须是”00 00 00 01” 或”00 00 01”(Annex B码流格式才必须是”00 00 00 01” 或”00 00 01”)
- NALU Header下表为 NAL Header Type
NAL Header Type.png
2.IDR
| 十六进制 | 二进制 |
| 0x67 | 0 11 00111 |
注意: 可以将start code理解为不同nalu的分隔符,header是某种类型的key,payload是该key的value.
2.3.2.码流格式
- Annex B
- AVCC
| bits | line by byte | remark |
|
| 8 | version | always | 0x01 |
| 8 | avc profile | sps[0][1] |
|
| 8 | avc compatibility | sps[0][2] |
|
| 8 | avc level | sps[0][3] |
|
| 6 | reserved | all bits on |
|
| 2 | NALULengthSizeMinusOne |
|
|
| 3 | reserved | all bits on |
|
| 5 | number of SPS NALUs usually | 1 |
|
| 16 | SPS size |
|
|
| N | variable SPS NALU data |
|
|
| 8 | number of PPS NALUs usually | 1 |
|
| 16 | PPS size |
|
|
| N | variable PPS NALU data |
|
|
2.3.3. H.265码流
| 十六进制 | 二进制 |
| 0x4001 | 0 100000 000000 001 |
- forbidden_zero_bit = 0:占1个bit,与H.264相同,禁止位,用以检查传输过程中是否发生错误,0表示正常,1表示违反语法;
- nal_unit_type = 32:占6个bit,用来用以指定NALU类型
- nuh_reserved_zero_6bits = 0:占6位,预留位,要求为0,用于未来扩展或3D视频编码
- nuh_temporal_id_plus1 = 1:占3个bit,表示NAL所在的时间层ID
| nal_unit_type | NALU类型 | 备注 |
| 0 | NAL_UNIT_CODE_SLICE_TRAIL_N | 非关键帧 |
| 1 | NAL_UNIT_CODED_SLICE_TRAIL_R |
|
| 2 | NAL_UNIT_CODED_SLICE_TSA_N |
|
| 3 | NAL_UINT_CODED_SLICE_TSA_R |
|
| 4 | NAL_UINT_CODED_SLICE_STSA_N |
|
| 5 | NAL_UINT_CODED_SLICE_STSA_R |
|
| 6 | NAL_UNIT_CODED_SLICE_RADL_N |
|
| 7 | NAL_UNIT_CODED_SLICE_RADL_R |
|
| 8 | NAL_UNIT_CODED_SLICE_RASL_N |
|
| 9 | NAL_UNIT_CODE_SLICE_RASL_R |
|
| 10 ~ 15 | NAL_UNIT_RESERVED_X | 保留 |
| 16 | NAL_UNIT_CODED_SLICE_BLA_W_LP | 关键帧 |
| 17 | NAL_UNIT_CODE_SLICE_BLA_W_RADL |
|
| 18 | NAL_UNIT_CODE_SLICE_BLA_N_LP |
|
| 19 | NAL_UNIT_CODE_SLICE_IDR_W_RADL |
|
| 20 | NAL_UNIT_CODE_SLICE_IDR_N_LP |
|
| 21 | NAL_UNIT_CODE_SLICE_CRA |
|
| 22 ~ 31 | NAL_UNIT_RESERVED_X | 保留 |
| 32 | NAL_UNIT_VPS | VPS(Video Paramater Set) |
| 33 | NAL_UNIT_SPS | SPS |
| 34 | NAL_UNIT_PPS | PPS |
| 35 | NAL_UNIT_ACCESS_UNIT_DELIMITER |
|
| 36 | NAL_UNIT_EOS |
|
| 37 | NAL_UNIT_EOB |
|
| 38 | NAL_UNIT_FILLER_DATA |
|
| 39 | NAL_UNIT_SEI | Prefix SEI |
| 40 | NAL_UNIT_SEI_SUFFIX | Suffix SEI |
| 41 ~ 47 | NAL_UNIT_RESERVED_X | 保留 |
| 48 ~ 63 | NAL_UNIT_UNSPECIFIED_X | 未规定 |
| 64 | NAL_UNIT_INVALID |
|
H.265的NALU类型是在信息头的第一个字节的第2到7位,所以判断H.265NALU类型的方法是将NALU第一个字节与0x7E进行与操作并右移一位,即:
NALU类型 = (NALU头第一字节 & 0x7E) >> 1
| bits | line by byte | remark |
| 8 | configurationVersion | always 0x01 |
| 2 | general_profile_space |
|
| 1 | general_tier_flag |
|
| 5 | general_profile_idc |
|
| 32 | general_profile_compatibility_flags |
|
| 48 | general_constraint_indicator_flags |
|
| 8 | general_level_idc |
|
| 4 | reserved | ‘1111’b |
| 12 | min_spatial_segmentation_idc |
|
| 6 | reserved | ‘111111’b |
| 2 | parallelismType |
|
| 6 | reserved | ‘111111’b |
| 2 | chromaFormat |
|
| 5 | reserved | ‘11111’b |
| 3 | bitDepthLumaMinus8 |
|
| 5 | reserved | ‘11111’b |
| 3 | bitDepthChromaMinus8 |
|
| 16 | avgFrameRate |
|
| 2 | constantFrameRate |
|
| 3 | numTemporalLayers |
|
| 1 | tmporalIdNested |
|
| 2 | lengthSizeMinusOne |
|
| 8 | numOfArrays |
|
【知识点】H264, H265硬件编解码基础及码流分析的更多相关文章
- iOS8系统H264视频硬件编解码说明
公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...
- 【STM32H7教程】第57章 STM32H7硬件JPEG编解码基础知识和HAL库API
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第57章 STM32H7硬件JPEG编解码基础知识 ...
- Android硬件编解码与软件编解码
最近做了一个android项目用到编解码功能.大概需求是:通过摄像头拍摄一段视频,然后抽帧,生成一个短视频,以及倒序视频,刚开始直接用 H.264 编码格式,没有使用MP4容器封装.做了 ...
- FFmpeg编解码处理1-转码全流程简介
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- YUV/RGB与H264之间的编解码
1.源码下载 http://download.videolan.org/x264/snapshots/ 2.编译 ./configure --prefix=./_install --enable-sh ...
- RocketMq通信协议格式及编解码 (源码分析)
一.RocketMq broker服务器与客户端的网络通信是基于netty4.x实现的,重点分析 RocketMq设计的通信协议及对应的编解码 开发. 名字解释 ...
- h264码流分析及其工具
总的来说H264的码流的打包方式有两种,一种为annex-b byte stream format的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_co ...
- H265码流分析
H265相比较于H264,除了包含SPS.PPS外,还多包含一个VPS:在NALU header上,H.264的HALU header是一个字节,而H.265则是两个字节. 以OX4001为例,头信息 ...
- VideoToolbox硬件编解码H.264视频流错误码
如果你不能找到在VTD中的错误代码我决定只包括他们在这里. (同样,所有这些错误,并更可以在里面VideoToolbox在Project Navigator中找到.本身). 您将获得无论是在VTD中 ...
随机推荐
- 【三】Kubernetes学习笔记-Pod 生命周期与 Init C 介绍
一.容器生命周期 Init C(初始化容器)只是用于 Pod 初始化的,不会一直随着 Pod 生命周期存在,Init C 在初始化完成之后就会死亡. 一个 Pod 可以有多个 Init C,也可以不需 ...
- Kubernetes-3.3:ETCD集群搭建及使用(https认证+数据备份恢复)
etcd集群搭建 环境介绍 基于CentOS Linux release 7.9.2009 (Core) ip hostname role 172.17.0.4 cd782d0a790b etcd1 ...
- rocketmq常见问题及使用 新手篇
一 部署阶段 1.启动命令 nameServer启动:nohup sh bin/mqnamesrv -n ip地址:9876 & broker启动:nohup sh bin/mqbroker ...
- centOS 7-Hadoop3.3.0完全分布式部署
本文内容不乏对各大佬的案例借鉴,侵删. 本次实验用到的有虚拟机,Xshell,Hadoop压缩包和jdk压缩包 hadoop111A:192.168.241.111 hadoop222B:192. ...
- 地理围栏API服务开发
地理围栏API服务开发 要使用华为地理围栏服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中. 指定应用权限 如果需要使用地理围栏服务 ...
- MindSpore模型推理
MindSpore模型推理 如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置.推理器加载模型的方式有以下三种: 加载本地模型. 加载远程模型. 混合加载本地和远 ...
- 多尺度目标检测 Multiscale Object Detection
多尺度目标检测 Multiscale Object Detection 我们在输入图像的每个像素上生成多个锚框.这些定位框用于对输入图像的不同区域进行采样.但是,如果锚定框是以图像的每个像素为中心生成 ...
- jsp页面抽取
步骤: 1.先将jsp中要抽取的公共部分剪切出来,黏贴到新的jsp文件中,取名叫xxx.jsp 2.在需要引入此公共部分的jsp页面中使用<%@include file="xxx.js ...
- UF_CSYS 坐标系操作
Open C UF_CSYS_ask_csys_info 获取WCS坐标系的原点坐标和矩阵标识UF_CSYS_ask_matrix_of_object 获得对象 ...
- 31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本
在上章我们学习了ListView,然后实现了: 28.qt quick-ListView高仿微信好友列表和聊天列表,本章我们来学习SwipeView滑动视图,并出高仿微信V2版本: 1.Contain ...