首页 > 编程知识 正文

android音视频同步,Android音视频性能收集

时间:2023-05-03 07:55:17 阅读:109529 作者:2559

人类观察

我好像到了还没有做好任何准备就站着的年纪了。 吃一块糖也不是快乐的年龄。

之前了解了一些H264/AVC的知识。 今天看看H265吧。 理解了这些基础,什么协议(flv等)、什么软件包形式(mp4等)、网络传输等都很有用。

背景知识H265也称为HEVC,并且统称为高清晰度视频编码(hight video coding )。 这和H264一样,是ITU-T和ISO两个组织共同制定的视频压缩标准,是H264/AVC标准的继承者。

H265/HEVC是用于更高分辨率、更高帧频、更高压缩率的视频的协议标准,是标准化团体制定的视频压缩标准。

为什么会有h265,说白了,人们对视频的清晰度越来越高,有限的带宽很难保证视频的质量。 在2k、4k高清视频中,由于存储空间和网络带宽的限制,现有的视频压缩技术已经不能满足现实的APP应用需求。 新一代视频压缩标准H265/HEVC具有更高的压缩效率,可以解决高清晰度和超高清视频的快速增长的数据速率对网络传输和数据存储的影响。

清: 480x800

普通高清: 720x1280 720P

HD:1920x10801080p

2K:2048*1024

超高精细4K:3840x2160

嗯,说白了,是因为需求,然后产生的标准。 好的,让我们从技术上来看:

)1)如果视频的屏幕要求更高(如上所述),视频的流畅度要求更高,帧速率从30fps变为60fps或更高,H264将:

宏块(MB )的个数爆炸性地增加,宏块内容的复杂度上升,运动向量的数值大幅增加)2) H264自身的缺点

由于是宏块级压缩视频的处理过程,因此长时间没有改变,或者以2003年发表的实现方式,未调整压缩算法。

H265继承了H264的许多定义,两者都是基于宏块的视频编码技术,H265基于H264来进行了某种强大的优化。 例如:

用宏块分割图像,最终用块细化。 使用帧内压缩技术减少空间冗馀使用帧间压缩技术减少时间冗馀(运动估计和运动补偿),使用熵编码来压缩残馀数据以减少运动向量传输和信号传输中的最后冗馀。 以上的说明虽然太正式了,但我这里是参考一些书籍来写的。 (如果有遗漏、理解偏差/知识丧失就不好了)上的这些技术都是编码器的内部实现,是算法。 我也只是知道这些概念,怎么实现还很清楚。 我想我还没到这一步。 前几天,看到支付宝系的音视频团队拥有被称为特异点编码器的独特编码器来实现,我觉得很厉害。

H265的码流结构H265的码流结构与H264的结构类似

网络分层结构与H264/AVC结构类似,H265/HEVC也是视频编码层(video code layer,简称VCL )和网络适配层)网络传输层,简称nal.VCL层是视频编码层

与h264的码流结构一样,用开始代码(0x000001或0x00000001 )分割压缩后的数据也分别称为NAL单元(NAL Unit,简称NALU )。 NALU有多种类型,主要区分数据的内容。

类似于h264,针对一个码流文件存在一系列NALU类型定义,并且将码流文件划分为六种类型: VPS、SPS、PPS、SEI、I帧和p帧。 码流的结构如下。

起始代码VPS起始代码SPS起始代码PPS起始代码SEI起始代码I帧起始代码p帧起始代码p帧……以上是图片系列的组成部分。 为什么会这样呢? 一般我们在网络上发送数据。 例如,采集方在发送压缩数据的I帧之前发送VPS、SPS、PPS。 解码方不能先启动再等发送方的数据来吧。 解码器拿到VPS、SPS、PPS后才能对H265的数据进行解码。 VPS、SPS、PPS、SEI、一个I帧和一个p帧都可以对一个NALU进行常委会。

从上面可以看到,h265比h264多了一个VPS。 VPS是一组视频参数。

现在,我们来看看用h265编码器编码的码流文件。 剪切文件开头的数据,

因为h265码流的开头始终是VPS、SPS、PPS,可能包含SEI,后面跟有I帧的p帧数据。

以十六进制格式打开的文件如下:

000000140010 c01 ffff 016000000300//4001 b 00000030000003005 AAC 09000000142/4201010101016000000300 b 00000003000000300000000000 aa 044200 f 044200 f 077e 5a ee 4c 92e a 520 a0c 05 da 14250000000000000144401 c0f 030 f 030/401840 a 000000 a 0000 a 0000000000000000000000000000000000 2601 af 65 bfb 40 b 53823 de 91 CAD 66 f 973 ce 215 d 92922791593 DC 62 CAE 5a df 4c da F9 b 56105

3165 97cd 64cd f04d 09d5 5e10 d231// ...省略其它数据2f04 c9cc 1e01 700a 0000 0001 0201 d08f // 0201// ...省略其它数据 单元NALU的结构

可以看到上面的数据和h264一样,H265的NALU的结构也是:启始码+ NALU头+NALU数据。如果NALU对应的Slice为一帧的开始(即视频流的首个NALU)就用0x00000001,否则就用0x000001。

启始码:是一个固定值4个字节00 00 00 01(十六进制)或者3个字节00 00 01(十六进制)NALU的头大小为2个字节,第1为是0,第2-7位是NALU的类型,表示该NALU的数据内容是什么类型的,是VPS,SPS,PPS,SEI,I帧还是P帧。第8-15位是1NALU的数据就是编码器编出来的图像信息或者图像压缩数据了

NALU的nal_unit_type官方文档所示:

可以上面的文件数据片段中可以计算出6种NALU的头类型nal_unit_type,取2个字节的2-7位即可。计算方法:

// 0x7E的二进制的后8位是 0111 1110 int naluType = (byteOffset & 0x7E) >> 1

byteOffset就是00 00 00 01或者00 00 01后面的2个字节。

VPS(视频参数集)NALU的头值为0x4001(十六进制),取出2-7位(40 & 0x7E)>>1 =32(十进制)SPS(序列参数集)NALU的头值为0x4201(十六进制),取出2-7位(42 & 0x7E)>>1 =33(十进制)PPS(图像参数集)NALU的头值为0x4401(十六进制),取出2-7位(44 & 0x7E)>>1 =34(十进制)SEI(补充增强信息)NALU的头值为0x4e01(十六进制),取出2-7位(4e & 0x7E)>>1 =39(十进制)I帧 NALU的头值为0x2601(十六进制),取出2-7位(26 & 0x7E)>>1 =19(十进制)P帧 NALU的头值为0x0201(十六进制),取出2-7位(02& 0x7E)>>1 =1(十进制)

NALU的类型官方文档所示:

RBSP的结构

H265的 RBSP(raw byte sequence payload)和H264的一样。

NAL根据送压缩数据的规则,可以封装称不同的NALU, NALU包含VPS,SPS,PPSl类型信息,还包含视频片(Slice)的压缩数据,包含压缩的NALU被称为VCLU(VCL NALU),包含其它信息的压缩数据的NALU,则被称为non-VCLU(non-VCL NALU)。

H265下的NALU包含两部分数据结构:NALU头(header)和负载(payload),NALU头长度为固定的2字节,反应NALU的内容特征,而NALU的负载长度为整数字节,包含视频压缩后的原始字节序列负载RBSP(raw byte sequence payload)。RBSP是对视频 编码后的原始比特流片段SODB(string of data bits)进行添加尾部(添加比特1,以凑足整字节)的包装。

同样在H265中,为了避免字节流片段和NALU的启起码及结束码发生冲突,需要对RBSP的字节流进行冲突处理0x3,经过处理后的RBSP才可以直接作为NALU的负载信息,才可以进程磁盘保存和网络传输。
关于冲突和RBSP的结构的结构可以参考之前的h264码流分析文章:
Android音视频【二】 H264码流结构

H265远比此篇介绍的复杂的多,如果哪里不正确,欢迎指正。

H265官方文档:
https://www.itu.int/rec/T-REC-H.265-201911-I/en

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。