通过javascript 直接播放amr格式的语言
前段时间做了个功能(有2、3个月了,突然想起来了,就记录一下),语言播放。一开始觉得很简单~~~
计划应用的是H5的audio标签,但因为这个标签不支持amr格式的语言,但是手机端传到后台的录音却都是amr格式的,无奈,只好先进行了转码工作。
amr格式语言转mp3格式,在windows服务器上均已通过,百度有很多博客。挺简单。
但是,最怕的但是,服务器是Linux环境,之前的一切工作全部白瞎了。之后就是各种Linux环境下的尝试了,然并卵,苦逼了一个一个礼拜,按照网上方法一个个尝试,结果过程和人家一样,但是就是无法实现转码功能。
最后,上天无路,入地无门,换种思路,直接开始学习AudioContext文档,结合网上资料,开始学习利用AudioContext直接播放amr语言文件。
AudioContext 学习:https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext
直接贴代码
HTML部分(href存amr文件访问路径)
<a class="amrnb" href="'+obj.fileDownloadUrl+'" download=""></a>
业务代码部分(initAudio方法需要在语言加载完毕后初始化)
/*语音播放控制js代码*/
function initAudio(){
setTimeout(function(){
//var audio = $("audio");
var audio = $(".amrnb");
var audioIngI=9999;//正在播放的语音的角标
for(var i = 0; i < audio.length; i++){
var dshiqi;
var second = 2;
/*var second = audio[i].duration;//获取音频秒数
if(second <= 60){
$(".yuyin-time").eq(i).text(parseInt(second) + "s");
}else if(second > 60){
var m = parseInt(second / 60);
var s = parseInt(second % 60);
$(".yuyin-time").eq(i).text(m + ":" + s + "s");
}*/
(function(i,audioIngI){
$($(".yuyin")[i]).live("click", function () {
$(".yuyin-play").removeClass("yuyin-playing");//播放完毕去除动画
var ctx = getAudioContext();
var state = ctx.state;
//alert(audioIngI==i);
/*if(audioIngI==i){
ctx.close();
if(state == "running"){
ctx.suspend();
}
if(state == "suspended"){
ctx.resume();
}
return;
}*/
if(state == "running"){
ctx.close();
if(audioIngI==i){
gAudioContext = new AudioContext();
audioIngI=9999;
clearTimeout(dshiqi);
return;
}
gAudioContext = new AudioContext();
}
fetchBlob($(this).find("a.amrnb")[0].href, function(blob) {
audioIngI = i;
playAmrBlob(blob);
//$(this).find(".yuyin-play").attr("class","yuyin-playing");
//$(this).find(".yuyin-play").addClass("yuyin-playing");
});
$(this).find(".yuyin-play").addClass("yuyin-playing");
var time = $(this).find("span").text();
dshiqi = setTimeout(function(){
$(".yuyin-play").removeClass("yuyin-playing");//播放完毕去除动画
audioIngI=9999;
},time.substr(0,time.length-1) * 1000);
//console.log($(this).find("a.amrnb")[i]);
/*for(var j = 0; j < $("audio").length; j++){
if(j != i){
audio[j].pause();// 这个就是暂停
audio[j].currentTime = 0;
$($(".yuyin-play")[j]).removeClass("yuyin-playing");
}
}
if(audio[i]!==null){
//检测播放是否已暂停.audio.paused 在播放器播放时返回false.
if(audio[i].paused){
audio[i].play();//audio.play();// 这个就是播放
$(this).find(".yuyin-play").addClass("yuyin-playing");
clearTimeout(dshiqi);
}else{
audio[i].pause();// 这个就是暂停
audio[i].currentTime = 0;
$(this).find(".yuyin-play").removeClass("yuyin-playing");
clearTimeout(dshiqi);
}
}
dshiqi = setTimeout(function(){
$(".yuyin-play").removeClass("yuyin-playing");//播放完毕去除动画
},audio[i].duration * 1000);*/
});
})(i);
}
},10);
}
AudioContext代码支持
/*************************************JS控制语音播放*****************************************/
/*function E(selector) {
return document.querySelector(selector);
} $('#sample-amr > button').onclick = function() {
fetchBlob(E('#sample-amr > a').href, function(blob) {
playAmrBlob(blob);
});
};*/ var gAudioContext = new AudioContext();
function getAudioContext() {
if(!gAudioContext) {
gAudioContext = new AudioContext();
}
return gAudioContext;
} function fetchBlob(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.onload = function() {
callback(this.response);
};
xhr.onerror = function() {
alert('Failed to fetch ' + url);
};
xhr.send();
} function readBlob(blob, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var data = new Uint8Array(e.target.result);
callback(data);
};
reader.readAsArrayBuffer(blob);
} function fetchAndReadBlob(url, callback) {
fetchBlob(url, function(blob) {
readBlob(blob, callback);
});
} function playAmrBlob(blob, callback) {
readBlob(blob, function(data) {
playAmrArray(data);
});
} function playAmrArray(array) {
var samples = AMR.decode(array);
if(!samples) {
alert('Failed to decode!');
return;
}
playPcm(samples);
} function playPcm(samples) {
var ctx = getAudioContext();
var src = ctx.createBufferSource();
var buffer = ctx.createBuffer(1, samples.length, 8000);
if(buffer.copyToChannel) {
buffer.copyToChannel(samples, 0, 0)
} else {
var channelBuffer = buffer.getChannelData(0);
channelBuffer.set(samples);
} src.buffer = buffer;
src.connect(ctx.destination);
src.start();
}
点击a标签就可以了~~
学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也。
通过javascript 直接播放amr格式的语言的更多相关文章
- C# Window Form解决播放amr格式音乐问题
最近搞一个项目,需要获取微信端语音文件,下载之后发现是AMR格式的录音文件,这下把我搞晕了,C#中的4种播放模式不支持播放AMR,想到都觉得头痛,如何是好?最后找到的方案,其实也简单:windows ...
- amr格式转mp3和直接播放amr格式的文件-sunziren
原创文章,转载请注明出处! 前言: amr作为一种高压缩比的音频格式,受到很多客户的青睐.本文主要涉及两部分的内容,一是amr如何转为mp3格式,二是如何直接播放amr格式的文件. 1. 如何使用Ja ...
- 网页播放amr格式文件
mp3格式大家都知道,amr格式就陌生了,至少我没听过.百度一下,先给自己扫盲: AMR(Adaptive Multi-Rate):nokia为WB-AMR格式(AWB)的铃声所作的商业命名,以被3G ...
- Web 播放声音 — Flash 篇 (播放 AMR、WAV)
本文主要介绍 Flash 播放 AMR 格式 Base64码 音频. 在此之前么有接触过 Flash ,接触 AS3 是一头雾水,不过幸好有 TypeScript 和 JavaScript 的基础看起 ...
- web页面如何播放amr的音频文件
这个需求由来已久,公司的语音订单很多,每次客服都是从服务器down下语音来听.很不方便..于是我就上网扒拉看有么有什么web播放器能播放amr格式的音频文件,amr百度百科 总之找了很久.,,然后发现 ...
- AMR格式语音采集/编码/转码/解码/播放
1.opencore-amr源码下载 https://sourceforge.net/projects/opencore-amr/files/opencore-amr/ 2.opencore-amr编 ...
- .net amr格式文件转换成mp3格式文件的方法
前言:winform端对于音频文件的格式多有限制,大多数不支持amr格式的文件的播放.但是,手机端传过来的音频文件大多数是amr格式的文件,所以,要想在winform客户端支持音频文件的播放,可以通过 ...
- 用 Lua 控制 MIDI 合成器来播放自定义格式乐谱
用 Lua 控制 MIDI 合成器来播放自定义格式乐谱 作者: FreeBlues 最新: https://www.cnblogs.com/freeblues/p/9936844.html 说明: 本 ...
- 在java中使用ffmpeg将amr格式的语音转为mp3格式
ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/. 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg ...
随机推荐
- 一个机器上运行两个tomcat
一. 在一台计算机上配置2个tomcat是可以的,关键是tomcat里的server.xml文件中三个端口必须不同.需要修改conf/server.xml使两个tomcat占用的端口不相同,在缺省 ...
- 如何使用GCC生成动态库和静态库
根据链接时期的不同,库又有静态库和动态库之分.静态库是在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行.而动态库是在程序执行的时候被链接的.程序执行完,库仍需 ...
- Python开课复习-10/17
pickle是一个用来序列化的模块序列化是什么?指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上 反序列化?将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化?就是为了将数据 ...
- 导入CA证书报错 keytool error: java.lang.Exception: Input not an X.509 certificate
导入CA证书报错: keytool error: java.lang.Exception: Input not an X.509 certificate 如果你的CA证书是如下格式的: -----BE ...
- 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...
- 2018.11.04 洛谷P2679 子串(线性dp)
传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...
- 注解Demo
1.创建注解类 2.在测试实体类中使用注解 3.构建注解解析类 4.执行注解解析方法
- 关于矩阵A*b=A*c 中b是否等于c
注意如果A各列线性无关那么b=c,反之b!=c, 针对最小二乘中的 p=A * roof_x A' ( b-p)=0 => A'b =A' p 如果 两边同乘以A , ...
- innodb mvcc多版本实现
出自:http://hedengcheng.com/?p=148 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 In ...
- VirtualBox安装增强工具时:Unable to install guest additions: unknown filesystem type 'iso9660'
解决方法: sudo apt-get install --reinstall linux-image-$(uname -r) 参考:http://askubuntu.com/questions/596 ...