前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >H264和H265的视频编码

H264和H265的视频编码

原创
作者头像
春江花月夜
发布2023-12-24 21:39:11
3.1K1
发布2023-12-24 21:39:11
举报
文章被收录于专栏:君正T31开发实战指南

1.什么是H264,什么是H265?

H264格式:

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帧的算法。

H265格式:

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格式的视频数据的时候,那么我们需要的网络带宽是十分夸张的,所以我们需要对我们的图像数据进行压缩处理,这些压缩处理并不会对本身的图像造成很大的影响,所以我们需要这些压缩协议和算法。

2.H264的视频编码格式

2.1:H264桢结构

在H264视频编码中,视频被分为多个GOP序列。

桢的类型有I桢(关键桢),B桢(双向预测桢),P桢(前向预测桢)

一个GOP由一个I桢,和多个B桢和P桢组成。

一帧又分为多个片(Slice),片的类型也可以分为I片,B片,P片。

一个片又被分为多个宏块,一个宏块由16*16的YUV数据组成。

2.2 桢序列

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桢

代码语言:c
复制
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
};

3.H265视频编码格式

3.1:H265的一个GOP图像序列组成

跟H264区别就是多了VPS桢

VPS+SPS+PPS+SEI+一个I桢+诺干个P桢。

VPS,SPS,PPS,SEI,一个I桢,一个P桢都可以成为一个NALU。

3.2:H265 NALU

H265的NALU头信息是16位,相当于两个字节的大小。

F:禁止位:必须为0,跟H264是一样的。

TYPE类型是6位类型,就证明H265格式的类型最大可以支持64种可能。

LayerID:表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0,以后的扩展可能会用到。

TID:该值减一,时域层标识号,表示该NALU的时域层级。

代码语言:c
复制
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
};

3.2H265的桢解析

和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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.什么是H264,什么是H265?
    • H264格式:
      • H265格式:
        • 那为什么需要这些编码协议?
        • 2.H264的视频编码格式
          • 2.1:H264桢结构
            • 2.2 桢序列
              • 3.1:H265的一个GOP图像序列组成
              • 3.2:H265 NALU
              • 3.2H265的桢解析
          • 3.H265视频编码格式
          相关产品与服务
          音视频通话 SDK
          音视频通话 SDK 是音视频终端 SDK(腾讯云视立方)的子产品之一,基于音视频通话场景定制,提供双人音视频通话、群组音视频通话、中途呼叫第三方、AI 通话降噪、通话卡顿优化等功能,提供含 UI 快速集成方案,仅需三步一天内可集成上线,轻松搭建专属音视频通话应用。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档