正常情况下,RTP传输的H264是BP规格的,也就是只有I/P帧的视频内容。是否可以传输高规格视频呢,答案是肯定的。
H264视频规格分析
H.264有四种画质级别,分别是BP、EP、MP、HP:
Baseline Profile
基本画质。支持I/P帧,只支持无交错和CAVLC。Extended profile
进阶画质。支持I/P/B/SP/SI帧,只支持无交错和CAVLC。Main profile
主流画质。提供I/P/B帧,支持无交错和交错,也支持CAVLC和CABAC的支持。High profile
高级画质。在Main的基础上增加了8x8内部预测、自定义量化、无损视频编码和更多的YUV格式。
总的来说,平常使用的 Baseline
规格和其他的最大区别就是没有双向预测帧。
B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别。
在没有B帧存在的情况下,视频帧按时间顺序进行编码和解码,但是在B帧存在的情况下,导致即使收到了P帧也不能解码出来。更复杂点的等可以解码出来的时候,显示的时间还得再确定。从技术上讲就是PTS和DTS不一致,DTS、PTS 的概念如下所述:
- DTS(Decoding Time Stamp):即解码时间戳,意义在于告诉播放器该在什么时候解码这一帧的数据。
- PTS(Presentation Time Stamp):即显示时间戳,用来告诉播放器该在什么时候显示这一帧的数据。
这就在某些场景下对传输造成了困难,比如RTP。
如何RTP打包传输
RTP的包格式确实是有时间戳,但是上述内容我们知道在没有B帧存在的情况下,PTS和DTS是一致的。但是在有B帧存在的情况下,二者不同的时候,又该使用哪一个呢。
这块参考 https://www.rfc-editor.org/rfc/rfc6184.txt 等文档没有太明显的说明。
这个时候可以通过FFMPEG推一个视频来观察一下,过程就不讲了,直接讲结论。
在RTP传输时候,时间戳设置PTS时间戳,但是RTP包按DTS顺序排列。这样造成的结果就是看到的RTP时间戳是跳跃的,不过解码端能正常处理就行了。