Hi3531D调试手记(Ex):图像编解码基础_hi3531 编码质量设置-程序员宅基地

技术标签: Hi3531D调试手记  


  本部分内容 原文出处:(推荐阅读)H264, H265硬件编解码基础及码流分析。这一口奶得很及时,把个人需要的部分抓过来收藏了。

1. 概览

1.1. 为什么要编码

  众所周知,视频数据原始体积是巨大的,以720P 30fps的视频为例,一个像素大约3个字节,如下所得,每秒钟产生87MB,这样计算可得一分钟就将产生5.22GB。

数据量/每秒 = 1280*720*33*3/1024/1024 = 87MB

  因此,像这样体积重大的视频是无法在网络中直接传输的,而视频编码技术也就因运而生。

1.2. 编码技术

  经过很多年的开发迭代,已经有很多大牛实现了视频编码技术,其中最主流的有H.264编码,以及新一代的H.265编码。谷歌也开发了VP8,VP9编码技术。

1.3. 编码分类

  • 软件编码(简称软编):使用CPU进行编码。
  • 硬件编码(简称硬编):不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。

  软编的实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。硬编的性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

1.4. 编码原理

  对视频执行编码操作后,原始视频数据会被压缩成三种不同类型的视频帧: I帧、P帧、B帧。

  • I帧:关键帧.完整编码的帧。可以理解成是一张完整画面,不依赖其他帧。
  • P帧:参考前面的I帧或P帧,即通过前面的I帧与自己记录的不同的部分可以形成完整的画面。因此,单独的P帧无法形成画面。
  • B帧:参考前面的I帧或P帧以及后面的P帧。

PS:I帧的压缩率是 7(跟 JPG 差不多),P帧是 20,B帧可以达到 50。

1.5. 编码的两种核心算法

  • 帧内压缩
      当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码 jpeg 差不多。

  如下图:我们可以通过第 1、2、3、4、5 块的编码来推测和计算第 6 块的编码,因此就不需要对第 6 块进行编码了,从而压缩了第 6 块,节省了空间。
在这里插入图片描述

  • 帧间压缩: P帧与B帧的压缩算法
      相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

  如下图,可以看到前后两帧的差异其实是很小的,这时候用帧间压缩就很有意义。
在这里插入图片描述

1.6. 概念补充

  有损压缩与无损压缩

  • 有损压缩::解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。
  • 无损压缩::压缩前和解压缩后的数据完全一致。优化数据的排列等。

  DTS和PTS

  • DTS:主要用于视频的解码,在解码阶段使用。
  • PTS:主要用于视频的同步和输出,在渲染的时候使用。在没有B帧的情况下,DTS 和 PTS 的输出顺序是一样的。
    在这里插入图片描述
      如上图,I帧的解码不依赖于任何的其它的帧;而P帧的解码则依赖于其前面的I帧或者P帧;B帧的解码则依赖于其前的最近的一个I帧或者P帧及其后的最近的一个P帧。

2. 编码数据码流结构

  在我们的印象中,一张图片就是一张图像,视频就是很多张图片的集合.。但是因为我们要做音视频编程,就需要更加深入理解视频的本质。

2.1. 刷新图像概念

  在编码的码流中图像是个集合的概念,帧、顶场、底场都可以称为图像,一帧通常就是一幅完整的图像。

  • 逐行扫描:每次扫描得到的信号就是一副图像,也就是一帧。逐行扫描适合于运动图像。
  • 隔行扫描:扫描下来的一帧图像就被分为了两个部分,这每一部分就称为「场」,根据次序分为:「顶场」和「底场」。隔行扫描适合于非运动图像。
    在这里插入图片描述
    在这里插入图片描述

2.2. 重要参数

  • 视频参数集VPS(Video Parameter Set):VPS主要用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频的扩展。

(1)用于解释编码过的视频序列的整体结构,包括时域子层依赖关系等。HEVC 中加入该结构的主要目的是兼容标准在系统的多子层方面的扩展,处理比如未来的可分级或者多视点视频使用原先的解码器进行解码但是其所需的信息可能会被解码器忽略的问题。
(2)对于给定视频序列的某一个子层,无论其 SPS 相不相同,都共享一个 VPS。其主要包含的信息有:多个子层或操作点共享的语法元素;档次和级别等会话关键信息;其他不属于SPS的操作点特定信息。
(3)编码生成的码流中,第一个 NAL 单元携带的就是 VPS 信息。

  • 序列参数集 SPS(Sequence Parameter Set):包含一个 CVS 中所有编码图像的共享编码参数。

(1)一段 HEVC 码流可能包含一个或者多个编码视频序列,每个视频序列由一个随机接入点开始,即 IDR/BLA/CRA。序列参数集SPS包含该视频序列中所有 SLICE 需要的信息。
(2)SPS 的内容大致可以分为几个部分:1、自引 ID;2、解码相关信息,如档次级别、分辨率、子层数等;3、某档次中的功能开关标识及该功能的参数;4、对结构和变换系数编码灵活性的限制信息;5、时域可分级信息;6、VUI。

  • 图像参数集 PPS(Picture Parameter Set):包含一幅图像所用的公共参数,即一幅图像中所有片段 SS(Slice Segment)引用同一个 PPS。

(1)PPS 包含每一帧可能不同的设置信息,其内容同 H.264 中的大致类似,主要包括:1、自引信息;2、初始图像控制信息,如初始 QP 等;3、分块信息。
(2)在解码开始的时候,所有的PPS全部是非活动状态,而且在解码的任意时刻,最多只能有一个 PPS 处于激活状态。当某部分码流引用了某个 PPS 的时候,这个 PPS 便被激活,称为活动 PPS,一直到另一个 PPS 被激活。

  参数集包含了相应的编码图像的信息。SPS 包含的是针对一连续编码视频序列的参数(标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等)。PPS 对应的是一个序列中某一幅图像或者某几幅图像 ,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。
  通常,SPS 和 PPS 在片的头信息和数据解码前传送至解码器。每个片的头信息对应一个 pic_parameter_set_id,PPS 被其激活后一直有效到下一个 PPS 被激活;类似的,每个 PPS 对应一个 seq_parameter_set_id,SPS 被其激活以后将一直有效到下一个SPS被激活。
  参数集机制将一些重要的、改变少的序列参数和图像参数与编码片分离,并在编码片之前传送至解码端,或者通过其他机制传输。

2.3. 概念补充

  • 档次(Profile):主要规定编码器可采用哪些编码工具或算法。
  • 级别(Level):指根据解码端的负载和存储空间情况对关键参数(最大采样率、最大图像尺寸、分辨率、最小压缩比、最大比特率、解码缓冲区 DPB 大小等)加以限制。

2.4. 原始码流

  • IDR
      一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使用 IDR 之前的图像的数据来解码。
  • 结构
      由一个接一个的 NALU 组成的,而它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层)。下图以 H.264 的码流结构为例,如果是 H.265 则在 SPS 前还有 VPS。
    在这里插入图片描述
  • 组成
NALU (Nal Unit) = NALU Header + RBSP 

  在 VCL 数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元(以下简称 NALU,Nal Unit) 中。每个 NALU 包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组 对应于视频编码的 NALU 头部信息。RBSP 的基本结构是:在原始编码数据的后面填加了结尾 bit。一个 bit “1” 若干 bit “0”,以便字节对齐。

2.4.1 H.264码流

  一个原始的 H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成:
在这里插入图片描述

  • StartCode : Start Code 用于标示这是一个NALU 单元的开始,必须是 ”00 00 00 01” 或 ”00 00 01”
  • NALU Header:下表为 NAL Header Type。
    在这里插入图片描述

  举个栗子,下面两幅图分别代表IDR与非IDR帧具体的码流信息:
在这里插入图片描述
  在一个NALU中,第一个字节(即NALU header)用以表示其包含数据的类型及其他信息。我们假定一个头信息字节为0x67作为例子:

十六进制 二进制
0x67 0 11 00111

  如前表所示,头字节可以被解析成3个部分,其中:

  1. forbidden_zero_bit = 0:占1个bit,禁止位,用以检查传输过程中是否发生错误,0表示正常,1表示违反语法;
  2. nal_ref_idc = 3:占2个bit,用来表示当前 NAL 单元的优先级。非0值表示参考字段/帧/图片数据,其他不那么重要的数据则为0。对于非0值,值越大表示 NALU 重要性越高;
  3. nal_unit_type = 7:最后5位用以指定 NALU 类型,NALU 类型定义如前表所示。

  从表中我们可以获知,NALU 类型1-5为视频帧,其余则为非视频帧。在解码过程中,我们只需要取出 NALU 头字节的后5位,即将 NALU 头字节和0x1F进行与计算即可得知 NALU 类型,即:

NALU类型 = NALU头字节 & 0x1F

PS:可以将 start code 理解为不同 NALU 的分隔符,header 是某种类型的 key,payload 是该 key 的 value。

2.4.2 H.265码流

  HEVC 全称 High Efficiency Video Coding(高效率视频编码,又称 H.265),是比 H.264 更优秀的一种视频压缩标准。HEVC 在低码率视频压缩上,提升视频质量、减少容量即节省带宽方面都有突出表现。
  H.265 标准围绕 H.264 编码标准,保留原有的某些技术,同时对一些技术进行改进,编码结构大致上和H.264的架构类似。这里着重讲一下两者编码格式的区别。
  同 H.264一样,H.265 也是以 NALU 的形式组织起来。而在 NALU header 上,H.264 的HALU header 是一个字节,H.265 则是两个字节。我们同样假定一个头信息为 0x4001 作为例子:

十六进制 二进制
0x4001 0 100000 000000 001

  如表所示,头信息可以被解析成4个部分,其中:

  1. forbidden_zero_bit = 0:占1个bit,与 H.264 相同,禁止位,用以检查传输过程中是否发生错误,0表示正常,1表示违反语法;
  2. nal_unit_type = 32:占6个bit,用来用以指定 NALU 类型;
  3. nuh_reserved_zero_6bits = 0:占6位,预留位,要求为0,用于未来扩展或3D视频编码;
  4. nuh_temporal_id_plus1 = 1:占3个bit,表示 NAL 所在的时间层 ID。

  对比 H.264 的头信息,H.265 移除了 nal_ref_idc,此信息被合并到了 nal_unit_type 中,H.265 NALU 类型规定如下:

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_CODED_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
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.265 NALU 类型的方法是将 NALU 第一个字节与 0x7E 进行与操作并右移一位,即:

NALU类型 = (NALU头第一字节 & 0x7E) >> 1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38940316/article/details/114445938

智能推荐

NFC技术演进_nfc的演进-程序员宅基地

文章浏览阅读289次。RF演进protocol 演进_nfc的演进

1.3 wait 和notify 原理_wait 和 notify原理-程序员宅基地

文章浏览阅读384次。wait 和notify 是实现线程之间的协同工作,必须结合synchronized使用,wait 释放锁,notify 不释放锁(但是此时会通知在等待的wait,该notify完全执行完毕,才真正释放锁)public class DemoThread18{ //原子类 private volatile List<String> list = new ArrayList..._wait 和 notify原理

谷歌又出浏览器了Google Chrome_谷歌浏览器 我是人类-程序员宅基地

文章浏览阅读601次。相信大部分 做ui的朋友 都非常痛恨一件事情 就是程序以及css和不同浏览器的兼容问题,我就奇怪了google你不好好的做你的搜索引擎,弄什么浏览器呀,本让现在 作东西考虑各个浏览器兼容 已经够累的,你还真会添乱。本来做你就做也无所谓,还花那么大力气推广,要不说你有钱,有了用户群,写东西就不得不考虑你了,大哥我们这些 闷头写程序的不容易,我们还要养家户口呢,你就别添乱了行不行。 _谷歌浏览器 我是人类

微信公众号在线选房电子选车位房地产云开盘线上大屏幕抢房系统-程序员宅基地

文章浏览阅读551次,点赞18次,收藏9次。前端演示咨询客服:

MAKO Vimba2.0安装教程和qt中调用Vimba相机_vimba viewer-程序员宅基地

文章浏览阅读6.4k次,点赞7次,收藏29次。一、MAKO Vimba2.0安装教程1. 打开Vimba2.0安装软件,用户可到大恒官网下载最新驱动。2.选择选项Application Development和安装路径,注意:安装路径中不要存在空格。然后,点击Star,开始安装。 3.勾选Install Vimba Drivers,然后,点击Exit退出。4.接下来继续安装,勾选-选择“安装”,重复操作..._vimba viewer

【Linux4.1.12源码分析】协议栈报文接收之传输层处理分析(UDP)___udp4_lib_rcv-程序员宅基地

文章浏览阅读3k次。UDP报文的处理入口是udp_rcv函数,该函数是在ip_local_deliver_finish函数中被调用的。1、udp_rcv函数int udp_rcv(struct sk_buff *skb){ return __udp4_lib_rcv(skb, &udp_table, IPPROTO_UDP);}2、__udp4_lib_rcv函数int __udp4_lib_rcv___udp4_lib_rcv

随便推点

HOG特征——行人识别_hog特征识别行人 peopledetector=vision.peopledetector; i=-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏24次。HOG特征简介HOG 全称为 Histogram of Oriented Gradients ,即方向梯度的直方图。HOG 是由 Navneet Dalal & Bill Triggs 在 CVPR 2005发表的论文中提出来的,目的是为了更好的解决行人检测的问题。先来把这几个字拆开介绍,首先,梯度的概念和计算梯度的方法已经在前一篇文章中介绍了,方向梯度就是说梯度的方向我们也要利用上,..._hog特征识别行人 peopledetector=vision.peopledetector; i=imread(

Spring Cloud 微服务的安全保护_springboot微服务安全-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏9次。上一篇文章中介绍了如何使用Spring Cloud搭建微服务,在本文中讲讲如何对微服务进行安全保护。在Spring Cloud中对应用进行安全保护通常使用Spring Security,这种方式集成起来非常简单而且很容易扩展现有的应用场景。在分布式环境中Spring Security使用Spring Session和Redis来共享会话。共享会话可以将在微服务网关中登录的用户验证信息传递到系统..._springboot微服务安全

生物信息学中两种常用的文本文件_.fa.gz-程序员宅基地

文章浏览阅读961次。通过自学《碱基矿工》[http://mp.weixin.qq.com/mp/homepage?__biz=MzAxOTUxOTM0Nw==&hid=1&sn=d945cf61bd86e85724e146df42af5bcc&scene=18#wechat_redirect]下面分别介绍这两种格式FASTAFASTA常作为存储有顺序的序列数据的文件后缀,包括我们常用的..._.fa.gz

【centos安装mysql服务器并开启远程访问】_centos 查看 mysql 远程连接-程序员宅基地

文章浏览阅读1k次。centos安装mysql如果设置的密码太简单了会报错( ERROR 1819 (HY000): Your password does not satisfy the current policy requirements)解决方案如下:登录mysql执行:第一个密码强度等级,第二个是密码长度设置为6位(如果你设置的是8位就不做修改)另外可以通过语句查看密码设置规则2 赋权所有远程ip都可以进行登录(如果未开放端口得需要去腾讯云或者阿里云官网实例防火墙与策略开启端口,mysql默认的_centos 查看 mysql 远程连接

Linux(centos)下Nginx+Keepalived集群环境搭建_linux搭建nginx+keepalived-程序员宅基地

文章浏览阅读299次。本人使用的环境是CentOS-6.4-x86_64-bin-DVD1.rar,nginx-1.6.2.tar.gz,keepalived-1.2.18.tar.gz。三台机器ip:192.168.1.123,192.168.1.124。同时关闭两台虚拟机的防火墙:chkconfig iptables off(永久关闭防火墙)..._linux搭建nginx+keepalived

WebMagic Java 爬虫的简单应用_webmagic没反应-程序员宅基地

文章浏览阅读2k次。前段时间做旅游本体的知识库,我和老师反应说景点之间关系太少了,导致整个图很稀疏。。“你去wiki上抓一批数据吧”,就这样被自己坑了。由于一直在用java做项目,ZWQ师兄推荐的是selenium,这个我想说真的很强大,还支持JS渲染,不过当我看到这篇的时候,我决定学一下WebMagic。项目中文文档地址:http://webmagic.io/docs/zh/这个项目很容易上手,只要_webmagic没反应