H.264是一种高度压缩数字视频编解码器标准,由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组建的联合视频组(JVT,Joint Video Team)共同制定,由此H.264既是ITU-T的H.264标准,又是ISO/IEC的MPEG-4标准的第10部分:高级视频编码(AVC,Advanced Video Coding),因而H.264别名为AVC、MPEG-4 Part 10以及ISO/IEC 14496-10,H.264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
H.265又名为高效率视讯编码(High Efficiency Video Coding, HEVC)编码格式,是现行H.264标准于2003年实现标准化以来时隔10年推出的新标准,将成为支撑未来十年的影像服务和产品的视频压缩技术。其特点是,支持1080p以上的4K×2K和8K×4K分辨率,将视频压缩率提高至H.264的约2倍。也就是说,能以原来一半的编码速度发送相同画质的视频。例如,按照20Mbit/秒发送的H.264格式视频内容,在相同画质的条件下用HEVC格式只需10Mbit/秒的速度。
由于这段时间要移植live555到我这块开发版上面,所以有些音视频的概念需要重新的理解清楚。
原始的视频格式是YUV和RGB格式,这是Sensor从视频当中获取的模拟信号。
这是因为如果我们在网络上面传输H264或者H265格式的视频数据的时候,那么我们需要的网络带宽是十分夸张的,所以我们需要对我们的图像数据进行压缩处理,这些压缩处理并不会对本身的图像造成很大的影响,所以我们需要这些压缩协议和算法。
在H264视频编码中,视频被分为多个GOP序列。
桢的类型有I桢(关键桢),B桢(双向预测桢),P桢(前向预测桢)
一个GOP由一个I桢,和多个B桢和P桢组成。
一帧又分为多个片(Slice),片的类型也可以分为I片,B片,P片。
一个片又被分为多个宏块,一个宏块由16*16的YUV数据组成。
H264 输出数据都封装为一个个NAL单元。进行传输。
每个NALU都有起始码 00 00 00 01
NALU的类型常见有以下几种:
SPS,SEI,PPS,I桢,B桢,P桢以及图像分界符号。
NALU结构体是一个字节的大小。BYTE
其中禁止位我们一般都是写0进去的。然后重要性标志,一般大于等于1就可以了,所以我上面在某个芯片录制出来的H264格式的编码图像数据就是25代表的是I桢。
0010 0101有些I桢是65,也就是,重要性标志他设置为0110 0101
其中需要我们主要的几个NALU类型是:
1:指的是P桢。
5:指的是I桢
6:SEI桢
7:SPS桢
8:PPS桢
char const* nal_unit_type_description_h264[32] = {
"Unspecified", //0
"Coded slice of a non-IDR picture", //1
"Coded slice data partition A", //2
"Coded slice data partition B", //3
"Coded slice data partition C", //4
"Coded slice of an IDR picture", //5
"Supplemental enhancement information (SEI)", //6
"Sequence parameter set", //7
"Picture parameter set", //8
"Access unit delimiter", //9
"End of sequence", //10
"End of stream", //11
"Filler data", //12
"Sequence parameter set extension", //13
"Prefix NAL unit", //14
"Subset sequence parameter set", //15
"Reserved", //16
"Reserved", //17
"Reserved", //18
"Coded slice of an auxiliary coded picture without partitioning", //19
"Coded slice extension", //20
"Reserved", //21
"Reserved", //22
"Reserved", //23
"Unspecified", //24
"Unspecified", //25
"Unspecified", //26
"Unspecified", //27
"Unspecified", //28
"Unspecified", //29
"Unspecified", //30
"Unspecified" //31
};
跟H264区别就是多了VPS桢
VPS+SPS+PPS+SEI+一个I桢+诺干个P桢。
VPS,SPS,PPS,SEI,一个I桢,一个P桢都可以成为一个NALU。
H265的NALU头信息是16位,相当于两个字节的大小。
F:禁止位:必须为0,跟H264是一样的。
TYPE类型是6位类型,就证明H265格式的类型最大可以支持64种可能。
LayerID:表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。
TID:该值减一,时域层标识号,表示该NALU的时域层级。
char const* nal_unit_type_description_h265[64] = {
"Coded slice segment of a non-TSA, non-STSA trailing picture", //0
"Coded slice segment of a non-TSA, non-STSA trailing picture", //1
"Coded slice segment of a TSA picture", //2
"Coded slice segment of a TSA picture", //3
"Coded slice segment of a STSA picture", //4
"Coded slice segment of a STSA picture", //5
"Coded slice segment of a RADL picture", //6
"Coded slice segment of a RADL picture", //7
"Coded slice segment of a RASL picture", //8
"Coded slice segment of a RASL picture", //9
"Reserved", //10
"Reserved", //11
"Reserved", //12
"Reserved", //13
"Reserved", //14
"Reserved", //15
"Coded slice segment of a BLA picture", //16
"Coded slice segment of a BLA picture", //17
"Coded slice segment of a BLA picture", //18
"Coded slice segment of an IDR picture", //19
"Coded slice segment of an IDR picture", //20
"Coded slice segment of a CRA picture", //21
"Reserved", //22
"Reserved", //23
"Reserved", //24
"Reserved", //25
"Reserved", //26
"Reserved", //27
"Reserved", //28
"Reserved", //29
"Reserved", //30
"Reserved", //31
"Video parameter set", //32
"Sequence parameter set", //33
"Picture parameter set", //34
"Access unit delimiter", //35
"End of sequence", //36
"End of bitstream", //37
"Filler data", //38
"Supplemental enhancement information (SEI)", //39
"Supplemental enhancement information (SEI)", //40
"Reserved", //41
"Reserved", //42
"Reserved", //43
"Reserved", //44
"Reserved", //45
"Reserved", //46
"Reserved", //47
"Unspecified", //48
"Unspecified", //49
"Unspecified", //50
"Unspecified", //51
"Unspecified", //52
"Unspecified", //53
"Unspecified", //54
"Unspecified", //55
"Unspecified", //56
"Unspecified", //57
"Unspecified", //58
"Unspecified", //59
"Unspecified", //60
"Unspecified", //61
"Unspecified", //62
"Unspecified", //63
};
和H.264的&0x1F不同,H.265是 :
int type = (code & 0x7E)>>1;
根据H265的NALU类型定义分析:
(1)控制数据流:
00 00 00 01 40 01 的nuh_unit_type的值为 32, 语义为视频参数集 VPS
00 00 00 01 42 01 的nuh_unit_type的值为 33, 语义为序列参数集 SPS
00 00 00 01 44 01 的nuh_unit_type的值为 34, 语义为图像参数集 PPS
00 00 00 01 4E 01 的nuh_unit_type的值为 39, 语义为补充增强信息 SEI
I帧:NALU头值为0x26 01(十六进制),NALU头type位值为19(十进制)。
P帧:NALU头值为0x02 01(十六进制),NALU头type位值为1(十进制)。
理解清楚这些地方之后,我们就可以解决RTSP传输H264和H265的方式了,接下来我们将会移植开源软件live555进行开发。
实现的内容是我们的设备可以通过VLC通过RTSP协议进行访问H264和H265的视频流,此视频流是由我们开发版产生的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。