【音视频】H.264

封装格式

H.264的两种打包/封装方法:字节流AnnexB格式 AVCC格式
放用于网络发送时,要封装成RTP格式

1. AnnexB格式(实时播放)

开始前缀(00000001000001)+NALU数据,绝大部分编码器的默认输出格式

    1. 3字节0x000001  单帧多slice(即单帧多个NALU)之间间隔
  1. 4字节0x00000001 帧之间,或者SPS等之前

2. AVCC(存储)

解码器配置参数在一开始就配置好了,系统可以很容易的识别NALU的边界,不需要额外的起始码,减少了资源的浪费,同时可以在播放时调到视频的中间位置。这种格式通常被用于可以被随机访问的多媒体数据,如存储在硬盘的文件。MP4、MKV通常用AVCC格式来存储。

AVCC格式不使用起始码作为NALU的分界,这种格式在每个NALU前都加上一个大端格式的前缀(1、2、4字节,代表NALU长度)

防字节竞争处理(Annxb和AVCC均有):RBSP👉EBSP

>用起始码定位NALU边界存在一个问题,即NALU中可能存在与起始码相同的数据。
>为了防止这个问题,在构建NALU时,需要在数据中的0x000000,0x000001,0x000002,0x000003中插入防竞争字节(Emulation Prevention Bytes)0x03,使其变为:
0x000000 = 0x0000 03 00
0x000001 = 0x0000 03 01
0x000002 = 0x0000 03 02
0x000003 = 0x0000 03 03
解码器在检测到0x000003时,将0x03抛弃,恢复原始数据。

3.RTP封装=12字节固定RTP包头 + 载荷(NALU)

rtp传输的是annexb的h264码流

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           timestamp                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           synchronization source (SSRC) identifier            |
   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
   |            contributing source (CSRC) identifiers             |
   |                             ....                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

V:    RTP协议的版本号,当前协议版本号为2。
P:    填充标志,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:    扩展标志,如果X=1,则在RTP报头后跟有一个扩展报头
CC:    CSRC计数器,指示CSRC 标识符的个数。

M:    标记位(不同载荷含义不同,视频标记一帧的最后一个分片slice则=1,其他=0)
PT:    载荷类型RTP_PAYLOAD_RTSP 如GSM音频、JPEM图像等。例如H264=96
序列号: 用于标识发送者所发送的 RTP 报文的序列号,每发送一个报文,序号增加 1

时间戳:    时间戳反映了该 RTP 报文的第一个八位组的采样时刻。 接受者使用时间戳来计算延迟和抖动, 并进行同步控制。

SSRC:同步信源标识符 区分是在和谁通信。值随机选择,参加同一视频会议的两个同步信源的SSRC要相同。
//特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。

档次(Profile)

为了适应不同的应用场景,H.264还定义了多种不同的档次。

  • 基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域。支持I条带和P条带,熵编码支持CAVLC算法。
  • 主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等。支持视频场编码、B条带双向预测和加权预测,熵编码支持CAVLC算法和CABAC算法。
  • 扩展档次(Extended Profile):主要用于网络视频直播与点播等。支持基准档次的所有特性,并支持SI条带和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但熵编码不支持CABAC算法和场编码
  • 高档次(High Profile):适用于高压缩率和性能场景;支持Main Profile的所有特性,以及8像素×8像素的帧内预测、自定义量化、无损压缩格式和YUV采样格式等。

比如H264BSD这个库,它只能解码基准档次的H264流。

举个RTSP协议的例子,在RTSP的DESCRIBE响应请求:

RTSP/1.0 200 OK
CSeq: 0
Content-Type: application/sdp
Content-Base: rtsp://myserver/live.mp4
Date: Wed, 16 Jul 2008 12:48:47 GMT
Content-Length: 847
v=0//以下都是SDP信息
o=- 1216212527554872 1216212527554872 IN IP4 myserver
s=Media Presentation
e=NONE
c=IN IP4 0.0.0.0
b=AS:50064
t=0 0
a=control:rtsp://myserver/live.mp4
&resolution=640x480
a=range:npt=0.000000-
m=video 0 RTP/AVP 96 //m表示媒体描述, 下面是对会话中视频通道的媒体描述
b=AS:50000
a=framerate:30.0
a=control:rtsp://myserver/live.mp4?trackID=1//trackID=1表示视频流用的是通道1
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeKQFAe2AtwEBAaQeJEV,aM48gA==
m=audio 0 RTP/AVP 97//m表示媒体描述, 下面是对会话中音频通道的媒体描述
b=AS:64
a=control:rtsp://myserver/live.mp4?trackID=2//trackID=2表示视频流用的是通道2
a=rtpmap:97 mpeg4-generic/16000/1
a=fmtp:97 profile-level-id=15; mode=AAC-hbr;config=1408; SizeLength=13; IndexLength=3;IndexDeltaLength=3; Profile=1; bitrate=64000;

profile-level-id=420029;,可以得出

  • profile_idc 0x42 == 66 (Baseline profile)
  • profile-iop 0X00
  • level-idc 0X29 == 41 (Level 4.1)

H.264的Profile和Level有哪些?

这个就不赘述了,在以下2个链接有详尽的列表:
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...

可以參考這個

参考文章


solfKwolf的前端杂记
涉及个人学习心得与经验

前端开发,略懂后台;

736 声望
11 粉丝
0 条评论
推荐阅读
【typescript】mixins
就像许多面向对象的编程语言一样,TypeScript 也有类。类是创建对象的蓝图——它们基本上用于封装对象中的数据。TypeScript 类可以这样定义:

看见了阅读 140

出海无从下手?看社交泛娱乐出海「第一趁手工具」怎么说
经过近几年的发展,如今的互联网出海已经是截然不同的命题。开头引导语:移步【融云全球互联网通信云】回复“地图”限量免费领《社交泛娱乐出海作战地图》

融云RongCloud阅读 706

音视频通讯QoS技术及其演进
QoS(Quality of Service)是服务质量的缩写,指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制,是用来解决网络延迟和阻塞等问题的一种技术,包括流分类、流量监管、...

阿里云视频云阅读 508

封面图
“易+”开源 | 基于 ijkplayer 的 LLS-Player 移动端应用实践
云信低延时直播(Low-Latency Streaming,LLS)是在网易云信标准直播的基础上,依托自研的全球实时传输网 WE-CAN 推出的低延时直播产品方案。在保障低延时的同时,具有极致秒开,低卡顿的特性。同时兼容标准直播...

网易智企阅读 417

封面图
保姆级教程!集成声网 SDK 实现 iOS 平台音视频通话和虚拟背景功能
如果你想实现 iOS 平台的音视频通话,想在音视频通话中添加虚拟背景,那这篇文章完全可以借鉴。使用 swift 语言,集成声网 SDK 实现音视频通话,并调用 enableVirtualBackground 接口添加虚拟背景,小伙伴们赶快...

声网阅读 406

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享
前言大家好,我是 @小曾同学,小伙伴们也可以叫我小曾~如果你想实现一对一音视频通话和屏幕共享功能,不妨来看看这篇文章,保姆级教程,不需要从零实现,直接集成声网 SDK 即可轻松上手。本文也分享了我在实践过...

声网阅读 365

网易云信 RTC 音频问题排查的挑战与实践
实时通信(Real-Time Communication,RTC)音频技术是指将音频流实时传输到远程用户的技术,满足线上实时交互的诉求,广泛应用于在线教育、视频会议、直播、泛娱乐社交、金融、医疗、政企等场景。在 RTC PaaS 厂...

网易智企阅读 340

封面图

前端开发,略懂后台;

736 声望
11 粉丝
宣传栏