h5移动端播放amr格式的音频文件兼容安卓IOS
生活随笔
收集整理的這篇文章主要介紹了
h5移动端播放amr格式的音频文件兼容安卓IOS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基于amr.js和RecorderJs,最底部有線上demo代碼
播放 AMR:
播放本地文件:
<input type="file" id="amr-file" accept=".amr"> var amr = new BenzAMRRecorder(); var amrFileObj = document.getElementById('amr-file'); amrFileObj.onchange = function() {amr.initWithBlob(this.files[0]).then(function() {amr.play();}); }錄制 AMR:
var amrRec = new BenzAMRRecorder(); amrRec.initWithRecord().then(function() {amrRec.startRecord(); });下載 AMR:
window.location.href = window.URL.createObjectURL(amr.getBlob());把 MP3 轉換成 AMR (需要瀏覽器原生支持 MP3):
var amrFromMp3 = new BenzAMRRecorder(); amrFromMp3.initWithUrl('path/to/file.mp3').then(function() {// 下載 amr 文件window.location.href = window.URL.createObjectURL(amrFromMp3.getBlob()); })API:
/*** 是否已經初始化* @return {boolean}*/ amr.isInit();/*** 使用浮點數據初始化* @param {Float32Array} array* @return {Promise}*/ amr.initWithArrayBuffer(array);/*** 使用 Blob 對象初始化( <input type="file">)* @param {Blob} blob* @return {Promise}*/ amr.initWithBlob(blob);/*** 使用 url 初始化* @param {string} url* @return {Promise}*/ amr.initWithUrl(url);/*** 初始化錄音* @return {Promise}*/ amr.initWithRecord();事件:
注意:事件不會疊加,也就是說,新注冊的事件將覆蓋掉舊的事件。
播放控制
/*** 播放(無視暫停狀態)* @param {number?} startTime 可指定播放開始位置(秒,浮點數,可選)*/ amr.play();/*** 停止*/ amr.stop();/*** 暫停* @since 1.1.0*/ amr.pause();/*** 從暫停狀態中繼續播放* @since 1.1.0*/ amr.resume();/*** 整合 play() 和 resume(),若在暫停狀態則繼續,否則從頭播放* @since 1.1.0*/ amr.playOrResume();/*** 整合 resume() 和 pause(),切換暫停狀態* @since 1.1.0*/ amr.pauseOrResume();/*** 整合 play() 和 resume() 和 pause()* @since 1.1.0*/ amr.playOrPauseOrResume();/*** 跳轉到音頻指定位置,不改變播放狀態(若停止狀態則等同于 `play(time)`) * @since 1.1.0* @param {Number} time 指定位置(秒,浮點數)*/ amr.setPosition(12.34);/*** 獲取當前播放位置(秒) * @since 1.1.0* @return {Number} 位置,秒,浮點數*/ amr.getCurrentPosition();/*** 是否正在播放* @return {boolean}*/ amr.isPlaying();/*** 是否暫停中* @since 1.1.0* @return {boolean}*/ amr.isPaused();錄音控制:
/*** 開始錄音*/ amr.startRecord();/*** 結束錄音,并把錄制的音頻轉換成 AMR* @return {Promise}*/ amr.finishRecord();/*** 放棄錄音*/ amr.cancelRecord();/*** 是否正在錄音* @return {boolean}*/ amr.isRecording();其他
/*** 獲取音頻的時間長度(單位:秒)* @return {Number}*/ amr.getDuration();/*** 獲取 AMR 文件的 Blob 對象(用于下載文件)* @return {Blob}*/ amr.getBlob();/*** 判斷瀏覽器是否支持播放* 注意這是靜態(static)方法* @since 1.1.0* @return {boolean}*/ BenzAMRRecorder.isPlaySupported(); // 不是 amr.isPlaySupported();/*** 判斷瀏覽器是否支持錄音* 注意這是靜態(static)方法* @since 1.1.0* @return {boolean}*/ BenzAMRRecorder.isRecordSupported(); // 不是 amr.isRecordSupported();Demo:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><title>AMR_test</title><style>#fixed{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 9;background: rgba(0,0,0,0.8);color: #fff;font-size: 40px;animation: huxi .3s ease infinite alternate;transform-origin: top left;}@keyframes huxi {from {transform: scale(1);}to {transform: scale(1.02);}}</style> </head> <body> <div id="fixed">加載中,請稍等...</div> <h1>AMR 錄音機 Demo</h1> <h2>解碼、播放</h2> <div id="player-amr"><p>加載演示文件:<button id="amr-load">加載、解碼</button><a href="./1.amr">下載演示文件:mario.amr</a></p><p>加載本地文件:<input type="file" id="amr-file" accept=".amr">(不會上傳到任何服務器)</p><p><button id="amr-play" disabled>播放</button><button id="amr-stop" disabled>停止</button><input id="amr-progress" type="range" min="0" max="1" step="any" value="0" disabled><label for="amr-progress"><span id="amr-cur">0'</span><span>/</span><span id="amr-duration">0'</span></label></p> </div> <h2>錄音、編碼</h2> <div id="recorder-amr"><p><button id="amr-record">開始錄音</button>(不會上傳到任何服務器)</p><p><button id="amr-play-record" disabled>播放錄音</button><a href="#" id="amr-down-record"><!--下載錄音amr文件--></a><span id="amr-record-duration">0'</span></p> </div><script>var _doc=document.getElementsByTagName('head')[0];var script=document.createElement('script');script.setAttribute('type','text/javascript');script.setAttribute('src','./BenzAMRRecorder.min.js');_doc.appendChild(script);function E(selector) {return document.querySelector(selector);}script.onload = function () {(function () {function E(selector) {return document.querySelector(selector);}E('#fixed').style.display = 'none';/**** 解碼、播放 ****/var amr;var loadDemoBtn = E('#amr-load');var loadAmrFile = E('#amr-file');var playBtn = E('#amr-play');var stopBtn = E('#amr-stop');var progressCtrl = E('#amr-progress');var isDragging = false;var cur = E('#amr-cur');var duration = E('#amr-duration');setInterval(function () {if (amr) {cur.innerHTML = amr.getCurrentPosition().toFixed(2) + '\'';if (!isDragging) {progressCtrl.value = amr.getCurrentPosition().toFixed(2);}} else {cur.innerHTML = '0\'';}}, 10);loadDemoBtn.onclick = function() {amr = new BenzAMRRecorder();loadDemoBtn.setAttribute('disabled', true);loadAmrFile.setAttribute('disabled', true);playBtn.setAttribute('disabled', true);stopBtn.setAttribute('disabled', true);progressCtrl.setAttribute('disabled', true);amr.initWithUrl('./1.amr').then(function () {loadDemoBtn.removeAttribute('disabled');loadAmrFile.removeAttribute('disabled');playBtn.removeAttribute('disabled');stopBtn.removeAttribute('disabled');progressCtrl.removeAttribute('disabled');progressCtrl.setAttribute('max', amr.getDuration());duration.innerHTML = amr.getDuration().toFixed(2) + '\'';});// 綁定事件amr.onPlay(function () {console.log('Event: play');playBtn.innerHTML = '暫停';});amr.onStop(function () {console.log('Event: stop');playBtn.innerHTML = '播放';});amr.onPause(function () {console.log('Event: pause');playBtn.innerHTML = '繼續';});amr.onResume(function () {console.log('Event: resume');playBtn.innerHTML = '暫停';});amr.onEnded(function () {console.log('Event: ended');playBtn.innerHTML = '播放';});amr.onAutoEnded(function () {console.log('Event: autoEnded');});amr.onStartRecord(function () {console.log('Event: startRecord');});amr.onFinishRecord(function () {console.log('Event: finishRecord');});amr.onCancelRecord(function () {console.log('Event: cancelRecord');});};playBtn.onclick = function () {amr.playOrPauseOrResume();};stopBtn.onclick = function () {amr.stop();};progressCtrl.onmousedown = function () {isDragging = true;};progressCtrl.onmouseup = function () {isDragging = false;};progressCtrl.onchange = function (e) {amr.setPosition(e.target.value);};loadAmrFile.onchange = function() {amr = new BenzAMRRecorder();loadDemoBtn.setAttribute('disabled', true);loadAmrFile.setAttribute('disabled', true);playBtn.setAttribute('disabled', true);amr.initWithBlob(this.files[0]).then(function () {loadDemoBtn.removeAttribute('disabled');loadAmrFile.removeAttribute('disabled');playBtn.removeAttribute('disabled');duration.innerHTML = amr.getDuration().toFixed(2) + '\'';});// 綁定事件amr.onPlay(function () {console.log('Event: play');playBtn.innerHTML = '停止';});amr.onStop(function () {console.log('Event: stop');playBtn.innerHTML = '播放';});amr.onEnded(function () {console.log('Event: ended');playBtn.innerHTML = '播放';});amr.onAutoEnded(function () {console.log('Event: autoEnded');});amr.onStartRecord(function () {console.log('Event: startRecord');});amr.onFinishRecord(function () {console.log('Event: finishRecord');});amr.onCancelRecord(function () {console.log('Event: cancelRecord');});};/***** 錄音、編碼 *****/var amrForRecorder;var recordBtn = E('#amr-record');var playRecordBtn = E('#amr-play-record');var downRecordLink = E('#amr-down-record');var recordDuration = E('#amr-record-duration');recordBtn.onclick = function () {navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(function(stream) {/* 使用這個stream stream */}).catch(function(err) {/* 處理error */});if (amrForRecorder && amrForRecorder.isRecording()) {recordBtn.innerHTML = '開始錄音';playRecordBtn.removeAttribute('disabled');amrForRecorder.finishRecord().then(() => {downRecordLink.href = window.URL.createObjectURL(amrForRecorder.getBlob());downRecordLink.innerHTML = '下載錄音amr文件';recordDuration.innerHTML = amrForRecorder.getDuration().toFixed(2) + '\'';});} else {recordBtn.innerHTML = '停止錄音';playRecordBtn.setAttribute('disabled', true);amrForRecorder = new BenzAMRRecorder();amrForRecorder.initWithRecord().then(() => {amrForRecorder.startRecord();}).catch(function(e) {alert(e.message || e.name || JSON.stringify(e));});// 綁定事件amrForRecorder.onPlay(function () {console.log('Recorder Event: play');playRecordBtn.innerHTML = '停止播放';});amrForRecorder.onStop(function () {console.log('Recorder Event: stop');playRecordBtn.innerHTML = '播放錄音';});amrForRecorder.onEnded(function () {console.log('Recorder Event: ended');playRecordBtn.innerHTML = '播放錄音';});amrForRecorder.onAutoEnded(function () {console.log('Recorder Event: autoEnded');});amrForRecorder.onStartRecord(function () {console.log('Recorder Event: startRecord');recordBtn.innerHTML = '停止錄音';});amrForRecorder.onFinishRecord(function () {console.log('Recorder Event: finishRecord');recordBtn.innerHTML = '開始錄音';});amrForRecorder.onCancelRecord(function () {console.log('Recorder Event: cancelRecord');recordBtn.innerHTML = '開始錄音';});}};playRecordBtn.onclick = function () {if (amrForRecorder.isPlaying()) {amrForRecorder.stop();} else {amrForRecorder.play();}};})();} </script> </body> </html>戳這里看效果
掃碼手機看效果:
總結
以上是生活随笔為你收集整理的h5移动端播放amr格式的音频文件兼容安卓IOS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts多模块开发
- 下一篇: 认识搜索引擎-从SEO到优化实战大师