【Android源码 栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Android源码 -基于android手机的即时视频通讯系统 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
计算机网络研究热点
问题大
作业 题目:基于
android 手机的即时视频通讯系统 学 院
计算机科学与技术 专 业 计算机科学与技术 年 级 2010 级 姓 名 叶君骄 学 号 2010216090 2011 年 6 月 4 日 基于
android 手机的即时视频通讯系统1 引言 如果说移动设备有一条基本原则的话,那么就是存在即是合理。
回顾历史,新的移动设备的出现推动了移动应用技术的发展。
Brian Fling 在1中按照移动设备 , 将移动技术划分为五个不 同的时代。
第一个时代称之为“砖块时代” ,(1973-1988)这个时代最具代表性的,就是 1983 年发布的摩托罗拉 DynaTAC。
这个时代的移动设备仅仅支持语音通话,而且体积庞大、过于昂贵,绝大多数人是无力购买的。
第二个时代是“糖块时代”(1988-1998),代表了移动技术的一次重大飞跃,这个时代最具代表性的就是诺基亚类型的糖块手机。
该时代的移动设备的进步不仅仅体现在便携性上,还因为糖块手机基于 2G GMS(GlobalSystem for Mobile communications,全球移动通讯系统)网络,支持 SMS(ShortMessage Service,短信服务),使人们意识到了手机不仅可以用来打电话。
第三个时代是功能性手机时代(1998-2008),这个时代最具有代表性的也许是摩托罗拉 RAZR。
这个时代, ( GSM 网络供应商增加了 GPRS General Packet Radio Service,通用无线分组业务)已进行分组交换数据服务,这次进化通常被称为 2.5G。
功能性手机时代打开了闸门,琳琅满目的应用程序和服务像洪水一样涌进手机,比如音乐、拍照、上网等。
第四个时代是智能手机时代,智能手机时代与第三、第五个时代同时发生,从 2002 年一直持续到现在。
虽然智能手机和功能手机之间一直没有清晰的界定,但是智能手机通常搭载通用操作系统,屏幕尺寸更大,使用 QWERTY 全尺寸键盘或手写输入,拥有 Wi-Fi 或者其他方式的高速无线连接 这个时代具有代表性的智能手机是 Handspring 公司的 Tero 系列智能手机。
能力。
第五个时代是触屏时代,2007 年 1 月 9 日凌晨,在美国旧金山举行的 MacWorld大会上,Steve Jobs 走上讲台,宣告了第五代也是最后一个时代的到来,它改变了整个移动界,Jobs 带来的正是 iphone。
Iphone 改变了人们对移动技术用途的日常观念,在不到一年的时间内,出现了 2000 多个专为 iphone 设计的移动 Web应用程序,在 iPhone 发售仅仅六个月后,iTunes App Store 的一万多个程序就被下载了超过 3 亿次,平均每天下载两百万次。
五个时代代表性手机如图 1 所示: a b 1 基于
android 手机的即时视频通讯系统 c d e 图 1 a 摩托罗拉 DynaTAC b 诺基亚类型的糖块手机 c 摩托罗拉 RAZR d Handspring 公司的 Tero 系列智能手机 e iphone 智能手机与触屏时代的来临使得手机处理能力越来越强大,集成的硬件功能模块也越来越丰富,这为人们开发手机原生应用提供了基本的支持。
移动设备的本质就是让人与人之间的交流更为容易,它便于携带,完全属于个人,且永远在线。
随着 3G 技术的广泛应用以及无线 wifi 的广泛分布,移动设备随时随地可以接入高数据传输速度的移动网络,这也就使得超越以往语音通讯的即时视频通讯成为可能。
3G 技术标准如表 1 所示: 表 1 3G 技术标准3G 第三代手机标准 理论最大数据传输速度W-CDMA 宽带码分多址 14.4MB/sUMTS 通用移动通讯系统 3.6MB/sUMTS-TDD UMTS时分双工 16MB/sTD-CDMA 时分码分多址 16MB/sHSPA 高速分组接入 14.4MB/sHSDPA 高速下行分组接入 14.4MB/sHSUPA 高速上行分组接入 5.76MB/s我国的 3G 技术标注主要为 W-CDMA 以及 TD-CDMA 两种,都具有较大的传输带宽,为视频通讯系统的设计提供了必要的技术支持。
基于智能手机的即时视频
通信系统克服了传统的基于 PC 机的视频通讯系统的携带限制性,可以随时随地地进行视频通话,在视频会议、居家防盗监控以及远程视频医疗等领域有着广泛的应用前景。
2 即时视频通讯系统总体方案 基于
android 手机的即时视频通讯系统的总体架构图如图 2 所示。
该系统即 2 基于
android 手机的即时视频通讯系统支持基于 3G 的手机视频通讯,又支持基于 wifi 的手机视频通讯,并支持两种接入网络间的无缝切换。
系统功能的实现流程是
android 手机客户端,
登陆到系统 图 2 系统总体架构图服务器,进入聊天大厅,随机选择在线客户端进行聊天,还可以选择在线客户端加为好友,系统同时支持两人点对点和多人同时进行视频聊天、通话等功能。
3 即时视频通讯
系统客户端设计
方案 本系统客户端选择基于
android 应用
程序架构的智能手机,对于手机硬件设备的唯一要求是带有前置摄像头。
Android 应用程序架构是 Google 公司发起的OHA(Open Handset Alliance)联盟于 2007 年 11 月推出的,任何公司以及个人都可以
免费获取
源代码及开发 SDK。
由于其开放性和优异性,
Android 应用程序架构得到了业界广泛的支持,其中包括各大手机厂商和著名的移动运营商等。
Android SDK 对多媒体影音文件(MPEG4、H.264、MP3、ACC、AMR、JPG、PNG、GIF 等格式)有着丰富的支持,且为摄像头视频流捕获提供了完备的 API接口。
本文中的客户端程序在
android 模拟器以及 HTC G8 手机上测试实现。
基于
android 手机的即时视频通讯系统客户端由 5 个基本子模块组成,如图 3所示。
下面分别对各个子功能模块进行简单地介绍。
即时视频通讯系统客户端 图形用户 视频编解 音频编解 视频通讯 文件存储 界面 码器 码器 协议栈 管理 3 基于
android 手机的即时视频通讯系统 图 3 即时视频通讯系统客户端子模块图3.1 图形用户界面 一个
Android 的应用是由一个或者多个 Activity 类组成的,其中 Activity 等同于 J2ME 的 MIDlet2,一个 Activity 类负责创建视窗。
Activity 是一个 UI(图形用户界面)的容器,但其本身并不在用户界面上显示出来。
Android 的图形用户界面包含四类基本元素:1)视图组件(View),View 类是
Android 当中 View类中最基本得一个 UI 类,基本上所有的高级 UI 组件都是集成 View 类而实现的,TextView , (按钮) List
列表) EditText 编辑框) RadioButton (文本框) Button , ( , ( ,(多选按钮),Checkbox(选择框)等都是 View 类。
一个视图(View)在屏幕上占据了一块矩形区域,它负责渲染这块矩形区域,可以处理这块区域发生的事件(如用户单击了这块区域),并且可以设置这块区域是否可见,是否可以获取焦点等。
2)视图容器组件(Viewgroup),顾名思义,Viewgroup 的作用就是 View的容器,它负责对添加进 Viewgroup 的这些 View 进行布局,当然一个 Viewgroup也可以加入到另外一个 Viewgroup 里边。
Viewgroup 是一个抽象类,需要靠不同的 Layout 类来实现。
3)布局组件(Layout),最常见的两个 Viewgrops 的实现类为 LinearLayout 和 RelativeLayout,LinearLayout 可以进行水平布局或者竖直布局,RelativeLayout 负责相对布局。
4)布局参数(LayoutParams),布局参数确定一个 View 加入到一个 Viewgroup 里边,显示的大小和位置。
本文的即时视频通讯系统客户端(Face to Face,以下简称 F2F)图形用户界面的部分截图如图 4 所示。
a b 图 4 (a)用户登录界面图;(b)系统功能界面图 4 基于
android 手机的即时视频通讯系统3.2 视(音)频编解码器 视频聊天必然要求实现音、视频数据的实时传输及图像声音的清晰回放,要达到这样的要求,音、视频数据的采集和压缩、数据的传输和控制以及数据的接收和播放等技术都很关键。
3.2.1 双缓冲多线程技术 软件的视频压缩算法是最耗CPU时间的,为了尽可能的提高压缩的效率,提高 CPU 的使用效率,本系统采用了双缓冲和多线程等技术3,使得图像的采集、压缩和传输可以并发执行,从而提高了软件的整体性能。
在图 5 中,视频采集线程将从摄像头上采集的各帧视频图像分别存放到视频源缓冲区 1 和视频源缓冲区 2,软件压缩线程则分别将视频源缓冲区 1 和视频源缓冲区 2 的图像进行压缩,并把压缩后的图像分别保存到压缩视频缓冲区 1和压缩视频缓冲区 2。
视频采集线程等待两个视频源缓冲区中至少有一个为空时才进行采集,
软件压缩线程则等待视频源缓冲区至少有一个为满并且压缩视频缓冲区至少有一个为空时才进行压缩。
所有使用
压缩后的视频数据的线程排成一个队列,它们可以同时使用非空的压缩视频缓冲区的视频数据。
当最后一个线程使用完压缩视频缓冲区后,向视频采集线程发出采集下一帧的命令。
从缓冲区中取走数据,将缓冲区的状态置空,向缓冲区中放入数据,将缓冲区的状态置满。
视频的解压缩也是采用了多线程技术。
音频数据的采集压缩和解压缩过程类似于视频数据。
获取一帧压缩后的视频 采集下一帧 数据流 消息 视频源 压缩视频 缓冲区 1 缓冲区 1 摄像头 视频采 软件压 采视频 集线程 缩线程 视频源 压缩视频 缓冲区 2 缓冲区 2 图 5 音视频线程采集和压缩 5 基于
android 手机的即时视频通讯系统3.2.2 捕获音、视频数据 利用
Android 手机捕获视频流,第一步要在 AndroidManifest.xml 加入如下权限声明: 图 6 获取摄像头使用的权限声明图以获取使用硬件设备——摄像头的权限。
Android API 中负责管理视频捕捉设备的类是 Camera,Camera 类的主要功能有设置图像获取参数,启动/停止预览,拍照,以及获取待编码视频帧。
Android 的拍照视频预览时就可以截取视频数据,每获得一帧就调用一下接口函数。
Android 手机摄像头的预览和捕获只能通过Surfaceview 类来实现,Surfaceview 类在视图层次中提供一个专用的 drawingsurface,该类负责在屏幕中的正确位置放置绘图表面。
Surfaceview 类提供抽象接口 SurfaceHolder 来控制 drawing surface 的尺寸和格式,修改 drawing surface的像素以及监控 drawing surface 发生的改变。
而 Surfaceview 的工作模式必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS,否则无法在 Surfaceview 里显示出预览的图像。
Android 手机,捕获视频流,可分为以下几个步骤: 步骤 1 调用 Camera.open ,初始化 Camera 类实例,启动相机服务。
步骤 2 Camera 类实例调用 setPreviewDisplaySurfaceHolder Instance,设置预览。
步骤 3 Camera 类实例调用 setParametersCamera.Parameters Instance,设置图片格式,预览的帧数(受硬件影响),以及 surface 尺寸等。
步骤 4 Camera 类实例调用 setPreviewCallbacknew ViewCallbackSurfaceViewInstance this,设置回调类,其中 ViewCallback 类实现了 PreviewCallback 接口,该回调接口用来投递预览帧的拷贝,通过实现 onPreviewFrame 函数来获取原始视频帧,并可以在该函数中实现视频帧的编码压缩,以及将视频帧封装为 RTP格式进行传输。
步骤 5 Camera 类实例调用 startPreview ,开始预览。
AudioRecord 类是
Android 获取音频流的重要类,放置在
android.media 包中。
AudioRecord 类负责从音频输入硬件中获取音频流,通过由 AudioRecord 实例读取数据实现。
捕获音频流,可分为以下几个步骤: 步骤 1 调用 AudioRecord.getMinBufferSize8000 AudioFormat.CHANNEL_CONFIGURATION_MONO AudioFormat.ENCODING_PCM_16BIT为 AudioRecord 正常实例化设置合适的 buffer 大小。
步骤 2 通过 new AudioRecordMediaRecorder.AudioSource.MIC 8000 6 基于
android 手机的即时视频通讯系统AudioFormat.CHANNEL_CONFIGURATION_MONOAudioFormat.ENCODING_PCM_16BIT buffer_size实例化 AudioRecord 类。
步骤 3 AudioRecord 类实例调用 startRecording 开始录音。
步骤 4 AudioRecord 类实例调用 readbuffe 0 buffer_size ,获取音频流。
3.2.3 音、视频编解码实现 音视频编码器使用的是 x264 的开源库,编译后将其封装成一个 JNI
JavaNative Interface,JAVA 本地调用4,然后在
Android.mk 中添加一些相应的配置即可使用。
下面简单阐述一下移植过程,x264 的编译放方法如下: 图 7 x264 的编译放方法图编译后,将生成的 libx264.a 和 x264.h 文件放到 JNI 的 libx26 目录下: 7 基于
android 手机的即时视频通讯系统 图 8 路径设置示意图 音视频解码器使用的同样是 x264 的开源库,移植 ff
mpeg 的 H264 解码器部分到
Android,与编码器移植过程类似,不再赘述。
MediaRecorder 类是
Android 提供的进行采集编码的类,在初始化时,加入MediaRecorder.setAudioSource 即可在视频压缩(解压)时,同时压缩(解压)音频。
3.2.4 播放音、视频数据 在
Android 中,有三种方式来实现视频数据的播放。
第一种是使用自带的播放器,通过指定 Action 为 ACTION_VIEW,Data 为 Uri,Type 为其 MIME 类型来实现;第二种是使用 VideoView 来播放,在布局文件中使用 VideoView 结合MediaController 来实现对其控制;第三种是使用 MediaPlayer 类和 SurfaceView来实现,这种方式最灵活,但是比较复杂。
本系统采用第二种方式来实现,步骤如下: 步骤 1 实例化 VideoView 类。
步骤 2 VideoView 类实例调用 setMediaControllernew MediaControllerthis,为实例添加控制器。
步骤 3 VideoView 类实例调用 setVideoURI(Uri instance),获取视频源。
步骤 4 VideoView 类实例调用 requestFocus ,获取焦点,开始播放视频流。
Uri 实例可以是 RTP 格式视频流,以支持边传输边播放。
AudioTrack 类是
Android 播放音频流的重要类,放置在
android.media 包中。
AudioTrack 类负责将音频流缓存到音频硬件中以实现声音的播放,通过由AudioTrack 实例写入数据实现。
播放音频流,可分为以下几个步骤: 步骤 1 调用 AudioTrack.getMinBufferSize8000 AudioFormat.CHANNEL_CONFIGURATION_MONO AudioFormat.ENCODING_PCM_16BIT为 AudioTrack 正常实例化设置合适的 buffer 大小。
步骤 2 通过 new AudioTrackMediaRecorder.AudioSource. STREAM_MUSIC8000 AudioFormat.CHANNEL_CONFIGURATION_MONOAudioFormat.ENCODING_PCM_16BIT buffer_size AudioTrack.MODE_STREAM实例化 AudioTrack类。
步骤 3 AudioTrack 类实例调用 play 开始播放。
步骤 4 AudioTrack 类实例调用 write buffe 0 buffer_size ,将音频流写入音频硬件,进行播放。
8 基于
android 手机的即时视频通讯系统3.3 视频通讯协议栈 即时视频通讯客户端支持基于 wifi 的通讯,也支持基于 3G 的通讯,这为视频通讯协议栈的
设计制造了难度。
然而
Android 平台提供了 ConnectivityManager类,用于网络连接状态的检测,这就为即时视频通讯客户端的设计提供了极大的便利。
根据
Android 的安全机制,在使用 ConnectivityManager 时,必须在AndroidManifest.
xml 中添加ltuses-permission
android:namequotandroid.per
mission.ACCESS_
NETWORK_STATEquot /gt 否则无法获得系统的许可。
当 F2F 启动时,如果没有有效的网络连接,F2F 会提示转入手机的网络配置界面。
该功能通过图 9所示代码实现: 图 9 ConnectivityManager 实现
网络配置 如果调用如下函数:startActivitynew IntentSetting.ACTION_WIRLESS_SETTING则直接进入 wifi 网络设置界面启用 wifi 功能以后,查看网络配置,可以看到 wifi 网络已经连接了,如图 10 所示。
F2F 在启动时,如果发现 3G 和wifi 同时可用,F2F 首选 wifi 进行连接,以获取性能和费用的收益。
9 基于
android 手机的即时视频通讯系统 a b (b)网络状态查看界面 图 10 (a)手机 wifi 网络设置界面; 考虑到多人视频聊天的带宽限制以及 3G 和 wifi 接入网络异构性,本系统针对不同的 F2F 客户端接入场景应用不同的通讯协议。
在当前的 wifi 网络带宽条件下,多人 wifi 接入视频聊天10 人以内 适宜采用 P2Ppeer to peer方式传递音、视频信息,即用户通过俩俩建立 RTP (real timeprotocol,实时传输协议)会话来相互传送和接收音、视频。
这种模式下,每个客户机要向其他的所有用户上传并下载音、视频;而对人数更多的群组聊天或者同时有 3G 和 wifi 接入客户端的群组聊天,则适宜采用 C/Sclient/server 的模式传送和接收视频。
即首先每位客户机通过与服务器端建立 RTP 会话,将自己的音、视频信息发送到服务器,然后服务器再将接收到的音、视频数据统一发送到其它各客户机。
这种模式下,每个客户机只需向服务器上传自己的音、视频即可,这样就节省了很多的上传带宽,当然这也会增加服务器的下载负担。
根据本系统的实际需求,采用 P2PC/S 的折中模式。
由于群组视频通讯在进行的时候,一段时间内只播放部分成员发言人 的音、视频,因此,只需这一部分的成员向服务器发送他们的音、视频信息,节省了大量的上传带宽。
与此同时,参会人员(基于 wifi 接入成员)还可以在下载音、视频数据的同时开启数个“私聊”通道,与其他成员(基于 wifi 接入成员)进行视频聊天,而这种“私聊”又是采用了 P2P 的方式。
这种依据我国带宽特点的传输方式,很好地将 P2P 传输与服务器转发模式结合起来,为同类软件的设计提供了新思路。
P2PC/S 折中模式视频通讯协议如图 11 所示。
F2F_1 F2F_2 3G 上传音视频 上传音视频 3G 下载音视频 下载音视频 服务器 下载音视频 下载音视频 上传音视频 上传音视频 F2F_3 F2F_4 wifi wifi P2P 图 11 P2PC/S .