H264 视频流rtp打包之我理解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zjf535214685/article/details/68952983

H264视频流一般关键帧都会有 00 00 00 01 sps + 00 00 00 01 pps,
sps:是以 67 开头的数据 一般是 [00 00 00 01 67 42 A0 1E 23 56 0E 2F … ]

pps:是以68开头的 一般是【00 00 00 01 68 CE 3C 80】

若是一帧数据的长度小于MTU,则可以一包就发送完,直接在数据前面加12字节的RTP头就可以了

FA-U分片打包:
NALU头由一个字节组成,它的语法如下:

  +---------------+
  |0|1|2|3|4|5|6|7|
  +-+-+-+-+-+-+-+-+
  |F|NRI|  Type   |
  +---------------+

F: 1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2个比特.
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放.

Type: 5个比特.
nal_unit_type. 这个NALU单元的类型.简述如下:

0 没有定义
1-23 NAL单元 单个 NAL 单元包
24 STAP-A 单一时间的组合包
25 STAP-B 单一时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分片的单元
29 FU-B 分片的单元
30-31 没有定义

h264仅用1-23,24以后的用在RTP H264负载类型头中

FA-U分片时,每一包的RTP头后面都需要有两个字节的 FA-U头,FA-U头的构造:

每一帧视频数据都会有一个 NALU 头,00 00 00 01 65这个是关键帧的NALU头 非关键帧的头为 00 00 00 01 61

NALU头的前三个位加上fa-u的type 也就是0x1c(28)的后五位组成第一个字节
|0|1|2|3|4|5|6|7|
|F|NRI| type |
0x65 二进制:01100101 0x1c二进制: 00011100
01100101 取高三位
00011100 取低五位
高三位低五位组成:01111100 (0x7c)

第二个字节构成:
|0|1|2|3|4|5|6|7|
|S|E|R| type |
高三位为此包的描述,低五位为nalu头的低五位
S:第一包
E:最后一包
R:默认0
type:这里的type 就是nalu头的后五位

这个组一个第一包的FA-U头的第二字节:
S = 1 ,E = 0,R=0,
高三位二进制:1 0 0 0 0 0 0 0
低五位二进制:0 0 0 0 0 1 0 1(0x65 二进制:01100101)
组成:10000101 (0x85)
这样就构成了FA-U的头了,解包时只需要反过来取第一字节高三位,第二字节低五位就能组成0x65了

展开阅读全文

RTP传输H264视频流,VLC解码失败!!

01-21

Hello:rn第一步:内容简介rn 只使用RTP协议,不使用RTCP,读取H264的视频文件,提取NALU单元,打包成RTP发送,在VLC端接收播放。rn rn NALU单元打包成RTP是参考RFC3984规范,只是用了单NALU和分片两种方式,聚合方式未使用rn NALU的提取已经测试过正确,RTP的打包发送也正常,在wireshark抓包分析正常rnrn 注:发送的是编码后的ES流(即尚未添加PES头等信息的裸流)rn第二步:问题描述:rn 提出的疑问:rn 1.RTP 传输 H264的码流是ES流吗,还是要经过PES打包的PES流,或者进一步打包的PS流rn 2.RTP参考RFC3984规范分片传输时,第一个包的的NALU头需要吗?rn 遇到的现象:VLC接收没问题,但是不能解码,显示信息如下:rn main debug: Buffering 0%rnmain debug: Buffering 3%rnmain debug: Buffering 6%rnpacketizer_h264 debug: found NAL_SPS (sps_id=0)rnpacketizer_h264 debug: found NAL_PPS (pps_id=0 sps_id=0)rnmain debug: Buffering 9%rnmain debug: Buffering 13%rnmain debug: Buffering 16%rnmain debug: Buffering 19%rnmain debug: Buffering 23%rnmain debug: Buffering 26%rnmain debug: Buffering 29%rnmain debug: Buffering 33%rnmain debug: Buffering 36%rnmain debug: Buffering 39%rnmain debug: Buffering 43%rnmain debug: Buffering 46%rnmain debug: Buffering 49%rnmain debug: Buffering 53%rnmain debug: Buffering 56%rnmain debug: Buffering 59%rnmain debug: Buffering 63%rnmain debug: Buffering 66%rnmain debug: Buffering 69%rnmain debug: Buffering 73%rnmain debug: Buffering 76%rnmain debug: Buffering 79%rnmain debug: Buffering 83%rnmain debug: Buffering 86%rnmain debug: Buffering 89%rnmain debug: Buffering 93%rnmain debug: Buffering 96%rnmain debug: Buffering 99%rnmain debug: Stream buffering done (1033 ms in 33 ms)rnmain debug: Decoder buffering done in 24 msrnmain error: ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)rnmain error: ES_OUT_RESET_PCR calledrnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnmain debug: Buffering 0%rnlive555 warning: no data received in 10s, eof ?rnmain debug: EOF reachedrnmain debug: Stream buffering done (0 ms in 8738 ms)rnmain debug: Decoder buffering done in 0 msrnmain debug: removing module "avcodec"rnmain debug: finished inputrnavcodec debug: ffmpeg codec (H264 - MPEG-4 AVC (part 10)) stoppedrnmain debug: killing decoder fourcc `h264', 0 PES in FIFOrnmain debug: removing module "packetizer_h264"rnmain debug: removing module "live555"rnmain debug: removing module "filesystem"rnmain debug: Program doesn't contain anymore ESrnmain debug: dead inputrnmain debug: changing item without a request (current 0/1)rnmain debug: nothing to playrnrnSDP文件如下:rn m=video 10000 RTP/AVP 97rna=rtpmap:97 H264/90000rna=fmtp:97 packetization-mode=1rna=framerate:10rnc=IN IP4 192.168.9.187rnrn第三步:求解rn 1.目前不知道为什么无法出现图像,在百度上也搜了很多,有提到过改变帧率,我这里试了没什么用。有兴趣的可以一起探讨下rnrn第四步:共同探讨rn1.ORTP库是一个开源的C编写的RTP协议的库,使用了下如果调用用例里面的接口来发送数据,那么无法实现分片发送(忽略mark标记的话可以勉强实现)rn2.有跟多的ORTP使用的方面知识非常欢迎大家踊跃贡献rn3.目前最想知道的是RTP 发送H264流到时是要ES还是PES,或者PS,这个迫切想知道rn 论坛

没有更多推荐了,返回首页