H5页面实现一个Audio标签加载多个音频文件,并进行播放和展示音频长度
最近微信项目中有需求,要将微信端发送过来的amr格式的语音文件,在项目中的页面上进行展示和播放,实现方式如下:
1.首先java后台收到微信端的消息推送的时候,使用 ffmpeg将amr格式的音频文件,转码为MP3
格式的音频文件进行存储,然后使用httpd进行文件映射,将访问路径再传到后台,存储数据库,并通过websocket通知页面;
2.页面读取数据库中存储的消息信息,进行遍历展示
2.1 首先页面中定义个全局唯一的一个audio标签,进行音频文件的播放,定义一个可以防止页面上存在多个播放器的时候都进行播放,会造成声音混乱的情况,而且还有资源浪费等问题
2.2 然后页面上使用js 画出和微信上一样的页面格式【小喇叭,未读红点】
2.3 将后台到页面上的音频url进行加载,并获取到音频的长度,在页面中展示出来,代码如下:
function showVoiceLength(msglogid,voiceurl){ //arg1:消息的id,are2:音频的url
var voicePath = window.parent.getDisPlayUrl(voiceurl);
3
var voice = $('#voice')[0]; //获取页面的audio标签
voice.src = voicePath; //设置audio的播放路径
voice.preload="metadata"; //设置页面加载音频的时候先加载元数据(时长、尺寸(仅视频)以及文本轨道。)
voice.load(); //音频加载
//这里的监听事件,表示音频开始加载的时候触发
voice.addEventListener("loadstart", function() {
var audio = new Audio(); //重新创建一个新的audio对象,为了下面获取长度的时候避免每次都获取同一个audio的长度
audio.src = voicePath; //重新设置新的audio对象的音频url
audio.preload="metadata"; //设置新的audio对象加载音频元数据
audio.load(); //新的audio对象开始加载
//新的audio对象元数据加载成功之后的回调 audio.duration 获取音频的时长,需要音频元数据加载完成之后才会有,否则就是NaN
audio.onloadedmetadata=function(){
console.log("src="+audio.currentSrc+"|||||||||||||||"+msglogid+"<><><><><><><><><><><><><>"+audio.duration);
//这里获取到不同的消息对应的时长之后就可以将时长渲染到页面咯
}
});
}
3.页面上的喇叭图片,音频时长,等展示完毕之后就是用户点击的时候进行播放了,调用的方式都和上面的差不多,不过是将load方法换成play()就可以播放了
附上audio标签的一些属性和API查询页面:
http://www.runoob.com/tags/ref-av-dom.html
H5页面实现一个Audio标签加载多个音频文件,并进行播放和展示音频长度的更多相关文章
- 【转载】H5页面列表的无线滚动加载(前端分页)
本代码基于Vue的架构 1.首先,要滚动的内容放在一个‘id=box’ 的div里,对div进行scroll事件的监听 <div id="box" class="m ...
- 一个页面从输入URL到加载显示完成,发生了什么?
面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载
为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...
- script标签加载顺序(defer & async)
script 拥有的属性 async:可选,表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效. charset:可选.表示通过 src 属性指 ...
- 移动设备的HTML页面中图片实现滚动加载
如今移动互联网风靡全球,移动页面的元素也是丰富多彩,一个移动页面的图片超过10张已经是再正常不过的事情了.但是相对,很多移动用户还停留在2G,3G这样的网络中.那么这样带宽的用户,在浏览这样的页面时, ...
- EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本
为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...
- [jQuery插件]手写一个图片懒加载实现
教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...
- RequireJS 是一个JavaScript模块加载器
RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJ ...
- 一个link加载多个css文件
细看正则时匹配慕课网链接时发现的,一个link加载多个css文件 http://static.mukewang.com/static/css/??base.css,common/common-less ...
随机推荐
- BZOJ 1831 & 就是一个DP....
题意: 比如说,4 2 1 3 3里面包含了5个逆序对:(4, 2), (4, 1), (4, 3), (4, 3), (2, 1). 可惜的是,由于年代久远,这些数字里有一部分已经模糊不清了,为了方 ...
- ACM 房间安排
房间安排 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间, ...
- ORA-01034错误:ORALCE NOT CONNECT
解决办法: 启动数据库 sqlplus '/as sysdba ' startup;
- Kosaraju 算法
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...
- InterBase数据库迁移到MySQL(数据导入)
在这个脚本中我使用的是Python的ORM框架SQLAlchemy来连接远程的MySQL数据库的,在写这个脚本的时候为了方便参数的输入,我就给之前和这个脚本添加了一个新的功能,就是在调用这个脚本的时候 ...
- webdriver中定位元素,报无法找到元素的问题
webdriver中定位元素,报无法找到元素的问题时,需要查看以下几点: 1 用火狐的firebug插件定位元素,确保这个元素的定位正确: 2 在火狐的firebug插件的,在html页签中输入fra ...
- 用c#实现$.now()(1437813924915)的时间效果
Convert.ToInt64((DateTime.UtcNow - Convert.ToDateTime("1970-01-01")).TotalMilliseconds)
- Android官方提供的下拉刷新控件——SwipeRefreshLayout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- scala - Enumeration 诡异问题
object WeekDay extends Enumeration { type WeekDay = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Va ...
- unity3d插件Daikon Forge GUI 中文教程5-高级控件listbox和progress bar的使用
3.3.listbox列表框 Atlas 图集: 下面应用到的精灵都是在这里的. ListBox中的内容: 背景精灵 图片的主颜色 Padding边距 Scrollbar 滚动条对象的预制体或者对象, ...