最近微信项目中有需求,要将微信端发送过来的amr格式的语音文件,在项目中的页面上进行展示和播放,实现方式如下:

1.首先java后台收到微信端的消息推送的时候,使用 ffmpeg将amr格式的音频文件,转码为MP3

格式的音频文件进行存储,然后使用httpd进行文件映射,将访问路径再传到后台,存储数据库,并通过websocket通知页面;

2.页面读取数据库中存储的消息信息,进行遍历展示

  2.1 首先页面中定义个全局唯一的一个audio标签,进行音频文件的播放,定义一个可以防止页面上存在多个播放器的时候都进行播放,会造成声音混乱的情况,而且还有资源浪费等问题

  2.2 然后页面上使用js 画出和微信上一样的页面格式【小喇叭,未读红点】

  2.3 将后台到页面上的音频url进行加载,并获取到音频的长度,在页面中展示出来,代码如下:

  1. function showVoiceLength(msglogid,voiceurl){ //arg1:消息的id,are2:音频的url
  2. var voicePath = window.parent.getDisPlayUrl(voiceurl);
  3. 3  
  4. var voice = $('#voice')[0]; //获取页面的audio标签
  5. voice.src = voicePath;    //设置audio的播放路径
  6. voice.preload="metadata"; //设置页面加载音频的时候先加载元数据(时长、尺寸(仅视频)以及文本轨道。)
  7. voice.load(); //音频加载
        //这里的监听事件,表示音频开始加载的时候触发
  8. voice.addEventListener("loadstart", function() {
  9. var audio = new Audio(); //重新创建一个新的audio对象,为了下面获取长度的时候避免每次都获取同一个audio的长度
  10. audio.src = voicePath;           //重新设置新的audio对象的音频url  
  11. audio.preload="metadata"; //设置新的audio对象加载音频元数据
  12. audio.load();                //新的audio对象开始加载
  13. //新的audio对象元数据加载成功之后的回调 audio.duration 获取音频的时长,需要音频元数据加载完成之后才会有,否则就是NaN
  1. audio.onloadedmetadata=function(){
    console.log("src="+audio.currentSrc+"|||||||||||||||"+msglogid+"<><><><><><><><><><><><><>"+audio.duration);
           //这里获取到不同的消息对应的时长之后就可以将时长渲染到页面咯
    }
    });
    }

3.页面上的喇叭图片,音频时长,等展示完毕之后就是用户点击的时候进行播放了,调用的方式都和上面的差不多,不过是将load方法换成play()就可以播放了

附上audio标签的一些属性和API查询页面:

  1. http://www.runoob.com/tags/ref-av-dom.html

H5页面实现一个Audio标签加载多个音频文件,并进行播放和展示音频长度的更多相关文章

  1. 【转载】H5页面列表的无线滚动加载(前端分页)

    本代码基于Vue的架构 1.首先,要滚动的内容放在一个‘id=box’ 的div里,对div进行scroll事件的监听 <div id="box" class="m ...

  2. 一个页面从输入URL到加载显示完成,发生了什么?

    面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...

  3. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载

    为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...

  4. script标签加载顺序(defer & async)

    script 拥有的属性 async:可选,表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效. charset:可选.表示通过 src 属性指 ...

  5. 移动设备的HTML页面中图片实现滚动加载

    如今移动互联网风靡全球,移动页面的元素也是丰富多彩,一个移动页面的图片超过10张已经是再正常不过的事情了.但是相对,很多移动用户还停留在2G,3G这样的网络中.那么这样带宽的用户,在浏览这样的页面时, ...

  6. EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本

    为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...

  7. [jQuery插件]手写一个图片懒加载实现

    教你做图片懒加载插件 那一年 那一年,我还年轻 刚接手一个ASP.NET MVC 的 web 项目, (C#/jQuery/Bootstrap) 并没有做 web 的经验,没有预留学习时间, (作为项 ...

  8. RequireJS 是一个JavaScript模块加载器

    RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJ ...

  9. 一个link加载多个css文件

    细看正则时匹配慕课网链接时发现的,一个link加载多个css文件 http://static.mukewang.com/static/css/??base.css,common/common-less ...

随机推荐

  1. jquery属性过滤选择器

    http://www.jb51.net/article/46279.htm   $("div[id]").addClass("highlight"); //查找 ...

  2. How to crack gbooks

    Damn cnblogs, no auto saving set by default, even worse than csdn, can't believe it, lost half an ho ...

  3. POI2012 (持续更新中)

    Distance Well Vouchers Cloakroom A Horrible Poem Rendezvous Fibonacci Representation Squarks Salarie ...

  4. Maven_pom.xml介绍

    Maven的pom.xml介绍 6.1     简介 pom.xml文件是Maven进行工作的主要配置文件.在这个文件中我们可以配置Maven项目的groupId.artifactId和version ...

  5. 纪念逝去的岁月——C++实现一个栈(使用类模板)

    这个版本是上个版本的加强版,上个版本的代码:http://www.cnblogs.com/fengbohello/p/4542912.html 目录 1.代码 2.运行结果 1.代码 1.1 调试信息 ...

  6. jquery中prop()方法和attr()方法的区别浅析

    官方例举的例子感觉和attr()差不多,也不知道有什么区别,既然有了prop()这个新方法,不可能没用吧,那什么时候该用attr(),什么时候该用prop()呢 jquery1.6中新加了一个方法pr ...

  7. [转]as3事件流机制彻底理解

    题记: 看过网上一些as3事件流的教程,觉得大多都讲得不甚清楚,让人不能直观的理解事件流.而这篇教程以将事件流过程比喻成捕鱼过程,形象简单. 在此基础上对于as3事件流总算有了全面的理解.事件流机制说 ...

  8. ifstream 作为函数参数 需要加&

    ifstream作为函数的参数要加&   参考:http://www.cnblogs.com/growup/archive/2011/03/03/1971528.html void foo(i ...

  9. ado.net 修改,查询

    修改: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  10. Java 路径

    http://swiftlet.net/archives/713 Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝对路径.所以在Java中文件路径问题无非归结为一点:找 ...