今天在家里的机器上,打开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相关推荐

  1. 下载最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错

    下线最新版本Maven 3.3.9 ,检测安装是否成功时发现Java版本JDK却低于1.7时报错 cmd: mvn -v Exception in thread "main" ja ...

  2. linux 修改java版本_Linux 有问必答:如何在 Linux 中改变默认的 Java 版本

    提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...

  3. java jnlp被阻止_JNLP应使用特定的Java版本,但会出现错误结果

    我在这里面临一个问题.我想使用特殊版本来运行我们的 java webstart应用程序,但只需要一个jnlp. ("经过测试,- blabla我们不能使用新版本- blabla"随 ...

  4. 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 ...

  5. mac os x java_Mac OS X和多个Java版本

    守着一只汪 在Mac上管理多个Java版本的最简洁方法是使用Homebrew.在内Homebrew,使用:homebrew-cask 安装java的版本jenv 管理已安装的java版本如http:/ ...

  6. centos 更换java版本_centos7 更换jdk版本

    查看java版本   java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...

  7. 【错误记录】Android 编译时技术版本警告 ( 注解处理器与主应用支持的 Java 版本不匹配 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 一.报错信息 在使用 Android 编译时技术 , 涉及 编译时注解 , 注解处理器 ; 开发注解处理器后 , 编译报如下警告 ; 该警告不会影响 ...

  8. 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )

    文章目录 一.注解处理器 依赖 编译时注解 二.设置 注解处理器 支持的注解类型 三.设置 注解处理器 支持的 Java 版本 四.博客资源 Android APT 学习进阶路径 : 推荐按照顺序阅读 ...

  9. 【SmartJob】【隔离装置】WEB/统计程序和隔离程序共享服务器时的JAVA版本冲突问题

    SmartJob.DmsWeb与SmartSys共享服务器容易引发Java版本冲突问题: Java版本不正确 UnsupportedClassVersionError Exception in thr ...

  10. mvp架构 java_GitHub - AnthonyCoder/MvpForJava: 一个可直接快速引入的 Java 版本的模块化 MVP 框架...

    使用Java构建的一个模块化的MVP的项目 个人项目仅供学习使用,感谢以下开放Api: Demo简介 该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构 提供给初 ...

最新文章

  1. iframe引用页面中的js操作父窗口标签
  2. 企业网络项目PT模拟
  3. linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
  4. 浮动元素 —— 怎么使用它们、它们有什么问题以及怎么解决这些问题。
  5. springboot gateway 负载均衡_05_Springbootamp;Springcloud面试题
  6. java数组深拷贝和浅拷贝_java List复制:浅拷贝与深拷贝
  7. 02205微型计算机原理与接口技术自考,2012年微型计算机原理与接口技术自考题模拟(2)...
  8. [BZOJ 3668UOJ #2][Noi2014]起床困难综合症(贪心)
  9. BZOJ.2679.Balanced Cow Subsets(meet in the middle)
  10. 「三分钟系列06」3分钟看懂http与https的区别
  11. Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
  12. linux刷wes7,WES7——Win7的嵌入式操作系统
  13. Arduino UNO步进电机控制
  14. 开启迅盘:ReadyBoost和ReadyDrive的开启方法
  15. python怎么来算面积_python面积求法
  16. 2019.4.8-pandas 读写csv;dorp删除行、列
  17. HDU - 2072 -- 单词数【set or 字典树】
  18. android多媒体框架学习 详解 最新版本
  19. 一分钟学会自定义右上角显示数字的ImageView
  20. char类型和varchar的区别和选用

热门文章

  1. linux内核的诞生时间,Linux内核诞生已经17年
  2. linux 下xhprof的安装和使用
  3. 微信第三方平台公众号授权
  4. 表多个字段与其他表关系,left join on 顺序
  5. 《Spring 5 官方文档》18. Web MVC 框架(八)
  6. Javascript String对象
  7. Object-c 学习笔记
  8. Java网络编程之实现HTTP断点续传下载工具(附源代码)
  9. svn服务端及客户端搭建和使用(一)
  10. 九宫格图片上传可展示,可删除,可添加功能