做移动端视频通话软件,大致看了下现有的开源软件(转)

转自:链接

 

要做一个移动端视频通话软件,大致看了下现有的开源软件

一) 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秒左右。
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的原因,一个是其视频通话相关关键技术都比较成熟的原因。个人觉得如果能做出来,效果会不错的。

转载于:https://www.cnblogs.com/YangBinChina/p/4308025.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wamp环境搭建到mysql就不成功_Wamp环境搭建常见错误问题解决

第一点、对于apache php mysql 的版本的正确选择问题:网上有些教学视频已经很早了,然后很多人照着来,完全和视频里讲的一样,但是结果就是搭建不成功。出现问题原因:三件套的版本选择不正确,比如有的php版…

前端学习(1373):构建模块化路由2

demo37.js const express require(express);const app express(); const home require(./home); const admin require(./admin);app.use(/home, home); app.use(/admin, admin);app.listen(3000); console.log(服务器启动成功); home.js const express require(express…

WebApi权限验证流程的设计和实现

前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个功能复杂的业务应用系统,通过角色授权来控制用户访问,本文通过Form认证,Mvc的Controller基类及Action的权限验证来实现Web系统登录&am…

前端学习(1374):express参数中get参数的获取

const express require(express);const app express(); app.get(index, (req, res) > {res,end(req.query); })app.listen(3000); console.log(服务器启动成功); 运行结果

mysql二维数据转一维存_二维数组转一维数组

//二维转一维var arr[[1,2,3],[2,5,6,7],[234,234,545]]function dir(arr) {var result[];for(var r0;rfor(var c0;cresult.push(arr[r][c])}}return result;}console.log(dir(arr))//方法二function dir2(arr) {var result[];for(var r0;rresultresult.concat(arr[r])}return …

前端学习(1375):express参数中post参数的获取

demo39.js const express require(express);const app express(); const bodyParser require(body-parser); //拦截所有请求 //extends:true 方法内部使用第三方模块请求的参数 app.use(bodyParser.urlencoded({ extends: false }))app.post(/add, (req, res) > {res.se…

iOS开发那些悲剧的事儿

一丶百度地图,百度导航开发中的问题: 1,开启引擎的时候,会再沙盒中自动生成一些二进制文件. 不符合苹果储存规则; 解决:将文件手动写入Cache, iCloud Drive 对于 iOS 8 和 OS X Yosemite ,苹果决定采用比较常规的做法,也是 4 亿多 iCloud 用户一直想要的…

javascript乘法和加法_js 大整数加法、乘法、除法

有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作。接下来我将演示大整数的…

前端学习(1376):app.use方法

const express require(express);const app express(); const bodyParser require(body-parser); //拦截所有请求 //extends:true 方法内部使用第三方模块请求的参数 app.use(fn({ a: 1 }));function fn(obj) {return function(req, res, next) {if (obj.a 1) {console.log…

c treelist绑定mysql_TreeList 绑数据

try{RestService service new RestService();List categories service.SelectGoodsCategory(this.Login.Storeguid);if (categories ! null){TreeNode root new TreeNode(this.Login.StoreName);foreach (UMS_BASE_出品类别表 item in categories){if (categories.Contains(…

websocket + node.js聊天系统

转:http://www.cnblogs.com/Wayou/p/hichat_built_with_nodejs_socket.html 前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术。像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端。…

前端学习(1377):express路由参数

const express require(express);const app express(); const bodyParser require(body-parser); //拦截所有请求 //extends:true 方法内部使用第三方模块请求的参数app.get(/index/:id, (req, res) > {res.send(req.params); }) app.listen(3000); console.log(服务器启…

java桥_java 泛型--桥方法

因为 java 在编译源码时, 会进行 类型擦除, 导致泛型类型被替换限定类型(无限定类型就使用 Object). 因此为保持继承和重载的多态特性, 编译器会生成 桥方法.本文最后附录所有源码.Pair 是个泛型类, 它具有泛型方法 setSecond(T second),在经过编译时的 类型擦除 后变为 setSec…

前端学习(1378):express静态资源处理

const express require(express); const pathrequire(path); const app express();app.use(express.static(path.join(__dirname))) app.listen(3000); console.log(服务器启动成功);

json字符串生成C#实体类的工具

转载:http://www.cnblogs.com/finesite/archive/2011/07/31/2122984.html json作为互联网上轻量便捷的数据传输格式,越来越受到重视。但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率。JSON C# Class Generator 能将json格式所表示的J…

java 栈 泛型_java 泛型栈(数组实现) | 学步园

尝试将一些数据结构用java实现,尝试过程中确实碰到一些问题,收获很大import java.lang.reflect.Array;class ArrayStack {Class type;private T[] values;private int maxSize;private int top;public ArrayStack(Class type, int maxSize) {this.type …

移动web资源整理

2013年底接触移动端,简单做下总结,首先了解下移动web带来的问题 设备更新换代快——低端机遗留下问题、高端机带来新挑战浏览器厂商不统一——兼容问题多网络更复杂——弱网络,页面打开慢低端机性能差——页面操作卡顿HTML5新技术多——学习成…

《Python核心编程》笔记 Python对象

1、Python对象 Python使用对象模型来存储数据,构造任何类型的值都是一个对象。所有的对象都有三个特性: 身份,可通过内建函数id()查看,这个值即该对象的内存地址。类型,可通过内建函数type()查看。值,对象表…

前端学习(1382):多人管理项目2案例初始化

blog.js const express require(express);const app express();const home require(./homegeyao); const admin require(./admingeyao);app.use(/home, home); app.use(/admin, admin); app.listen(3000);console.log(服务器启动成功); admingeyao.js //管理页面 //展示…