分享

流媒体分析之sipdroid的videocamera类,流程分析及RTP/RTCP介绍

 arm_embed 2012-12-05

流媒体分析之sipdroid的videocamera类,流程分析及RTP/RTCP介绍

分类: 流媒体 1130人阅读 评论(0) 收藏 举报

 Sipdroid是一个运行于Android手机平台上的SIP/网络电话客户端,与QQMSNIMS软件不同的是,Sipdroid不仅仅是支持电脑对电脑,同时也支持电脑对手机和固话,SIP设备对手机和固话,因为有了它,你只要支付很少的RMB,甚至于免费,就可以打电话到国内甚至国际手机或固话。它是基于标准的SIP协议,所以只要是支持这些协议的通讯工具都可以互通。

因为没有两部手机用来测试,所以里面的有些功能可能理解有误,如果对大家造成误导,i'm sorry。

   另外Sipdroid是开源的一款SIP协议网络电话。开源意思是该程序的源代码是开放的,因为源码是开放的,所以软件不可能作恶。从这个项目中,我们可以学到音视频编码解码,使用Jni,流媒体传输,包括网络,SIPRTP等协议的封装使用等。据说视频通话功能需要服务端提供支持,网上有开源的SIP服务器,大家可以自己搭建了测试。

Sipdroid的源码及apk文件下载:

http://download.csdn.net/detail/comkingfly/4214306

SIP和RTP是相互独立的两个功能块,SIP消息和服务器通信,告诉服务器双边通信的状态,当双边都进入通话和视频的过程中,那么就完全的走RTP了,RTP采用数据报包的方法,两台手机同时connect(ip,port);只要一个send,一个receiver就行了,数据就完成传输了。

SIP协议栈是Java实现的,JNI 实现的是 audio codec。

Sipdroid中采用的是什么协议?
这点非常的重要,因为Sipdroid采用的是RFC3261协议,大家看了RFC3261协议后,你就会明白,Sipdroid中对于Message的封装是如何完成,那么Message的封装和生成这块所涉及到得设计模式和代码,你基本就可以弄明白。

Sip协议相关文档下载(中英文及精解):

http://download.csdn.net/detail/comkingfly/4220745

Sipdroid的工作示范图:

 

 

VideoCamera.java这个类主要用于拍摄视频,封装成RTP流。

实时视频流采集

方案一:  通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据

方案二:  通过Android的MediaRecorder,在SetoutputFile函数中绑定LocalSocket实现

方案三:  流媒体服务器方式,利用ffmpeg或GetStreamer等获取Camera视频

Sipdroid采用的是第2种。

MediaRecorder的生命周期介绍:



Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaRecorder程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。


private class MainHandler里:

  1. if (mVideoFrame != null) {  
  2.                             int buffering = mVideoFrame.getBufferPercentage();  
  3.                             if (buffering != 100 && buffering != 0) {  
  4.                                 mMediaController.show();  
  5.                             }  
  6.                             if (buffering != 0 && !mMediaRecorderRecording) mVideoPreview.setVisibility(View.INVISIBLE);  
  7.                             if (obuffering != buffering && buffering == 100 && rtp_socket != null) {  
  8.                                 <span style="color:#ff0000;">RtpPacket keepalive = new RtpPacket(new byte[12],0);</span>  
  9.                                 keepalive.setPayloadType(125);  
  10.                                 try {  
  11.                                     rtp_socket.send(keepalive);  
  12.                                 } catch (IOException e) {  
  13.                                 }  
  14.                             }  
  15.                             obuffering = buffering;  
  16.                         }  

这里就是把缓冲的视频封装成RTP流。

RtpPacket.java 用于把数据按照RTP协议的结构进行封装。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多