博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多条语音消息合成一整条连续播放与进度条功能技术点!
阅读量:6568 次
发布时间:2019-06-24

本文共 4966 字,大约阅读时间需要 16 分钟。

多条语音汇成一整条开发

最近在做一个多条语音合成一整条语音并且结合进度条可以快进或者后退功能,功能不复杂,但是所遇到的坑不少,所以我就想着把我遇到的坑写下来,希望以后有用到的小伙伴们可以少走点弯路:

项目原型图片

功能技术点


  • 多条语音连续播放;
  • 暂停或者继续播放;
  • 进度条与时间动画;
  • 拖拽小按钮可以快进或者后退并且定位到相对应语音秒数;

html+css代码:            
//第一步:首先加载一个微信JS-SDK

js代码数组结构:{    "id":299,    "userId":22,    "fileUrl":url,    "seconds":13//每条语音的时间长度}//请求语音数组var result = res.result;//语音总长度var voiceLength = 0;//语音对象的秒数var voiceSecond = 0;//进度条动画var progress;//进度条长度var width = $(".control-bar").width();//拖拽时需要减去左边距,由于我的进度条长度为70%,所以marginleft值为body宽的百分15var marLeft = $("body").width()*0.15;//语音播放到多少秒用于寻找对应的语音消息var currentVoiceLeg = 0;//语音位置,单位百分比var voicePosition;//定义移动值var moveleft = 0;//语音开始播放位置var startSeconds = 0;//语音是否在播放var isPlay = false;//是否结束var isOver = true;for(var i=0;i
=parseInt(width)-10){//拖拽块的left值最大是拖拽区的width减去拖拽块的width; voicePosition = 100; moveleft = parseInt(width)-10; } setProgressBar(btnId,progId,voicePosition+"%"); }; },false); btn.addEventListener("touchend",function(evt){ isPlay = false; currentVoiceLeg = Number(voicePercent*voicePosition); findCurrentVoice(result); $(".voice-currtTime").text(getVoiceTime(currentVoiceLeg)); },false);};/* * 动态设置拖拽元素left 和进度条长度 * @param string btnId拖拽元素id值 * @param string progId进度条id值 * @param string value需要设置的值 */function setProgressBar(btnId,progId,value){ $("#"+btnId).css('left',value); $("#"+progId).width(value);};/* * 匹配对应的语音消息并且快进 *///当前语音消息下标var currtIndex = 0;function findCurrentVoice(arry){ for(var i =0;i
= currentVoiceLeg){ startSeconds = Number(currentVoiceLeg - arry[i].startLength); var src = arry[i].fileUrl; currtIndex =i; playAudio(startSeconds,currtIndex,arry); break; }; };};/* * 播放动画 * btnId 动画按钮id * progId 进度条动画id */function setIntVoice(btnId,progId){ if(!isPlay){ progress = setInterval(function(){ moveleft+=secondNum; currentVoiceLeg+=1; voicePosition = moveleft/width*100; if(currentVoiceLeg>=voiceLength&&isOver){ voicePosition = 0; moveleft = 0; currentVoiceLeg =0; controlAudio(); }; $(".voice-currtTime").text(getVoiceTime(currentVoiceLeg)); setProgressBar(btnId,progId,voicePosition+"%"); },1000); } };/* * 播放声音函数 * @param string src 播放地址 * @param string num 播放声音的位置(秒) *///当前语音下标 var currntNum;function playAudio(num,index,arry){ isOver = false; var src = arry[index].fileUrl; currut_audio.src = src; currut_audio.load(); currntNum = index; var audioState = setInterval(function(){ if(currut_audio.readyState>1){ currut_audio.currentTime = num; currut_audio.play(); controlAudio(); clearInterval(audioState); }; },100) currut_audio.addEventListener("error", function (e) { alert('亲,网络有延迟,请稍后重试!'); }); };//监听语音播放事件currut_audio.addEventListener("play", function () { isPlay = true;}, false);//暂停currut_audio.addEventListener("pause", function () { isPlay = false;}, false);//停止 currut_audio.addEventListener("ended", function () { startSeconds = 0; //播放完成后切换音频 currtIndex+=1; if(currtIndex<=result.length-1){ currentVoiceLeg = result[currtIndex].startLength; playAudio(startSeconds,currtIndex,result); }else{ startSeconds = 0; currtIndex = 0; isOver = true; isPlay = false; } }, false);//控制界面交互,定时器function controlAudio(){ clearInterval(progress); if(!isPlay&&!isOver){ $(".on-log").addClass("btn-pause").removeClass("btn-play").attr("data-log","暂停"); if(currentVoiceLeg != 0){ currut_audio.play(); }; setIntVoice("slider","playing-bar"); }else{ $(".on-log").addClass("btn-play").removeClass("btn-pause").attr("data-log","播放"); clearInterval(progress); currut_audio.pause(); }};//点击播放按钮$(".on-log").on("click",function(){ if(isOver){ isOver = false; playAudio(startSeconds,currtIndex,result); }else{ controlAudio(); }});
代码稍微有点乱,主要是供大家参考一下实现的思想,如果哪里不足也请大家多多指教!

需要注意的地方:

  1. ios给audio设置currentTime需要等待语音资源加载完成,查了很多资料发现只有设置定时器判断audio 的readyState方案兼容性相较好;
  2. audio在微信浏览器与ios或者一些安卓浏览器不会自动播放,涉及到流量问题,微信浏览器调用wx.ready方法达到自动播放效果;
  3. 连续播放时,播放完当前播放下一条时会有一定资源加载时间,导致最后时间会多出几秒。解决方案:当播放下一条语音时获取之前语音累计所加时间,重新设置定时器开始时间;

H5有些方法兼容性还是有待提高!!!


转载地址:http://efvjo.baihongyu.com/

你可能感兴趣的文章
第一次作业-准备篇
查看>>
cnzz统计代码引起的Bad Request - Request Too Long
查看>>
MinGW安装与使用简介
查看>>
Sublime Text 3 遇到的一些小坑的解决方法
查看>>
JSP之9大对象
查看>>
sql 递归查询
查看>>
KMP C++
查看>>
HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)
查看>>
HTTP响应状态码
查看>>
crushmap磁盘智能分组
查看>>
《算法导论》读书笔记--第三章 函数的增长
查看>>
《利用python进行数据分析》读书笔记--第八章 绘图和可视化
查看>>
栈的操作
查看>>
Flask 备注一(单元测试,Debugger, Logger)
查看>>
ElasticSearch(八):springboot集成ElasticSearch集群并使用
查看>>
Java基础学习_01 概述及环境配置
查看>>
20165239其米仁增3
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
P2657 [SCOI2009]windy数 数位dp入门
查看>>
Elasticsearch 运维实战之1 -- 集群规划
查看>>