技术标签: Hi3531D调试手记
本部分内容 原文出处:(推荐阅读)H264, H265硬件编解码基础及码流分析。这一口奶得很及时,把个人需要的部分抓过来收藏了。
众所周知,视频数据原始体积是巨大的,以720P 30fps的视频为例,一个像素大约3个字节,如下所得,每秒钟产生87MB,这样计算可得一分钟就将产生5.22GB。
数据量/每秒 = 1280*720*33*3/1024/1024 = 87MB
因此,像这样体积重大的视频是无法在网络中直接传输的,而视频编码技术也就因运而生。
经过很多年的开发迭代,已经有很多大牛实现了视频编码技术,其中最主流的有H.264编码,以及新一代的H.265编码。谷歌也开发了VP8,VP9编码技术。
软编的实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。硬编的性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
对视频执行编码操作后,原始视频数据会被压缩成三种不同类型的视频帧: I帧、P帧、B帧。
PS:I帧的压缩率是 7(跟 JPG 差不多),P帧是 20,B帧可以达到 50。
如下图:我们可以通过第 1、2、3、4、5 块的编码来推测和计算第 6 块的编码,因此就不需要对第 6 块进行编码了,从而压缩了第 6 块,节省了空间。
如下图,可以看到前后两帧的差异其实是很小的,这时候用帧间压缩就很有意义。
有损压缩与无损压缩
DTS和PTS
在我们的印象中,一张图片就是一张图像,视频就是很多张图片的集合.。但是因为我们要做音视频编程,就需要更加深入理解视频的本质。
在编码的码流中图像是个集合的概念,帧、顶场、底场都可以称为图像,一帧通常就是一幅完整的图像。
(1)用于解释编码过的视频序列的整体结构,包括时域子层依赖关系等。HEVC 中加入该结构的主要目的是兼容标准在系统的多子层方面的扩展,处理比如未来的可分级或者多视点视频使用原先的解码器进行解码但是其所需的信息可能会被解码器忽略的问题。
(2)对于给定视频序列的某一个子层,无论其 SPS 相不相同,都共享一个 VPS。其主要包含的信息有:多个子层或操作点共享的语法元素;档次和级别等会话关键信息;其他不属于SPS的操作点特定信息。
(3)编码生成的码流中,第一个 NAL 单元携带的就是 VPS 信息。
(1)一段 HEVC 码流可能包含一个或者多个编码视频序列,每个视频序列由一个随机接入点开始,即 IDR/BLA/CRA。序列参数集SPS包含该视频序列中所有 SLICE 需要的信息。
(2)SPS 的内容大致可以分为几个部分:1、自引 ID;2、解码相关信息,如档次级别、分辨率、子层数等;3、某档次中的功能开关标识及该功能的参数;4、对结构和变换系数编码灵活性的限制信息;5、时域可分级信息;6、VUI。
(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被激活。
参数集机制将一些重要的、改变少的序列参数和图像参数与编码片分离,并在编码片之前传送至解码端,或者通过其他机制传输。
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”,以便字节对齐。
一个原始的 H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成:
举个栗子,下面两幅图分别代表IDR与非IDR帧具体的码流信息:
在一个NALU中,第一个字节(即NALU header)用以表示其包含数据的类型及其他信息。我们假定一个头信息字节为0x67作为例子:
十六进制 | 二进制 |
---|---|
0x67 | 0 11 00111 |
如前表所示,头字节可以被解析成3个部分,其中:
从表中我们可以获知,NALU 类型1-5为视频帧,其余则为非视频帧。在解码过程中,我们只需要取出 NALU 头字节的后5位,即将 NALU 头字节和0x1F进行与计算即可得知 NALU 类型,即:
NALU类型 = NALU头字节 & 0x1F
PS:可以将 start code 理解为不同 NALU 的分隔符,header 是某种类型的 key,payload 是该 key 的 value。
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个部分,其中:
对比 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
文章浏览阅读289次。RF演进protocol 演进_nfc的演进
文章浏览阅读384次。wait 和notify 是实现线程之间的协同工作,必须结合synchronized使用,wait 释放锁,notify 不释放锁(但是此时会通知在等待的wait,该notify完全执行完毕,才真正释放锁)public class DemoThread18{ //原子类 private volatile List<String> list = new ArrayList..._wait 和 notify原理
文章浏览阅读601次。相信大部分 做ui的朋友 都非常痛恨一件事情 就是程序以及css和不同浏览器的兼容问题,我就奇怪了google你不好好的做你的搜索引擎,弄什么浏览器呀,本让现在 作东西考虑各个浏览器兼容 已经够累的,你还真会添乱。本来做你就做也无所谓,还花那么大力气推广,要不说你有钱,有了用户群,写东西就不得不考虑你了,大哥我们这些 闷头写程序的不容易,我们还要养家户口呢,你就别添乱了行不行。 _谷歌浏览器 我是人类
文章浏览阅读551次,点赞18次,收藏9次。前端演示咨询客服:
文章浏览阅读6.4k次,点赞7次,收藏29次。一、MAKO Vimba2.0安装教程1. 打开Vimba2.0安装软件,用户可到大恒官网下载最新驱动。2.选择选项Application Development和安装路径,注意:安装路径中不要存在空格。然后,点击Star,开始安装。 3.勾选Install Vimba Drivers,然后,点击Exit退出。4.接下来继续安装,勾选-选择“安装”,重复操作..._vimba viewer
文章浏览阅读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
文章浏览阅读1.8k次,点赞4次,收藏24次。HOG特征简介HOG 全称为 Histogram of Oriented Gradients ,即方向梯度的直方图。HOG 是由 Navneet Dalal & Bill Triggs 在 CVPR 2005发表的论文中提出来的,目的是为了更好的解决行人检测的问题。先来把这几个字拆开介绍,首先,梯度的概念和计算梯度的方法已经在前一篇文章中介绍了,方向梯度就是说梯度的方向我们也要利用上,..._hog特征识别行人 peopledetector=vision.peopledetector; i=imread(
文章浏览阅读2.8k次,点赞2次,收藏9次。上一篇文章中介绍了如何使用Spring Cloud搭建微服务,在本文中讲讲如何对微服务进行安全保护。在Spring Cloud中对应用进行安全保护通常使用Spring Security,这种方式集成起来非常简单而且很容易扩展现有的应用场景。在分布式环境中Spring Security使用Spring Session和Redis来共享会话。共享会话可以将在微服务网关中登录的用户验证信息传递到系统..._springboot微服务安全
文章浏览阅读961次。通过自学《碱基矿工》[http://mp.weixin.qq.com/mp/homepage?__biz=MzAxOTUxOTM0Nw==&hid=1&sn=d945cf61bd86e85724e146df42af5bcc&scene=18#wechat_redirect]下面分别介绍这两种格式FASTAFASTA常作为存储有顺序的序列数据的文件后缀,包括我们常用的..._.fa.gz
文章浏览阅读1k次。centos安装mysql如果设置的密码太简单了会报错( ERROR 1819 (HY000): Your password does not satisfy the current policy requirements)解决方案如下:登录mysql执行:第一个密码强度等级,第二个是密码长度设置为6位(如果你设置的是8位就不做修改)另外可以通过语句查看密码设置规则2 赋权所有远程ip都可以进行登录(如果未开放端口得需要去腾讯云或者阿里云官网实例防火墙与策略开启端口,mysql默认的_centos 查看 mysql 远程连接
文章浏览阅读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
文章浏览阅读2k次。前段时间做旅游本体的知识库,我和老师反应说景点之间关系太少了,导致整个图很稀疏。。“你去wiki上抓一批数据吧”,就这样被自己坑了。由于一直在用java做项目,ZWQ师兄推荐的是selenium,这个我想说真的很强大,还支持JS渲染,不过当我看到这篇的时候,我决定学一下WebMagic。项目中文文档地址:http://webmagic.io/docs/zh/这个项目很容易上手,只要_webmagic没反应