H264 over RTP 的解包

2024-05-08 11:58
文章标签 rtp 解包 h264

本文主要是介绍H264 over RTP 的解包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前一版博文《H264 over RTP 的打包》已经详细介绍了发送端如何将H264视频帧打包到RTP进行传输,现在我们书接上文,介绍接收端收到RTP包后如何解包组装还原出来H264帧。从前文我们知道发送端发送一帧H264数据时会遍历H264帧逐个将NALU打包成RTP包(当然NALU大于MTU时会进行分片),每一帧数据对应的RTP包的时间戳都是相同的,最后一个RTP包的marked位为TRUE;因此接收到只需要将接收到的RTP包组装成NALU,然后将NALU连接起来就可以还原H264帧了,由于网络传输可能会丢包和乱序,所以接收端还要有RTP接收缓存,用于RTP包排序(根据RTP头的SN进行排序)。

一帧H264打包为RTP包的示意图,一帧H264的所有RTP包时间戳相同,SN连续

 

一个H264帧由一些列NALU构成,每个NALU又被拆解(依据传输层的MTU去拆解)为若干个数据段,这些数据段打上一个头后(这个头部有NALU分段的标识,start_bit和end_bit表示起始数据段和结束数据段),再封装成rtp包去发送。传输同一个H264帧的rtp包都具有相同的时间戳。

rtp_j1为第j个NALU的起始数据段,其分段标识有start_bit=1;

rtp_jk为第j个NALU的结束数据段,其分段标识有end_bit=1;

在起始数据段和结束数据段之间的其它数据段由rtp的SN标识其先后顺序;

接收端可以根据收到rtp包的SN的连续性、以及start_bit和end_bit标志位来组成一个完整的NALU,以及判断一个NALU是否有丢包。

  • 接收Buffer设计

接收端采用双缓存机制,一个RTP缓存,用于RTP包的排序,一个帧缓存,用于存放组装出来的H264帧,解码和播放线程从帧缓存取数据。

RTP接收缓存的设计如下图所示,

RTP接收BUFFER,每个时间戳ti节点链表对应一个H264帧

缓存设计为二维的结构,横向是按照RTP包的时间排序,纵向按照rtp的SN排序,由于一个H264帧在发送端发送时其承载的所有rtp包都具有相同的时间戳,不同的H264帧其传输的rtp时间戳不一样,所以上图中某个时间节点下的所有rtp包属于同一个H264帧。

比如时间节点ti ,那么其对应的所有rtp包rtp_i1、rtp_i2、…、rtp_ik都是属于H264帧Frame_i的;其中,i=1、2、…、n,   k=1、2、…。

RTP的接收缓存大小为RTP_BUFFER_SIZE帧,如果接收buffer已满时收到新帧的RTP包,则对头节点出队列,强制将这个不完整的节点数据组成H264帧或者丢弃,这可取决于用户的配置。

帧缓存就是一个简单的链表,如下所示,

帧缓存里存放的是一个个完整的H264帧,播放线程会按照媒体协商的帧率(比如25帧/秒)的速率进行播放。

帧缓存的大小为FRAME_BUFFER_SIZE,如果接收到新帧时缓存已经满了,则从队头开始寻找一个P丢弃,然后把新帧插入对尾。

另外可以设计一个初始播放因子α,呼叫接通后,等帧缓存达到一定帧数后再开始播放,这样可以起到抗抖动的作用;α的取值为[0-1.0],当帧缓存的帧数达到α*FRAME_BUFFER_SIZE再开始播放。

 

这篇关于H264 over RTP 的解包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970252

相关文章

android打包解包boot.img,system.img

原帖地址:http://www.52pojie.cn/thread-488025-1-1.html 转载Mark一下,日后研究 最近工作需要对boot.img,system.img进行破解。顺便将心得分享一下。 我的工作环境是在linux下的。所以工具都是针对linux的。 boot.img破解相关工具: 1、split_boot    perl脚本 2、boot_i

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码(压缩)视频数据?✨如何编码(压缩)数据🎄简单的例子🎄音视频编码方式🎄视频编码格式H264编码是什么?发展历程?H.264基本单元H.264的I帧,P帧,B帧 🎄音频编码格式 ✨视频文件封装格式✨解封装格式✨视频解码✨H264分层结构🎄网络上传输H264视频数据的流程VCL的结构关系 🎄NAL单元 ✨ 参考文章 ✨播放一个视频的流

【Android 多媒体应用】使用MediaCodec将摄像头采集的视频编码为h264

转载自:http://www.cnblogs.com/CoderTian/p/6224605.html MainActivity.java import android.app.Activity;import android.graphics.ImageFormat;import android.hardware.Camera;import android.hardware.Camera

H264的句法和语义(二)

1.2 句法元素的分层结构 1.2.1 句法元素与变量 编码器将数据编码为句法元素然后依次发送。在解码器端,通常要将句法元素作求值计算,得出一些中间数据,这些中间数据就是H.264定义的变量。 图1 从句法元素解出变量 pic_width_in_mbs_minus1 是解码器直接从码流中提取的句法元素,这个句法元素表征图像的宽度以宏块为单位。我们看到,为了

H264视频压缩编码标准(四)

4.变换与量化 4.1树状结构运动补偿  –每个宏块(16×16像素)可以4种方式分割:一个16×16,两个16×8,两个8×16,四个8×8。其运动补偿也相应有四种。而8×8分割还可以有四种方式的分割:一个8×8,两个4×8或两个8×4及4个4×4。这种分割下的运动补偿则称为树状结构运动补偿。

ffmpeg h264解码, 屏蔽因为网络丢包等各种原因导致的花屏帧

ffmpeg h264解码, 屏蔽因为网络丢包等各种原因导致的花屏帧  ---->看来问题只能这样解决了,现在还要多测测,防止产生新的问题。目前来看,对现有代码没有影响,花屏的帧直接屏蔽掉了。 思路: 问了下机顶盒方面h264解码的,他们用的是硬件解码,他们做到不花屏的方法就是简单的设置了一个硬件解码提供的接口:设置了错误处理模式。 我想这个错误处理模式肯定对那些错误的帧直接屏

在安卓和Windows下使用Vizario H264 RTSP

Unity2021.3.35f1,运行模式为ENGINE_SERVER 1.环境设置  Windows设置  安卓设置 2.代码修改 ConnectionProperties中的server必须与真实IP一样,所以需要新增一个获取IP的函数 public string GetLocalIPAddress(){IPHostEntry host;string localIP = "

cefsharp128_cef128_chromium6613_x64_h264版本抢险体验

一、本博测试版本cef128及兼容性测试 1.1 版本 128.0.6613.x (全网保持最新更新测试体验) 感谢您:关注我,关注栏目,总有您想要的资源,推荐好友有优惠 1.2 兼容性测试,支持h264 1.3 视频播放测试 版本兼容 cef128.xx.xx <

H264结构及RTP封装

H264是一种针对视频的压缩编码方式。 一、压缩方法         H264主要基于以下几种方法,将数据进行压缩: 1.帧内预测压缩:解决空间域数据冗余的问题 2.帧间预测压缩:(运动估计与补偿)解决时间域数据冗余的问题 3.整数离散余弦变换(DCT):将空间上的相关性转换为频域上的无关性,然后量化 二、压缩后数据         压缩后,H264文件由I帧、B帧、

【网络基础】探讨以太网:封装解包、MTU、MAC地址与碰撞

文章目录 1. 概念2. 帧格式3. 如何解包和封装4. 整体网络思想 谈 跨网络通信5. 碰撞问题① 汇总整体的网络通信过程,发现问题并补充细节 6. 认识MAC地址7. 对比理解MAC地址与IP地址8. 认识MTU① MTU对UDP协议的影响② MTU对TCP协议的影响③ MSS 与 MTU的关系④ 命令 查看硬件地址MAC与MTU⑤ MTU 与 分片 1. 概念 “以太网