Android调用Jlibrtp库实现RTP发送数据

       如果你也在Android端做RTP发送数据的话,通过网上查找资料,相信你不难发现,在使用RTP/RTCP协议发送数据是有现成的库进行调用的,Jlibrtp这个库就是Java实现的,但是这个库是没有说明文档的,比较抠脚,而且百度谷歌找到例子又很少,基本上都没什么卵用;一般搜到都是Jrtplib库,这是C实现库,对我们没多大用,除非你愿意先研究这个库的RTP实现,在用JNI调用,明显更蛋疼。这个没文档就只能自己瞎倒腾一下,还好勉强倒腾出来了。

       首先,你必须下一个Jlibrtp库:http://download.csdn.net/detail/ericfantastic/9206693 里面包含Jlibrtp的实现和java调用的Demo。

       下完后,新建一个Android工程,将Jlibrtp-0.2.2中的jlibrtp文件夹中的所有.java文件导入工程,全丢到一个新建的jlibrtp包里面,准备工作算是完成,在需要地方直接import这个包,就可以使用了。

简单整理一下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端口号等;

package com.eric.androidrtpsenddata;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;


import jlibrtp.*;
/*
 *@author Eric 
 *@2015-10-23下午3:28:20
 */
public class InitSession implements RTPAppIntf{
	public RTPSession rtpSession = null;
	
	public InitSession() {
		DatagramSocket rtpSocket = null;
		DatagramSocket rtcpSocket = null;
		
		try {
			rtpSocket = new DatagramSocket(8002);
			rtcpSocket = new DatagramSocket(8003);
		} catch (Exception e) {
			System.out.println("发送创建会话异常抛出:"+e);
		}
		
		//建立会话
		rtpSession = new RTPSession(rtpSocket, rtcpSocket);
		rtpSession.RTPSessionRegister(this,null,null);
		//设置参与者(目标IP地址,RTP端口,RTCP端口)
		Participant p = new Participant("192.168.226.116", 8004, 8005);
		rtpSession.addParticipant(p);
	}
	
	public void receiveData(DataFrame frame, Participant p){
		String s = new String(frame.getConcatenatedData());
		System.out.println("接收到数据: "+s+" , 参与者CNAME: "
				+p.getCNAME()+"同步源标识符("+p.getSSRC()+")");
	}

	
	public void userEvent(int type, Participant[] participant) {
		// TODO Auto-generated method stub
	}

	
	public int frameSize(int payloadType) {
		return 1;
	}
}

2、MainActivity.java中发送数据;

package com.eric.androidrtpsenddata;

import android.app.Activity;
import android.os.Bundle;

/*
 *@author  Eric
 *@2015-10-12上午8:31:54
 */
public class MainActivity extends Activity{
	 
	 @Override
		protected void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);
			setContentView(R.layout.activity_main); 
			
			/*Thread receiveThread = new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						receiveData();
					} catch (Exception e) {
						e.printStackTrace();
						System.out.println("RTP接收数据异常:"+e);
					}
				}
			});
			receiveThread.start();*/
			
			Thread sendThread = new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						openSession();
					} catch (Exception e) {
						e.printStackTrace();
						System.out.println("RTP发送数据异常:"+e);
					}
				}
			});
			sendThread.start();
			
		}
	 
	 //Jlibrtp开启会话发送数据
	 public void openSession(){
		InitSession test = new InitSession();
		long teststart = System.currentTimeMillis();
		String str = "abce abcd abce abce abce abcd abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce abcd " +
				"abce abcd abce abcd abce abcd abce abcd abce abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce abcd " +
				"abce abcd abce abcd abce abcd abce abcd abce abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce abcd " +
				"abce abcd abce abcd abce abcd abce abcd abce abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce abcd " +
				"abce abcd abce abcd abce abcd abce abcd abce abcd abce " +
				"abcd abce abcd abce abcd abce abcd abce abcd abce abcd " +
				"abce abcd abce abcd abce abcd abce abcd ";
		byte[] data = str.getBytes();
		System.out.println(data.length);
		int i=0;
		while(i<data.length) {
				System.out.println("已发送第"+i+"个字节数组:"+data);
				test.rtpSession.sendData(data);
				i++;
		}

		long testend = System.currentTimeMillis();
		
		System.out.println("发送用时:" + (testend - teststart));
		System.out.println("结束时间:" + testend);
		System.out.println("开始时间:" + teststart);
	 }
	 
	 public void receiveData(){
		 ReceiveData receive = new ReceiveData();
	 }
		
}
Demo运行结果:



附上Demo地址:http://download.csdn.net/detail/ericfantastic/9216101






你可能感兴趣的:(android,RTP,rtcp,Jlibrtp)