cocos creator麻将教程系列(八)—— 达达麻将语音聊天源码分析

达达麻将语音聊天源码分析

达达麻将版图

 

语音聊天

1:语音聊天只支持Native平台,iOS与android;

2: 语音聊天的音频格式为amr;

3: native平台实现了语音的录制和播放,可以移植到其他项目使用,代码放在native文件夹下;

 

录制流程

1:按钮在代码里面监听START与Ended事件开始和结束录音;  Voice.js

2: VoiceMgr.js: 封装了android/IOS native平台的调用;

3: cc.vv.voiceMgr.prepare("record.amr");开始录制;      

1>暂停所有的游戏音效与音乐;      

2>清理掉原来录制的文件;      

3>调用native 平台的开始录制函数;

4:Ended事件响应:      

1>判断录音是否超过10S,没有超过取消;      

2>cc.vv.voiceMgr.cancel() --> 调用到native平台 cancel;      

3>cc.vv.voiceMgr.realease() --> 调用native平台,录制完成;      

4>getVoiceData: 将录制好的二进制文件转换成文本编码;      

5>发送音频文本数据给游戏服务器: voice_msg事件;

 

 

播放流程

1:服务器收到 voice_msg事件;

2: 将语音数据在房间广播:voice_msg_push事件;

3: GameNetMgr.js-->收到voice_msg_push事件,然后派发voice_msg;

4: MJRoom.js-->playVoice;

5: cc.vv.voiceMgr.writeVoice(msgfile,msgInfo.msg); 将受到的数据写入声音文件;

6: 播放声音文件cc.vv.voiceMgr.play(msgfile),调用本地接口;

7: update函数里面检车播放时间是否到,调用onPlayerOver到了以后继续恢复原来的游戏音效;

8:优点: native平台下的录音和播放代码是直接可以使用的;

有带改进的地方:音频数据比较大,建议不要走游戏的长连接,阻塞游戏数据通道(广播),可以改成独立的http上传和下载,然后房间里面只广播xxxx说了话;

在Voice.js中发现按钮

监听的事件:

btnVoice.on(cc.Node.EventType.TOUCH_START,function(){

 btnVoice.on(cc.Node.EventType.TOUCH_END,function(){

btnVoice.on(cc.Node.EventType.TOUCH_CANCEL,function(){

onLoad: function () {
        
        this._voice = cc.find("Canvas/voice");
        this._voice.active = false;
        
        this._voice_failed = cc.find("Canvas/voice/voice_failed");
        this._voice_failed.active = false;
        
        this._timeBar = cc.find("Canvas/voice/time");
        this._timeBar.scaleX = 0.0;
        
        this._volume = cc.find("Canvas/voice/volume");
        for(var i = 1; i < this._volume.children.length; ++i){
            this._volume.children[i].active = false;
        }
        
        var btnVoice = cc.find("Canvas/voice/voice_failed/btn_ok");
        if(btnVoice){
            cc.vv.utils.addClickEvent(btnVoice,this.node,"Voice","onBtnOKClicked");
        }
        
        var self = this;
        var btnVoice = cc.find("Canvas/btn_voice");
        if(btnVoice){
            btnVoice.on(cc.Node.EventType.TOUCH_START,function(){
                console.log("cc.Node.EventType.TOUCH_START");
                cc.vv.voiceMgr.prepare("record.amr");
                self._lastTouchTime = Date.now();
                self._voice.active = true;
                self._voice_failed.active = false;
            });

            btnVoice.on(cc.Node.EventType.TOUCH_MOVE,function(){
                console.log("cc.Node.EventType.TOUCH_MOVE");
            });
                        
            btnVoice.on(cc.Node.EventType.TOUCH_END,function(){
                console.log("cc.Node.EventType.TOUCH_END");
                if(Date.now() - self._lastTouchTime < 1000){
                    self._voice_failed.active = true;
                    cc.vv.voiceMgr.cancel();
                }
                else{
               
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值