语音聊天方案调研

日期:2016-5-6 13:51 | 标签: cordova | 阅读:937

最近有一个做语音聊天的需求。由于网上没有现成的案例,自己就试着从以下几方面来实现了。我自己设想的几种方案如下:

  1. 网上有Android的现成实现,何不直接封装成一个cordova插件,但是不支持ios
  2. 借助于第三方平台,如firebase等,但是限制多,数据不安全。
  3. 使用现有Cordova插件,但是支持有限,大部分都要自己实现

录音方案

实现录音的方案有两个

  1. 借助cordova-plugin-media
    好处是可以灵活控制录音时间。设想我们可以手指按下时进行录音,松开是发送语音。有些Api只支持单个平台,需要留意文档说明,涉及到的一些api

    • media.getCurrentAmplitude,录音是获取声音幅度
    • media.getCurrentPosition,播放是获取进度
    • media.getDuration,获取总长度
  2. 借助capture.captureAudio 可以指定路径,但是必须提前设置好录音时间,比如秒拍设置的时间为10s。使用方式如下

    var success= function(cb) {
       $scope.sound.file = cb[0].localURL;
       $scope.sound.filePath = cb[0].fullPath;}
    $scope.record = function() {
       navigator.device.capture.captureAudio(success,error,{duration:10});}
    

    在上段代码我们已经保存了文件存放路径,播放可以借助Media插件实现

    $scope.play = function() {
     if(!$scope.sound.file) {
         navigator.notification.alert("请录音先!.", null, "error"); return;}
     var media = new Media($scope.sound.file, function(e) {
         media.release();}, function(err) {
         console.log("出错了:", err);});
     media.play();}
    

    事实上e[0].localURL实际上是临时路径,如图 localurl
    插件capture.captureAudio有没有提供修改路径的接口,oh!最终我们还得依靠操作文件系统来解决问题了。
    参考1:recording-and-saving-audio-in-cordova-applications_by_raymondcamden

媒体文件上传

媒体文件上传需要做两方面工作

  1. 将媒体文件保存至服务端
  2. 尽量做到不延迟

文件传输实现方案大概有三个

  1. 直接使用socket.io
  2. 使用cordova的文件传输Api
  3. 使用第三方平台(融云)

媒体播放

使用插件: cordova-plugin-media
假设媒体文件位于www目录下,调用方式如下

var media = new Media("path/to/myrecording.mp3", null, error);
media.play();

安卓的路径处理稍微有些不同,可以通过以下代码处理路径

function getMediaURL(path) {
    if(device.platform.toLowerCase() === "android") {
        return "/android_asset/www/" + path;}
    return path;
}

参考1: https://www.raymondcamden.com/2014/06/23/Cordova-Media-API-Example/
参考2: 融云cordova demo

交互方式

现在的想法是按照微信来做,可能需要写点AngularJS指令了!还好有现成的案例可以改造,虽然不完整,但总比没有好。

难点

  1. 路径问题
  2. 云端处理问题
  3. 网速问题
  4. 考虑第三方平台的缺陷

研究过的一些库

这些库要么就是收费要么就是过时,要么就是平台不符合要求。

  1. projectTox 是一款集文字聊天、语音通话及视频电话于一身的即时通信软件, 其特色是通过采用加密算法来保护用户的隐私,从而有效避免来自政府的网 络监视。【就是不支持JS】
  2. subrosa
    支持语音,就是官网打不开,而且只有web版
  3. oneteam
    功能复杂,只有桌面版貌似
  4. Telegram
    功能复杂,靠服务端抓钱

可选方案

  1. 基于cordova 可能的缺陷:

    1. 是否是个锤子,看什么都是钉子?
    2. 交互很难做,而且做不到Android现有交互
    3. 除开交互,其它事项也是一大摊子
    4. 时间太紧太紧了!

    优势:

    1. 确实可以跨平台,安卓的必须封装为插件才行,这插件估计也不好做啊!
    2. 有现有技术积累
  2. 基于云服务,如

    • 科大讯飞 [支持语音识别、人脸识别,暂时没提钱的事]
    • 腾讯云通信42 * x,x指月最高同事通话人数
    • 融云,基本功能免费,只是历史消息存储得收费!支持cordova,还有案例代码,are you kidding 么!!只是不知道这种做法稳妥不?
  3. 自己整,封装为插件[待究]

  4. 全包第三方,价格贵得有点离谱啊,如以下这家还只维护三个月(百度推荐):
    http://www.shiku.co/price.html

最终方案

服务端基于融云,客户端自己开发,语音/视频通话自己开发(基于phonertc,只需要一个基于socket.io的中转服务端就行),哦,还得装一个turn server实现转发。

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式