網頁上面嵌入錄音外掛,可以錄音,播放
阿新 • • 發佈:2019-01-05
前段時間接了一個外包專案,有一個功能是網頁線上錄音並上傳雲伺服器的需求,之前沒有接觸過,想著Google了一下找個demo改改;
找到三個,基本能滿足需求:
第一個是在第二個的基礎上擴展出來的,使用flash模組實現錄音功能;第一個已經實現了錄音並上傳到伺服器的功能,但是有個問題是錄音中雜音太大,鑑於自身技術水平不支援優化原始碼,所以基本是被嫌棄了;
第三個是使用 HTML5 的 Audio API 實現的,如果不考慮 ie 的話,是非常推薦的;
以上是對三個錄音外掛的簡單說明,我的需求是能夠相容低版本瀏覽器,實現錄音後上傳伺服器並獲取音訊地址;
經過一番 Google,算是找到一個滿足需求的: https://github.com/jwagener-soundcloud/recorder.js
這個外掛基於 swfObject.js,低版本瀏覽器中使用 flash 實現錄音功能,在高版本支援 HTML5 的瀏覽器中使用 Audio 實現;簡直 perfect;同時它還封裝好了上傳功能,支援上傳到伺服器和 SoundCloud;
recorder.js 原始碼,集成了swfObject.js,封裝了初始化、錄音開始、錄音停止、錄音播放、錄音上傳等方法;外掛有提供 demo,基本用法可以參考 demo 瞭解使用,就不多說了;
廢話這麼多,說一下我的需求:
- 網頁線上錄音,並上傳到 upyun;
- 錄音開始,同時執行倒計時(倒計時結束錄音結束);
- 錄音結束,上傳錄音;
- 上傳錄音完成,執行方法進入下一個錄音場景;
- 所有錄音場景結束,展示錄音列表並播放;
- 相容低版本瀏覽器;
// 初始化
Recorder.initialize({
swfSrc:"../recorder.swf"
});
// 開始錄音
function record(callback){
Recorder.record({
start:function(){
callback && callback();
},
progress:function(milliseconds){
//document.getElementById("time").innerHTML = timecode(milliseconds);
}
});
}
// 上傳模組
var recordArr =[];// 因為最後需要展示音訊列表,需要一個全域性陣列用於儲存upyun返回的音訊url
function upload(callback){
// 定義音訊檔名
var fileName = $.cookie("TOEFL_TOKEN")?"login"+newDate().getTime():"nologin"+newDate().getTime();
// 獲取upyun配置引數,參考upyun的form_api:http://docs.upyun.com/api/form_api/
// 這裡先上傳音訊檔名至伺服器端,服務端根據檔名生成對應的policy和signature返回客戶端
$.ajax({
type:"GET",
url: xm.baseURL +"/mkTpo/file/"+ fileName +".wav/posts.action",
dataType :"json",
success:function(data){
// 獲取upyun_api引數
var expiration = data.expiration,// 時間戳
saveKey = data["save-key"],// 儲存路徑
bucket = data.bucket,// 空間名
policy = data.poily,// policy
signature = data.signature;// signature
// 外掛封裝方法,注:該方法中的註釋可能導致程式報錯,需刪除
Recorder.upload({
method:"POST",
url:"http://v0.api.upyun.com/universe1",// 錄音上傳url:upyun_api基本域名+空間名
audioParam:"file",// 上傳upyun時,這個引數值固定為file,相當於表單提交中的<input type="file">
params:{// 這裡填寫獲取的upyun_api引數,獲取upyun的上傳許可權
"expiration": expiration,
"save-key": saveKey,
"bucket": bucket,
"policy": policy,
"signature": signature
},
success:function(responseText){// 上傳成功之後upyun會返回音訊檔案的相關資訊
var data = JSON.parse(responseText);
recordArr.push(data.url);// 將錄音音訊的url追加到陣列
callback && callback();// 上傳完成執行方法
}
});
},
error:function(XMLHttpRequest, textStatus, errorThrown){
console.log("XMLHttpRequest.status: "+XMLHttpRequest.status);
console.log("XMLHttpRequest.readyState: "+XMLHttpRequest.readyState);
console.log("textStatus: "+ textStatus);
}
});
}
所有錄音場景結束之後,對 recordArr 陣列遍歷輸出,並插入到結果展示頁中;
至於音訊播放,那是播放器的事,專案中用到的是 jplayer [中文網]播放器;