android,视频通话,解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android,视频通话,解决方案篇一:Android平台的JAVA视频通话代码
如何用java代码实现Android的视频通话
最近学习Android平台下跨平台音视频通信开发,尽管网上有很多开源项目供咱们参考学习,但音视频成效很一样,还有很多不稳固的因素,毕竟是开源嘛。
在国内我找到了一个比较好音视频通信解决方案(百度下载官方网站/ Anychat for Android的 demo ),该案例提供了纯Java语言接供词咱们挪用,随后我参照官方android demo程序和开发文档并结合自己的观点写了一个android音频通信软件,200行之内代码就弄定了(难以相信吧)。
其实我只是挪用其相关API即可实现。
以下是我自己写的Java代码,以备大伙儿相互学习:
1. /**
2. * Android视频谈天
3. * 一、初始化SDK 二、连接效劳器、 3、用户登录;4、进入房间;五、打开本地视频;六、请求对方视频
4. */
5. public class VideoChatActivity extends
Activity implements AnyChatBaseEvent
6. {
7. private AnyChatCoreSDK anychat;// 核心SDK
8. private SurfaceView remoteSurfaceView; // 对方视频
9. private SurfaceView localSurfaceView;// 本地视频
10. private ConfigEntity configEntity;
11. private boolean bSelfVideoOpened = false;// 本地视频是不是已打开
12. private boolean bOtherVideoOpened = false; // 对方视频是不是已打开
13. private TimerTask mTimerTask;// 按时器
14. private Timer mTimer = new Timer(true);
15. private Handler handler; // 用Handler来不中断刷新即时视频
16. private List userlist = new ArrayList();//保留在线用户列表
17. private int userid; // 用户ID
18. @Override
19. public void onCreate(Bundle savedInstanceState)
20. {
(savedInstanceState);
(_video_chat);
= (SurfaceView) findViewById(_remote);
= (SurfaceView) findViewById(_local);
= (this);//加载视频通话设置
();// 初始化SDK 连接效劳器
= new TimerTask(){
28. public void run(){
29. Message mesasge = new Message();
30. (mesasge);
31. }
32.};
(mTimerTask, 1000, 100);
= new Handler(){
35. @Override
36. public void handleMessage(Message msg){
37. VideoChat();// 不中断显示即时视频通话画面
38. (msg);
39. }
40.};
41. }
42. // 初始化SDK 连接效劳器
43. private void loginSystem(){
(anychat == null){
45. anychat = new AnyChatCoreSDK();
46. (this);// 设置大体事件回调函数
47. if ( != 0) // 利用ARMv6指令集
48. (AnyChatDefine.
49. BRAC_SO_CORESDK_USEARMV6LIB, 1);
50. (_INT, 0); // 初始化SDK
51.}
("", 8906);// 连接效劳器
53. }
54. // 显示即时视频通话画面
55. public void VideoChat(){
(!bOtherVideoOpened){
57. if ((userid) == 2
58.&& (userid) != 0){
59. SurfaceHolder holder = ();
60. (_565);
61. ((userid),
62. (userid));
63. Surface s = ();// 取得视频画面
64. (userid, s, 0, 0, 0, 0); // 挪用API显示视频画面
65. bOtherVideoOpened = true;
66. }
67.}
(!bSelfVideoOpened){
69. if ((-1) == 2
70.&& (-1) != 0){
71. SurfaceHolder holder = ();
72. (_565);
73. ((-1),
74. (-1));
75. Surface s = ();
76. (-1, s, 0, 0, 0, 0);
77. bSelfVideoOpened = true;
78. }
79.}
80. }
81. public void OnAnyChatConnectMessage(boolean bSuccess){
(!bSuccess){
83. (, "连接效劳器失败,自动重连,请稍
后...", _SHORT).show();
84.}
("android", "");// 效劳器连接成功用户登录
86. }
87. public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){
(dwErrorCode == 0) {
89. (this, "登录成功!", _SHORT).show();
90. (1, "");// 用户登录成功进入房间
91. ApplyVideoConfig();
92.} else {
93. (this, "登录失败,错误代码:
" + dwErrorCode, _SHORT).show();
94.}
95. }
96. public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
(dwErrorCode == 0) {// 进入房间成功打开本地音视频
98. (this, "进入房间成功", _SHORT).show();
99. (-1, 1); // 打开本地视频
100. (-1, 1); // 打开本地音频
101.} else {
102. (this, "进入房间失败,错误代码:
" + dwErrorCode, _SHORT).show();
103.}
104. }
105. public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){
(dwRoomId == 1){
107. int user[] = ();
108. if ( != 0){
109. for (int i = 0; i (user[i]+"");
111. }
112. String temp =(0);
113. userid = (temp);
114. (userid, 1);// 请求用户视频
115. (userid, 1); // 请求用户音频
116. }
117. else {
118. (, "当前没有在线用户
", _SHORT).show();
119. }
120.}
121. }
122. public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){
(bEnter) {//新用户进入房间
124. (dwUserId+"");
125.}
{ //用户离开房间
127. if (dwUserId == userid)
128. {
129. (, "视频用户已下线
", _SHORT).show();
130. (userid, 0);// 关闭用户视频
131. (userid, 0); // 关闭用户音频
132. (userid+""); //移除该用户
133. if (() != 0)
134. {
temp =(0);
= (temp);
(userid, 1);// 请求其他用户视频 (userid, 1); // 请求其他用户音频 139. }
140. }
141. else {
142. (dwUserId+""); //移除该用户
143. }
144.}
145. }
146. public void OnAnyChatLinkCloseMessage(int dwErrorCode){
(, "连接关闭,error:
" + dwErrorCode, _SHORT).show();
148. }
149. @Override
150. protected void onDestroy(){ //程序退出
(-1); //离开房间
(); //注销登录
();//释放资源
();
();
156. }
157. // 依照配置文件配置视频参数
158. private void ApplyVideoConfig(){
( == 1) // 自概念视频参数配置
160.{
161. // 设置本地视频编码的码率(若是码率为0,那么表示利用质量优先模式)
162. (_SO_LOCALVIDEO_BITRATECTRL,configEn
);
163. if ( == 0)
164. {
165. // 设置本地视频编码的质量
166. (_SO_LOCALVIDEO_QUALITYCTRL,conf
);
167. }
168. // 设置本地视频编码的帧率
169. (_SO_LOCALVIDEO_FPSCTRL,configEntity
.videoFps);
170. // 设置本地视频编码的关键帧距离
171. (_SO_LOCALVIDEO_GOPCTRL,configEntity
.videoFps * 4);
172. // 设置本地视频搜集分辨率
173. (_SO_LOCALVIDEO_WIDTHCTRL,configEnti
_width);
174. (_SO_LOCALVIDEO_HEIGHTCTRL,configEnt
_height);
175. // 设置视频编码预设参数(值越大,编码质量越高,占用CPU资源也会越高)176. (_SO_LOCALVIDEO_PRESETCTRL,configEnt
);
177.}
178.// 让视频参数生效
(_SO_LOCALVIDEO_APPLYPARAM,configEntity.
configMode);
180.// P2P设置
(_SO_NETWORK_P2PPOLITIC,
bleP2P);
182.// 本地视频Overlay模式设置
(_SO_LOCALVIDEO_OVERLAY,
eoOverlay);
184.// 回音排除设置
(_SO_AUDIO_ECHOCTRL,
EC);
186.// 平台硬件编码设置
篇二:即时通信电话音视频技术开发方案
“SDK即时通信平台”是一套跨平台的即时通信解决方案,基于先进的视频编码标准、AAC音频编码标准与P2P技术,支持高清视频,整合了佰锐科技在音视频编码、多媒体通信领域领先的开发技术和丰硕的产品体会而设计的高质量、宽适应性、散布式、模块化的网络音视频互动平台。
“SDK即时通信平台”包括了音视频处置模块(搜集、编解码)、流媒体治理模块(丢包重传、抖动滑腻、动态缓
冲)、流媒体播放模块(多路混音、音视频同步)和P2P网络模块(NAT穿透、UPnP支持、IP组播支持)等多个子模块,封装了底层的硬件操作(音视频搜集、播放)、封装了流媒体处置(编解码、网络传输)等超级专业和复杂的技术,为上层应用提供简单的API操纵接口,能够在极短的开发周期,和极少的人力资源投入下为客户的现有平台增加音视频即时通信、多方会议的功能。
“SDK即时通信平台”分为客户端SDK和效劳器SDK两大部份,其中客户端SDK用于实现语音、视频的交互和其它客户端相关的功能,而效劳器SDK要紧实现业务层逻辑操纵,和与第三方平台的互联等。
客户端SDK和效劳器SDK均支持C++、C#、和Delphi等开发语言。
通过“SDK即时通信平台”,能够开发具有企业特色的即时通信系统、视频游戏系统、视频会议系统、网络教学系统、语音视频谈天系统、专家咨询平台和政府应急指挥平台等,系统的功能、界面完全由企业定制。
AnyChat是国内知名音视频互动开发平台,经太长达九年之久的普遍应用和复杂化环境的检测, SDK系统在兼容性、平安性、稳固性、易用性方面具有较高的声誉。
该SDK是佰锐科技全力打造的核心产品.
SDK电话视频开发包是面向集成或软件开发商利用,用
于开展电话视频相关的产品开发和系统集成。
开发包提供电话端音视频搜集、编码、紧缩、音视频传输等功能;通过与后端效劳器对接,优先P2P通信,实现电话视频即拍即传、电话视频直播,电话视频录制和电话视频通话。
当前电话视频SDK开发包支持iOS和Android平台。
. 提供电话视频搜集直播的开发接口
通过视频参数设置接口,设置拍照视频的分辨率、编码方式、码流、媒体流类别等通过视频拍照,实现视频的搜集,编码和传输
·提供语音、文字通信接口
·提供视频录制接口,包括本地视频录制
·提供文件传输接口
. 支持跨平台通信,可与windows,web ,Linux完美互联互通
·提供透明通道,实现特殊功能
一、拓扑结构图:
拓扑名词解析:
( 1)、中心效劳器:要紧负责效劳器集群的治理,
负载均衡,任务(转载于: 小龙文档网:android,视频通话,解决方案)调度等任务,同时还负责与业务层效劳器进行交互,将"AnyChat 即时通信平台"的用户相关请求传递给业务效劳器进行处置,并将处置结果反馈给对应的用户,起中间桥梁作用。
( 2)、业务效劳器:采纳"AnyChat Server SDK"开发的独立效劳器,负责整个系统业务流程的治理,包括用户身份鉴权认证和业务流的操纵等,起到与第三方系统互联互通的桥梁作用。
( 3)、房间效劳器:负责处置终端用户在房间内的相关任务请求,转发流媒体数据,协助用户之间 P2P 穿透。
房间效劳器可动态增、减,当新的房间效劳器向中心效劳器注册成功以后,中心效劳器的负载均衡机制便会将部份用户的请求挪用给新加入的房间效劳器处置,减轻其它房间效劳器的压力。
( 4)、PC 用户:运行 ANYCHAT 客户端软件,提供二次开发接口(SDK),软件界面可由用户自行开发,支持多种开发语言,包括 Java、VC++、Delphi、、C#等,封装为 ActiveX 插件以后能够集成到 IE 阅读器进行访问。
( 5)、移动智能终端用户:目前支持嵌入式 Linux、Android、IOS 等平台,提供二次开发接口(SDK),实现跨
平台访问,同时可与硬件平台紧密结合,实现硬件的编码、解码(需要依照具体的硬件进行定制开发),默许采纳软件方式进行编码与解码。
二、相关技术指标:
视频编码器 AVC
视频分辨率(*) 160×120 — 1280×1024(可动态调剂)
视频帧率 1 — 30 fps(可动态调剂)
音频编码器AAC、AMR-WB、SPEEX、CELT
音频采样率8000 Hz ~ 44100 Hz
音频采样声道 Mono、Stereo
目标码率音频:8kbps - 128kbps (可动态调剂)
视频:10kbps - 10Mkbps(可动态调剂) P2P UDP over NAT、TCP over NAT
UPnP
传输协议RTP/RTCP(RFC 3550/3551 (IETF SIDD0064/0065) RTSP(RFC2326)
语音增强处置回音排除(AEC)
噪音抑制(NS)
自动增益(AGC)
静音检测(VAD)
支持的操作系统 WindowsXX/XX/XP/Win 7,win 8 等兼容32bit、64bit Linux Ubuntu、RedHat、CentOS等,兼容32bit、64bit
Android // 等
/// 等
音视频延迟指标(*) 网络状态较好时(无丢包,网络延迟网络状态较差时(丢包率网络状态很差时(丢包率中心效劳器集群治理能力>=2048 台
房间最大并发用户数 800 用户/房间
房间效劳器最高并发 5000 用户/服器
P2P 连接成功率(*) 局域网:100%
互联网:>=82%
* 音视频相关参数与硬件相关;
* 音视频延迟指标为发言模式下的测试值,如采纳放歌模式,那么内核为了保障播放的流畅
性,会适当增加缓冲区大小,致使延迟增大; * P2P 连接成功率为综合网络测试平均值
篇三:开源音视频通话比较
最新要做一个移动端视频通话软件,大致看了下现有的开源软件
一) sipdroid
1)架构
sip协议栈利用JAVA实现,音频Codec利用skype的silk(Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器)实现。
NAT传输支持stun server.
2)优缺点:
NAT方面只支持STUN,无ICE框架,如需要完全实现P2P视频通话需要实现符合ICE标准的客户端,音频方面没看到AEC等技术,视频方面还不是太完善,目前只看到挪用的是系统自带的MediaRecorder,并无自己的第三方音视频编解码库。
3)实际测试:
基于sipdroid架构的话,咱们要做的工作会比较多,
(ICE支持,添加回音排除,NetEQ等gips音频技术,添加视频硬件编解码codec.),因此就不做测试了。
二) imsdroid
1)架构:
基于doubango(Doubango 是一个基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架。
该框架利用ANSCI-C编写,具有专门好的可移植性。
而且已经被设计成超级轻便且能有效的工作在低内存和低处置能力的嵌入式系统上。
苹果系统上的idoubs功能确实是基于此框架编写) .音视频编码格式大部份都支持(H264(video),VP8(video),iLBC(audio),PCMA,PCMU,G722,G729)。
NAT支持ICE (stun+turn)
2)成效实测
测试环境:公司局域网内两台机械互通,效劳器走外网sip2sip
第一次测试:音频质量能够,可是AEC打开了仍是有点回音(应该能够修复)。
视频马赛克比较严峻,延迟1秒左右。
第二次测试:音频质量能够,大体无回音,视频无马
赛克,大体无延迟(低于1秒)。
3)优缺点
imsdroid目前来讲仍是算比较全面的,包括音视频编解码,传输(RTSP,ICE),音频处置技术等都有涉猎。
doubango 利用了webrtc的AEC技术,可是其挪用webrtc部份没有开源,是用的编译出来的webrtc的库。
若是要改善音频的话不太方便,Demo的音视频成效还能够
三)csipsimple
1)sip协议栈用的是pjsip,音视频编解码用到的第三方库有ffmpeg
(video),silk(audio),webrtc.默许利用了webrtc 的回声算法。
支持ICE协议。
2)优缺点:
csipsimple架构比较清楚,sip协议由C实现,java 通过JNI挪用,SIP协议这一块会比较高效。
其VOIP各个功能也都具有,包括NAT传输,音视频编解码。
而且该项目跟进新技术比较快,官方活跃程度也比较高。
若是做二次开发能够推荐那个。
3)实测成效
测试环境:公司局域网内两台机械互通,效劳器走外网sip2sip
音频质量能够,无明显回音,视频需要下插件,马赛克比imsdroid更严峻。
四)Linphone
那个是老牌的sip,支持平台普遍windows, mac,ios,android,linux,技术会比较成熟。
可是据玩过的同事说linphone在Android上的bug有点多,由于其代码实在庞大,因此我临时舍弃考虑Linphone.只是若是谁有跨平台的需要,能够考虑Linphone或imsdroid和下面的webrtc.。
仿佛此刻开源软件都跨平台了。
五) webrtc
imsdroid,csipsimple,linphone都方式设法挪用webrtc的音频技术,本人也测试过Android端的webrtc内网视频通话,成效比较中意。
可是要把webrtc做成一个移动端的IM软件的话还有一些路要走,只是webrtc大体技术都已经有了,包括p2p传输,音视频codec,音频处置技术。
只是其因为目前仅支持VP8的视频编码格式(QQ也是)想做高清视频通话的要注意了。
VP8在移动端的硬件编解码支持的平台没几个(RK能够支持VP8硬件编解码)。
只是webrtc
代码里看到能够利用外部codec,那个仍是有希望调到H264的。
总结:sipdroid比较轻量级,着重基于java开发(音频codec除外),由于其音视频编码和P2P传输这一块略显不足,不太好做定制化开发和优化。
imsdroid,遗憾确实是直接挪用webrtc的库,而最近webrtc更新的比较频繁,开发比较活跃。
若是要自己在imsdroid上更新webrtc担忧兼容性问题,希望imsdroid能够直接把需要的webrtc相关源码包进去。
csipsimple的话,都是围绕pjsip的,webrtc 等都是以pjsip插件形式扩充的,类似
gstreamer. webrtc若是有技术实力的开发公司个人仍是感觉能够选择那个来做,一个是
google的缘故,一个是其视频通话相关关键技术都比较成熟的缘故。
个人感觉若是能做出来,成效会不错的。