如果你也在Android端做RTP发送数据的话,通过网上查找资料,相信你不难发现,在使用RTP/RTCP协议发送数据是有现成的库进行调用的,Jlibrtp这个库就是Java实现的,但是这个库是没有说明文档的,比较抠脚,而且百度谷歌找到例子又很少,基本上都没什么卵用;一般搜到都是Jrtplib库,这是C实现库,对我们没多大用,除非你愿意先研究这个库的RTP实现,在用JNI调用,明显更蛋疼。这个没文档就只能自己瞎倒腾一下,还好勉强倒腾出来了。
首先,你必须下一个Jlibrtp库:https://download.csdn.net/download/jwq1220/10355482 里面包含Jlibrtp的实现和java调用的Demo。
下完后,新建一个Android工程,将Jlibrtp-0.2.2中的jlibrtp文件夹中的所有.java文件导入工程,全丢到一个新建的jlibrtp包里面,准备工作算是完成,在需要地方直接import这个包,就可以使用了。
demo中标已经将源码打包成jar形式可以直接使用,也可以通过上面链接下载最新的C库和java库。C库中包含demo亲测在linux上面机器间通讯正常
简单整理一下Jlibrtp实现RTP的过程:
1、首先建立收发端的会话,调用Jlibrtp库的实时传输会话类RTPSession,该类可以创建一个RTP会话,并设置传输的RTP端口和RTCP端口,以及与RTP包的相关的时间戳数据等。
2、然后通过RTPSessionRegister方法用于添加RTP会话的参与者,同时开启接收包的AppCallerThread线程类,其run方法调用回调函数receiveData,才开始接收RTP包,receiveData函数会去掉RTP包头,直接将RTP负载存入缓存,之后再进行分包的判断。
具体实现过程如下:
1、InitSession.java类初始化会话基础参数,设置目标IP及RTP端口号和RTCP端口号等;
数据发送和接收需要分包来处理,这里没有贴出来,demo中有完整的分包发送和接收的处理以及数据同步的多线程实现
[java] view plain copy
- package com.eric.androidrtpsenddata;
- import java.net.DatagramSocket;
- import java.net.InetSocketAddress;
- import jlibrtp.*;
- public class InitSession implements RTPAppIntf{
- public RTPSession rtpSession = null;
- public InitSession() {
- DatagramSocket rtpSocket = null;
- DatagramSocket rtcpSocket = null;
- try {
- rtpSocket = new DatagramSocket(8002);