【Android论文栏目提醒】:网学会员鉴于大家对Android论文十分关注,论文会员在此为大家搜集整理了“基于Android平台的实时自适应音频传输技术及其实现 - 毕业设计”一文,供大家参考学习
ISSN 10哼-铷44 E—mail:eduf@cccc.net.cn cc舸嗍幻姗础姆a耐丁e叻∞恸电■知识与技术 hnp:/,www.dIIzs.net.cn v0I.7,No.4,Febmary 20I I,pp.89肚894 Tbl:+86—55 l一5690963 5690}964基于Andmid平台的实时自适应音频传输技术及其实现 宋冉昕坦,谢维波12 (1.华侨大学计算机科学与技术学院.福建厦『J 361021;2.华侨大学厦门软件周嵌入式技术歼放实验室,福建厦门361008)摘要:随着无线和移动网络的迅速发展,流媒体在嵌入式平台上的应用和发展已日益引起各方面的重视,高质量音频的实时传输作为流媒体的一个重要分支也在不断的发展.然而大多数的应用都是在Pc平台上,随着嵌入式平台的不断发展,流媒体的应用也在逐步迈向嵌入式系统,该文将以当前热门的Android系统为平台,提出一种高质量音频的实时自适应传输解决方案。
关键词:流媒体;音频;实时传输;自适应;嵌入式;Android中图分类号:硼略眇 文献标识码:A 文章编号:l伽19—3044(2011)04_m踟—05Au出o ReaI一蜢me Ada呻ve Tran锄i鹤i佃TeclIllology Based on AndroidSoNG Rajl一姬nlt XIE We卜bo啦(1.Conege of Computer science&Technology,Huaqiao uniVe商cy,Quanzhou 362021,c11ina;2.hboratory of Embedded Techn0109y,xiamen So&ware Park,Huaqiao U11iverSity,Xiamen 361008,C|lim)Abs觚吣t:With the development of the wireleSs and dle mobile net、Ⅳorks,山e s仃eammg media technology on eIll_bedded pla而m hasdrawn the atcendon of most developers.The cransIllission of che王li曲一quality audio inlportam branch h a】so deVeloPillg,however, as an che condnuous development of出e embedded ph面肌,strearning media applicatiolls arernoSt apphcadons are on the Pc pla怕珊.withalso pro铲e妇g towar出e耐bedded systems,This a代icle wm present a solution on lli曲一quality real一石me adapdVeⅡ狮sn血sion b签ed onAndrDid.1【ey woHb:s心盼miIlg media:audio;real~time transnliSsion;adapdve;embedded:
android 近年来.移动网络的发展已进入一个空前活跃的时期,尤其是2009年,国内3G网络的开放大大加速了无线网络的应用和普及。
随着网络的迅速发展,网络中的实时的高质量音频(Audio)传输已日益引起各方的关注,尤其是在嵌入式平台上。
本文将就Andr|Did平台下如何实现高质量音频的实时自适应传输提出一种解决方案。
l A血m柏平台简介1.1 A删Iroid简介 Andmid是G009le于2007年11月05日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
它采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。
底层以UnIl】【内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Libmry和虚拟机Vi咖al M∞hine。
由C++开发。
最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以J时a作为编写程序的主要语言。
目前,Andmid已经进入了自己预定的和谐的发展轨道,逐渐地发展壮大起来,成为了移动及嵌入式平台中一颗璀璨的新星。
1.2 A—阳粗平台应用程序架构 图l为Andmid平台应用程序架构。
Lin呱Kemel:是IJinux Kemel在移动平台的一个移植,它隐藏了硬件、网络等相关的细节,为上层提供了一个相对纯洁的统一接口。
I西瑁ri胎:是一些核心的和扩展的类库,它们都是原生的C++实现。
在这一层。
包含众多开源项目。
如SQ“te、Webl(i£、OpenGL等。
如果,该层类库需要被上层函数调用,就必须要通过肌导出相应的接口函数,否则就只能在层次内部之间调 图1 Android平台应用程序架构收稿日期:2011—01—25基金项目:厦门市科技计划资助项目(3502220083047);厦门市重点产学研项目(厦经技【2009】233一03);福建省自然科学基金资助项 目(201Q『01334)作者简介:宋冉昕(1981一),男,湖南相乡人,硕士,主要研究方向为计算机同络,嵌入式系统;谢堆更(19“一)。
男。
福建采州人,博士, 教授.主要研究方向为信号处理,模式识捌,智能信息处理和嵌入式系统设计研究。
本拦目贾任编辑:唇一东 万方数据第7卷第4期(2011年2月) G唧脂r f(ho刚咖矾d几d们D嘲y电奠知识与技术用。
在此层中。
还有为上层Java程序服务的运行库。
DaIvik虚拟机。
是Andmid的Java虚拟机,之所以不采用J2ME的虚拟机,一方面是因为J2ME的设计是为了低端机器而优化,而Dalvik则是为了高端一些的机器进行优化,提供更好的性能。
j-j一方面,从商业角度来看。
必须绕开J2ME虚拟机,Android才能彻底开源。
Application Fmmework:框架层,这里包含所有开发所用的SDK类库,另外还有一些未公开接口的类库和实现。
它们是整个An.droid平台核心机制的体现。
AppIication:应用层,系统的一些应用和第三方开发的所有应用都是位于这个层次上。
大多数情况下,开发者可以依靠框架层提供的SDK使用Java语育进行应用程序设计.但是在某些特殊情况下。
比如性能优化或者平台移植,这种编程方式便不能满足开发需要。
除了SDK,Andmid还提供了NDK(Native Devel叩ment Kit)。
NDK的出现意味着,最上面应用层的内容,可以穿越J叫a部署的框架层,直接和底层暴露出来的,或者自行开发的C++库直接对话,当然在这些库中需要包含JNI(Java Native Interhce)的接口。
那么Android为什么不直接用C++进行应用开发呢?纯C++应用,在Andmid中是无法被接受的。
因为在Andmid中。
大量的核心机制部署在框架层,它们都是用Java实现的,比如控件库,Activity的调度之类的,没了界面,就没了调度,因此,C++的程序作为类库比较合适。
113JNI技术 Java本地接口(Java Native ln£e如ce(JNl))允许运行在Java虚拟机(Java VinIlal M∽hine(JvM))上的代码调用本地程序和类库,或者被它们调用.这些程序和类库可以是其它语言编写的。
比如C、C++或者汇编语言。
当一个程序无法完全使用Java编写时.开发者可以通过JNI来编写本地方法。
比如标准Java类库并不支持的依赖于平台的特色或者程序库。
jNl还可以用于修改现有的使用其它语言编写的程序。
使它们可以通过Java编写的程序来访问。
很多基本类库都依赖JNI来为开发者和用户提供服务,比如文件的输入,输出和音频功能。
在基本类库中包含的对于性能和平台敏感的API可以允许所有的Java程序以安全和平台无关的方式来使用这些功能。
2程序的构架设计与具体实现2.1需要解决的问囊2.1.1程序的基本框架 考虑到Andmid平台的构架特点,程序将采用Java和嵌入式C混合编程.由于Java语言的虚拟机机制.使其在多媒体编解码运算时无法充分发挥硬件性能.导致运算性能偏低,所以在程序的编解码部分将通过嵌入式C编写库来实现。
程序包含网络传输在内的其他部分将有Java语言完成。
最后通过JNl(Java Native Inter‰e)将C库与Ja”进行衔接。
2.1.2音频质■与编码算法 为确保音频的高质量传输,在编码的选择上,传统的语音音频采用Speech Code如(G.71l,G.723,G.726,G.729,ILBC,QCELP)这些编码格式虽然小巧,但是采样率大多都只有8KH2,处理后对音频损失较大,为实现高质量的语音,可采用Audio C0de如(AAC,OGG,MP3,WMA,SBC等)。
同时。
为了方便针对嵌入式平台运行的调整和优化,在选择编码的时候尽量选择开源项目。
在经过各种测试后,程序决定采用MP3算法作为音频的编解码。
测试过的MP3编解码库主要有以下几个: 编码库: · Shi啪:是一款专为ARM优化的MP3定点编码库,在保证音质可以接受的情况下尽量简化MP3的编码算法。
故它的编码运算速度较快。
音质从测试看来也在可接受的范围内。
BladeEnc:一款跨平台的免费MP3编码库,遵循吼。
速度快。
但不支持定点运算。
Compn∞:是Shi舱针对某移动设备的优化修改版,编码更加简化速度也更快。
解码库: MAD(1ib眦d):是一个开源的高精度MPEG音频解码库.支持MPEG一1(L且yer I,IJByer ll和脚erlII(MP3)。
libmad提供24一bit的PCM输出.完全是定点计算。
未经优化的libmad音质还原很好.但是解码速度稍幔。
因此褥针对平台优化后使用。
ReaI:为32位定点处理器提供高性能的MP3解码支持(仅支持MP3,对MP2和MPl不支持),并且为多种处理器和平台提供了优化配置方案,如(ARM,x86等)。
FFmpeg:开源的跨平台音视频编解码库,为多种平台提供配置编译支持,但由于支持格式众多,需自行分离及编译优化。
。
根据硬件设备及开发环境。
可按需要选取合适的编解码库。
2.1.3传输的实时性 多媒体流的实时传输对带宽和延迟比较敏感,要求有一定服务质量保证(QoS)。
传统的互联协议只能提供尽力而为的服务,对于具有实时性、连续性、交互性的流媒体服务已无法满足需要。
因此.拟采用形限(Real—time’Ihmpot PmtocoI)实时流媒体传输协议进行音频的传输。
RTP报文用来做实时传输时。
可以灵活改变速率、防止乱序。
同时辅以R。
I℃P(Real—timeTm湘potConhd Pmt∞01)协议,其报文在传输过程中可以为RTP数据提供网络状况和服务质量的反馈。
利用础瞳瓜TcP的反馈结果。
设计合适的网络白适应算法计算网络的拥塞程度。
由于And∞.d本身并没有提供对RTP’协议的支持.因此.Java中实现RTP协议传输可以使用开源的Jlibrtp库。
J1|bnp为JavB编写的80啪efb移开源项目,提供了RTP数据包定义,R’rP传输。
及R丁℃P反馈等符合R’rP协议传输规范的大多功能。
2.1.4自适应传输原理与算法 本栏目责任蝙辑:息一乐 万方数据Gc期鹏船聃峥a,ld丁e曲∞坳电■知识‘i技术 第7卷第4期(2011年2月) 考虑到嵌入式设备的性能.网络拥塞算法不应过于复杂,可将网络拥塞算法和音频编码算法相结合,动态调整音频的编码和发送.已达到较为流畅的媒体流,下面为自适应算法原理及简单描述: 由于R砸vRTCP是运行在UDP协议之上的,而UDP是不可靠的协议,它没有’rcP的流量控制等能力,因此常用的算法是基于已丢失报文的评估算法。
数据包丢失率是监控器估计网络信道状况的指标,但不能直接利用丢失率判断网络信道状况并据此调整音频的发送,因为会使发送数据变动得过于频繁.也使接收端的音频产生波动,质量不稳定。
在利用数据包丢失率估计网络信道状况之前,先对其作平滑处理。
f2l 根据平滑后的数据包丢失率与事先确定的阚值的关系,可以判断网络上的负载情况,依此将网络状态分为若干类: 假定暂分为i类(轻载,满载和阻塞),网络状态的分类算法:设定2个阈值kI、l【2(测试给定值)。
平滑后RTP数据包的丢失率为bⅢ。
音频编码算法为A。
,其中i为调整编码的系数,i越大,压缩比越高,对应于三种状态的i值分别为i1<i2<i3。
(i值由实验统计 。
得出),D为网络常规传输速率。
1)当h。
d<k.时,视为轻载; 2)当k.>kl且k。
<k2时,视为满载; 3)当h。
>k2时,视为阻塞。
则自适应算法描述为: if(tfnI<k1) Aml;AIMD(D); else if(kl<k。
o<k2) AI曲;D; else A曲;AIMD(D); 算法中D的增减由AIMD(加性增乘性减)的算法或其优化算法控制。
其算法表述为: fD--却lf轻载 DI 1 Dl ifi献 LDxb{if阻塞 其中a,b均为常数,a>=0;O<b<=l;a,b值由实验统计得出。
此算法可根据网络的实际情况划分为多种状态进行调整。
2.2程序整体架构与实现 程序主要包含i个模块.程序界面.网络收发模块及音频编解码模块。
如图2。
2.2.1开发环境 开发平台:Windows 7企业版;开发IT具:Eclipse+ADT;开发环境:Java 2 SDKver.1.6,Andmid SDK v2.1,Andmid NDK v1.6,Cyg“n(其中Cyg ̄vin和NDK用来构建 图2程序框架图C,C++的交叉编译环境)2.2.2程序 I)MP3编解码库的优化: 嵌入式平台MP3编码库算法的优化根据平台和需求不同.需要做的调整也不一样,一般主要都包含以下几个方面: ①浮点运算改为定点运算:嵌入式平台多数cPu对浮点运算的支持较差或者不支持,因此。
如果选择的编码是浮点的,需要对此部分进行定点改写.否则运算效率将非常低 ②对常用的运算甬数用ARM汇编语言重写:对部分底层常用函数如加减乘除基本运算,用汇编语言改写可提高程序执行效率。
③添加JNI接口.使其可以在Java中调用:自行编写的c或c++库在执行时位于系统库中,不能直接使用,因此在编写优化完库后。
需对其添加JNI接口.以供应用程序穿过框架层直接进行调用。
C库中的JNI接口设计与词用: 在Andro.d的NDK巾提供了完善的JNl支持。
使得在应用程序中,可以使用Java方便的调用Untlx的基础C库,但是首先要对C库进行改写.提供JNI的接入支持。
C库中添加JNl接口: JNIEXPORT jint JNICALL Java-com.codec-mp3dec-Mp3dec-write(JNIEnv掌env’jobject tlliz。
jobjecl inputStIeam, jintlen) l u璐i印ed char.input=(unsi和ed char.) ”明v卜.圯剧Di眦tBu&rAdd煅(env,inputSt删岫));、 m咖孵nr如蕴曲lJf+帕k斌iIIFHltJen); by四+-l舶; 本拦目贲任编辑:唐一东 万方数据第7卷第4期(2011年2月) C佣咧廊r幻静耐哟e and n叫mo锄,电■细识与投术 fiIlSi弛=READBUF-sIzE—byte8kfl; 陀tum疥llsi舱;l J8va中通过JNI调用: st砒ic lSyBlem.10ad“b£Bry(”mp3dec”);1 while∞坩illsi髓O>1024){ buf*0ut=buf玎』8t.takeO; nRead=bu∞ut.1明gtII; inputBu£rer.clea哟; inputBuffer.putpu珏Out); write(inputBu酝,nR朗d);l ,.调用上面C库中定义的write方法·, 2)程序实现的关键类与部分代码示例 图3程序模块结构圈 AudioR∞ord和Audi瓤k类是Andmid获取和播放音频流的重要类.放置在舳dmid.media包中。
该包中还包含Medi且R∞oIder和MediaPl卵er类,这几个类都可实现音频的录制与回放,不同的是AudioRecord和Audi‰k类在获取和播放音频数据流时无需通过文件保存和文件读取,可以动态地直接获取和播放音频流,减少了媒体对于磁盘的读写。
因此非常适合用来实时处理音频数据流。
下面是刨建两个类的对象的具体代码: AudioRecord类: a砌o.iIl-bu压-s泌=AudioR∞ord.getMinBu艉rsize(8000, AudioF哪Iat.CHANNEL-c0N兀GUR^110N—MONO, AudioFo唧aLENCODING-PcM-16Bm; audio_in僦=n删AudioRecord(MediaR鲫lder.Audioso呲e.MIC,80∞。
AudioFc哪l址.C卧NNEL.cONFlGUR枷0N—MONO, AudioE眦棚t.ENCODINGj,cM—16B几 叫dio-i山ubize); AudidTr们k类: 蚰dio珊It-bubize=鲫droid.media.Audi栅眦k.getMinB睡rsize(80吡 AudioFomat.CHANNEILCONFIGURAl舯N.-MONO, Audio】艮舶眦LENCODINGJPcM—16B玎’; audio-.0uU娃=new Audi矽rrack(AudioM捌憎ger.s.rREAM-】ⅥUs】C。
8∞o. AudioFmmm.CHANNEI。
.CONFlGURATION.-MON0. Audio】Fom砒.ENCoDINGJ,cM_16Brr’ audioLouLbuf-8ize,Audi01陆ack.MODE明限EAM); 音频回放与R1【P传输模块示例: pu蛐c“veMP3Play(int卸Pon,im mpPb哟f try l rtpsocl汜t=new Dat8乎锄mSocket(rtp胁I; rtcpsocket=new Dah掣铷nSocke忡pPon); l c8汕①xcep曲n e)l Sy8阳m.叫t.pdnnn(e.tostI主ngo);l rtpse明i∞=腿w RTPse蛔ion(npS们ket’批pS∞ket); rtpSe鹪ion.nai”PktR∞epti∞(tnle); 却‰ion.R1.P鼬斌∞Regi砒e舢iB.n也眦毗 。
Panicip鲫t p=new Panicipant(”10.0.2.2”,16386.16387); rtpse聃ion.addPaIticip蚰t呐;); 产用jIibrtp中的类创建R,I.P连接·, public void runn I if(aAudi01hck02 1=nuU)l aAudi01’mck02.陀len∞0; &Audi‰k02=nuU;} 本拦目责任■辅:瘩一东 万方数据cc拥p蝴I。
鼢舶睁and丁ecflnaIDgy电■知识与技术 第7卷第4期(2011年2月l int iMinB西ize=Au血,Ihck.getlIliIlBu&rsi扯(44100, AudioF0mlat.CHANNEL..cON兀GUR枷0N娜REO, Andio凡蜘laLENCOD矾Gj,CJ旺-16BⅡ); if(iMinBtl母ij游==AudidTr加k.ERROR-BAD.VALUE¨ iMinBu母&ze:=AudioThck.ERROR)f reh姗;} 产构建AudioTrack对象吖 tfy{ aAudioTrack02 = new AudioTrack (AudioM卸ager.SmEAM—MUSIC, 44100,AudioFo册at.CHANNEL-c0NnGURA-110N STERE0,AudioFo肿at.ENCODINtPCM-16B几iMinBufsi孤AudioTrack.MODE—STREAM); 】catch(ⅡlegalA‘guⅡlentExcepIion iae)( myT毛xtView.setl’ext(”new Audio‘I’mck Exceeption:”+iae.toStringO); iae.曲ntstacklhce0;】 try{ while(!stopUve){ Message msPackcount=new MessageO; msPackCount.what=Mp3dec.GUI-I呵0rI’I兀ElLPACK;Mp3dec.t}Iis.myMe鹤ageHandler.sendMessage(msP∽kCount); 遗pktCount>20) I int nRead=O,rec=O; whde(getFillsize0>1024)( bu∞ut=b曲帖s1.1akeO; nRead=bu仃out.1ength; jnputBu舵r.clea啾 inputBu雎r.putOu珏Out); Write(inputB哦r’nRead);l 产将MP3数据写入解码缓冲区+/ rec=read(outputBu珏br); 严解码MP3音频并输出到缓冲区+, outputBun.er.nip0; outputBu‰r.1iIIlit(rec); outputBu珏.er.get(0utputB”e); 叫tputBu如r.clea哟; aAudi01rmck02.write(outputB”e,O,outputByte.1ength); aAudioT‰k02.playO;】1) 产回放解码后的音频数据4, catch(Inte舢ptedException e)I System舢t.prindn(”E聊’眦ed!!!!”); e.printstack仉ceO;l npsession.endS∞si伽O; rtpsocket.closeO; 蹴pS0cke£.c10seO;}}.3结束语 Andmid系统以其自由的开放性及良好的应用程序构架正稳健而迅速地发展着,短短几年时间中运行其上的应用程序已达十万以上.然而在流媒体实时传输方面的应用程序却不多见,随着移动网络的不断发展,流媒体在手机及平板电脑等移动设备上的应用前景显而易见.本文针对Andmid平台的特点,提出了一种高质量音频的实时传输的解决方案.旨在抛砖引玉,共同完善和丰富Android这个开放性平台上的软件应用。
参考文献:【l】葛艳红,李文锋,刘旭光.基于R’rP流媒体实时传输的Jav8实现叨.计算机与现代化,20cr7,2:59_61.f2】高东日,魏海平,姜东.网络白适应传输控制策略研究忉.计算机工程,2006.11(32):14l—143.【3】杜根远,邱颖豫,基于RTP的实时音频传输系统研究叨.徽计算机信息,2006(15):94—96. 本拦目责任冀辑:喜一东 万方数据基于
Android平台的实时自适应音频传输技术及其实现作者: 宋冉昕, 谢维波, SONG Ran-xin, XIE Wei-bo作者单位: 华侨大学计算机科学与技术学院福建厦门361021华侨大学厦门软件园嵌入式技术开放 实验室福建厦门361008刊名: 电脑知识与技术英文刊名: COMPUTER KNOWLEDGE AND TECHNOLOGY年,卷期: 2011074参考文献3条1.杜根远邱颖豫 基于RTP的实时音频传输系统研究期刊
论文-微计算机信息 2006152.高东日魏海平姜东 网络自适应传输控制策略研究期刊
论文-计算机工程 2006323.葛艳红李文锋刘旭光 基于RTP流媒体实时传输的Java实现期刊
论文-计算机与现代化 20072本文链接:http://d.g.wanfangdata.com.cn/Periodical_dnzsyjs-itrzyksb201104072.aspx.