达达麻将语音聊天源码分析
达达麻将版图
语音聊天
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{