spydroid源码分析(三):rtp包头分析以及代码实现

             网上有很多的rtp协议介绍的文章,我也老生常谈的拿来使用了,

        先介绍rtp包头,我们都知道,rtp包头占12个字节,1个字节byte当然是8个bit了,下面是详细介绍。看下面的这张图

V:版本号;        Version(2),占2个bit,数值为2,二进制表示10

P:填充字段标识; Padding(0),占1个 bit,数值为0,二进制表示0

X:扩展头标识;      Extension(0),占1个bit ,数值为0,二进制表示0

CSRC count(CC):贡献源数目,和后面的CSRC有关。CSRC,贡献源,指的是不同步的源。在网络中,可能会有混合器将来自不同地点的RTP流混合成一个RTP流以节省带宽, CSRC用来区分不同的源;  Source Identifier(0),占4个bit,数值为0,二进制表示为0000

java代码表示,buffer[0]当然是指的是rtp包的第0个字节

buffer[0] = (byte) Integer.parseInt("10000000",2);

 

M:标记一些重要的事件(由应用程序定义);  占1个bit

PT:净荷数据类型; Payload Type,占7个bit

java代码表示,buffer[1]表示rtp包的第1个字节
buffer[1] = (byte) 96;

这里的96的数值是你自己规定的,在上一篇文章可以看到我们建立rtsp连接的时候,describe描述需要传输Payload Type,这里的数值需要和那个值相同,上文可以看到我用的96. 如果你不使用rtsp协议,直接通过udp的方式发送到对方VLC,你需要在sdp文件指定其数值为96、

 

SN:序列号,每个分组的序列号(初始值随机),用来检测分组的丢失并恢复分组的序列;

在rtp包中占第2,3这2个字节。

java代码表示,

private void updateSequence() {
		setLong(++seq, 2, 4);
	}

private void setLong(long n, int begin, int end) {
		for (end--; end >= begin; end--) {
			buffer[end] = (byte) (n % 256);
			n >>= 8;
		}
	}	


 随着传递一个packet,sequence的数值加1.

 

TS:时间戳,反映RTP净荷中的第一个采样数据的采样时间。时间的粒度是净荷类型相关的。

在rtp包中,占4,5,6,7这4个字节。

java代码如下

public void updateTimestamp(long timestamp) {
		setLong(timestamp, 4, 8);
	}
	
		
	private void setLong(long n, int begin, int end) {
		for (end--; end >= begin; end--) {
			buffer[end] = (byte) (n % 256);
			n >>= 8;
		}
	}	


 timestimp在spydroid源代码中是通过请求传输每个包的平均值,然后经过一定的计算得到的。

 

SSRC:同步源标识符,用于标识同步源。同步源指的是,例如,一段影片的音频和视频通过不同的RTP流传输,它们是同步的。每个同步源是负责发送RTP分组并在RTP中设置序列号和时间戳的实体。

在rtp包中,占8,9,10,11这4个字节。

java代码如下

	setLong((ssrc=(new Random()).nextInt()),8,12);

public void setSSRC(int ssrc) {
		this.ssrc = ssrc; 
		setLong(ssrc,8,12);
	}
	
	public int getSSRC() {
		return ssrc;
	}

private void setLong(long n, int begin, int end) {
		for (end--; end >= begin; end--) {
			buffer[end] = (byte) (n % 256);
			n >>= 8;
		}
	}	

 在上面的代码中,ssrc是产生的随机数,这个数值在建立rtsp连接的时候,SETUP这个步骤上需要用到 Integer.toHexString(ssrc);的数值,这个数值的的16进制是我们需要传递给VLC客户端的 ,你可以测试一下。如果不一致,那么发送到VLC客户端就无法正常播放

 

 

 

这不,rtp包头前12个字节就是这样,下面就是NALU的内容了

 

未完待续 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值