java版本的RtpStream
今天在家里的机器上,打开Eclipse,类删除也不编译出错,不知道哪里的问题。以后有机会,把这些代码编译后放出来。当初也是从网上搜索到了,略微整理而已。
package com.newayte.rtp.clinet;import android.os.HandlerThread;
import android.os.Handler;import com.newayte.toolkit.Log;import java.util.concurrent.LinkedBlockingDeque;/***This class is used to analysis the data from rtp socket , recombine it to video or audio stream* 1. get the data from rtp socket* 2. put the data into buffer* 3. use the thread to get the data from buffer, and unpack it*/
public abstract class RtpStream {private final static String TAG = RtpStream.class.getCanonicalName();protected final static int TRACK_VIDEO = 0x01;protected final static int TRACK_AUDIO = 0x02;public final static int DATA_AUDIO = 0x08;public final static int DATA_VIDEO = 0x60;private Handler mHandler;private HandlerThread thread;private boolean isStoped;private int oldSeqNum;protected class StreamPacks {public boolean mark;public int pt;public long timestamp;public int sequenceNumber;public long Ssrc;public byte[] data;}private static class bufferUnit {public byte[] data;public int len;}private static LinkedBlockingDeque<bufferUnit> bufferQueue = new LinkedBlockingDeque<bufferUnit>();public RtpStream() {thread = new HandlerThread("RTPStreamThread");thread.start();mHandler = new Handler(thread.getLooper());unpackThread();isStoped = false;oldSeqNum = -1;}public static void receiveData(byte[] data, int len) {bufferUnit tmpBuffer = new bufferUnit();tmpBuffer.data = new byte[len];System.arraycopy(data,0,tmpBuffer.data,0,len);tmpBuffer.len = len;try {bufferQueue.put(tmpBuffer);} catch (InterruptedException e) {}}private void unpackThread() {mHandler.post(new Runnable() {@Overridepublic void run() {bufferUnit tmpBuffer;while (!isStoped) {try {tmpBuffer = bufferQueue.take();byte[] buffer = new byte[tmpBuffer.len];System.arraycopy(tmpBuffer.data,0,buffer,0,tmpBuffer.len);unpackData(buffer);} catch (InterruptedException e) {//Log.e(TAG,"wait the new data into the queue..");break;}}bufferQueue.clear();}});}public void stop(){isStoped = true;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}bufferQueue.clear();thread.quit();}protected abstract void recombinePacket(StreamPacks sp);private void unpackData(final byte[] buffer) {if (buffer == null || buffer.length == 0){return;}if (((buffer[0]&0xFF)>>6) != 2){Log.d(TAG, "ERROR!!!");return;}int size = buffer.length;if ((buffer[0] & 0x20) > 0){int paddingLength = (buffer[size-1] & 0xFF);if (paddingLength + 12 > size){Log.d(TAG, "ERROR!!!");return;}}int numCSRCs = (buffer[0] & 0x0F);int payloadOffset = 12 + 4 * numCSRCs;if (size < payloadOffset){Log.d(TAG, "ERROR!!!");return;}if ((buffer[0] & 0x10) > 0) {// Header eXtension present.if (size < payloadOffset + 4) {// Not enough data to fit the basic header, all CSRC entries// and the first 4 bytes of the extension header.Log.d(TAG, "ERROR!!!");return;}int extensionLength = 4 * (buffer[payloadOffset+2] << 8 | buffer[payloadOffset+3]);if (size < payloadOffset + 4 + extensionLength){Log.d(TAG, "ERROR!!!");return;}payloadOffset += 4 + extensionLength;}StreamPacks tmpStreampack = new StreamPacks();tmpStreampack.mark = (buffer[1] & 0x80) >> 7 == 1;tmpStreampack.pt = buffer[1] & 0x7F;tmpStreampack.sequenceNumber = ((buffer[2] & 0xFF) << 8) | (buffer[3] & 0xFF);tmpStreampack.timestamp = ((buffer[4] & 0xFF) << 24) | ((buffer[5] & 0xFF) << 16) | ((buffer[ 6] & 0xFF) << 8) | (buffer[ 7] & 0xFF);tmpStreampack.Ssrc = ((buffer[8] & 0xFF) << 24) | ((buffer[9] & 0xFF) << 16) | ((buffer[10] & 0xFF) << 8) | (buffer[11] & 0xFF);int dataSize = size-payloadOffset;//Log.d(TAG, "size="+size+", payloadOffset="+payloadOffset+", "+dataSize);if (dataSize > 0){tmpStreampack.data = new byte[dataSize];System.arraycopy(buffer, payloadOffset, tmpStreampack.data, 0, dataSize);if (oldSeqNum==-1){oldSeqNum = tmpStreampack.sequenceNumber;}if (tmpStreampack.sequenceNumber - oldSeqNum>1){//Log.e(TAG, "RTP lost packet:"+oldSeqNum+"..."+tmpStreampack.sequenceNumber);}oldSeqNum = tmpStreampack.sequenceNumber;recombinePacket(tmpStreampack);}}}
java版本的RtpStream相关推荐
- 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错
下线最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错 cmd: mvn -v Exception in thread "main" ja ...
- linux 修改java版本_Linux 有问必答:如何在 Linux 中改变默认的 Java 版本
提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...
- java jnlp被阻止_JNLP应使用特定的Java版本,但会出现错误结果
我在这里面临一个问题.我想使用特殊版本来运行我们的 java webstart应用程序,但只需要一个jnlp. ("经过测试,- blabla我们不能使用新版本- blabla"随 ...
- Ubuntu/Debian 系统切换Java(JVM),修改Java版本,JAVA_HOME
http://blog.mypapit.net/2007/10/how-to-switch-between-different-java-jvm-in-ubuntu-and-debian-gnu-li ...
- mac os x java_Mac OS X和多个Java版本
守着一只汪 在Mac上管理多个Java版本的最简洁方法是使用Homebrew.在内Homebrew,使用:homebrew-cask 安装java的版本jenv 管理已安装的java版本如http:/ ...
- centos 更换java版本_centos7 更换jdk版本
查看java版本 java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...
- 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )
文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...
- 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )
文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...
- 【SmartJob】【隔离装置】WEB/统计程序和隔离程序共享服务器时的JAVA版本冲突问题
SmartJob.DmsWeb与SmartSys共享服务器容易引发Java版本冲突问题: Java版本不正确 UnsupportedClassVersionError Exception in thr ...
- mvp架构 java_GitHub - AnthonyCoder/MvpForJava: 一个可直接快速引入的 Java 版本的模块化 MVP 框架...
使用Java构建的一个模块化的MVP的项目 个人项目仅供学习使用,感谢以下开放Api: Demo简介 该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构 提供给初 ...
最新文章
- iframe引用页面中的js操作父窗口标签
- 企业网络项目PT模拟
- linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
- 浮动元素 —— 怎么使用它们、它们有什么问题以及怎么解决这些问题。
- springboot gateway 负载均衡_05_Springbootamp;Springcloud面试题
- java数组深拷贝和浅拷贝_java List复制:浅拷贝与深拷贝
- 02205微型计算机原理与接口技术自考,2012年微型计算机原理与接口技术自考题模拟(2)...
- [BZOJ 3668UOJ #2][Noi2014]起床困难综合症(贪心)
- BZOJ.2679.Balanced Cow Subsets(meet in the middle)
- 「三分钟系列06」3分钟看懂http与https的区别
- Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
- linux刷wes7,WES7——Win7的嵌入式操作系统
- Arduino UNO步进电机控制
- 开启迅盘:ReadyBoost和ReadyDrive的开启方法
- python怎么来算面积_python面积求法
- 2019.4.8-pandas 读写csv;dorp删除行、列
- HDU - 2072 -- 单词数【set or 字典树】
- android多媒体框架学习 详解 最新版本
- 一分钟学会自定义右上角显示数字的ImageView
- char类型和varchar的区别和选用