RTP打包带B帧的H264

正常情况下,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时间戳是跳跃的,不过解码端能正常处理就行了。

最近的文章

SIP心跳

SIP协议分为普通心跳和会话心跳。 普通心跳由于SIP本身没有定义心跳,因而在实践中一般采用OPTIONS消息作为心跳,OPTIONS原来是用来作为获取对方能力的消息,正好也可以检测对方当前服务状态,比较合适。 正常情况下,UAS收到OPTIONS心跳,什么也不用做,直接回复200即可。 但是这种心 …

技术 继续阅读
更早的文章

配置GITHUB使用SSH操作

Github已经禁用了使用账号密码进行代码提交等操作的鉴权了,因此我们只能使用其他方式,比如SSH方式进行提交。 生成SSH-KEY按照官方指引,在桌面右键通过点击 Git Bash Here 或其他方式打开Bash,在内部执行。 $ ssh-keygen -t ed25519 -C 你的邮箱Gen …

技术 继续阅读