jrtplib 发送rtp包时时间戳的处理方法

本文介绍了在使用jrtplib库发送RTP包时如何正确处理时间戳,强调了时间戳单位与帧率的关系,并通过实例解释了设置默认增量和自定义时间戳增量的方法。在处理音视频分包发送时,理解这些概念对于确保数据的正确同步至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jrtplib 发送rtp包时时间戳的处理方法

前言

	今天在处理前同事写的代码的时候发现通过rtp传输的视频播放的时候异常,检查发现是时间戳搞错了,因为这个地方
比较容易混淆,特此记录。

一、rtp时间戳说明

		rtp时间戳单位:rtp时间戳的单位不是时间,是通过采样率转换成的,比如,视频的采样率为90000Hz的话,
	是将1秒的时间分成90000份,所以一份的是1/90000,这个值就是时间戳的单位。
		rtp时间戳单位和帧率的关系:比如,一个视频25帧/秒,因为一秒的采样率为90000,每帧对应的采样率增加为90000/25=3600,
	可以理解为3600份个1/90000,所以下一帧视频的rtp相对上一帧应该增加3600,假如一帧视频分为10个rtp包发送,那么这10包的
	时间戳应该相同,一直到下一帧视频再增加。

二、jrtplib的相关函数说明

	SetDefaultTimestampIncrement(3600):设置默认的增量。
	
	int SendPacket(const void *data,size_t len):设置参数后按设置值发送数据,每次调用,
	下个rtp包相对本次发送的rtp包时间戳增加设置的时间戳增量。
	
	int SendPacket(const void *data,size_t len,
                uint8_t pt,bool mark,uint32_t timestampinc):自定义mark和时间戳增量发送数据,
    每次调用,下个rtp包相对本次发送的rtp包时间戳增加自定义传入的时间戳增量。
    
    为什么设置了默认的增量还要有自定义步长的接口,如前文所说,因为SendPacket每调用一次,jrtplib就会将时间戳增加一次增量值,当音视频要分包发送的时候,并不是每次发送都要增加,所以,在分包发送的时候应该调用自定义时间戳增量的接口,只有在一帧视频首包的时候增加时间戳的值,这一帧后续的分包和首包相同。
    伪代码示例:
//  注意:根据实际测试,设置了时间戳增量后,不是本次发送使用,是下次发送使用!!!!,所以在尾包设置。
int timeStep = 0;
int mark = 0;
if (最后一个分包)
{
	mark = 1;
	timeStep = 90000/nFramRate;
}
else
{
	mark = 0;
	timeStep = 0;
}
m_pRtpSession->SendPacket((char*)m_pSendBuf, len, PS_PAYLOAD_TYPE, mark, timeStep);

如图:

收到的rtp打印信息

总结

学海无涯,如有错误,欢迎交流指正,谢谢
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值