h5 錄音


得益於前輩的分享,做了一個h5錄音的demo。效果圖如下:

點擊開始錄音會先彈出確認框:

首次確認允許后,再次錄音不需要再確認,但如果用戶點擊禁止,則無法錄音:

點擊發送 將錄音內容發送到對話框中。點擊即可播放。點擊獲取錄音即可下載最后一次的音頻:

播放下載都是圍繞blob文件。播放就是讓隱藏的audio標簽的地址指向內存中的blob:

        this.play = function (audio,blob) {
            blob=blob||this.getBlob().blob;
            audio.src = URL.createObjectURL(blob);  
        };  
createObjectURL 我們在用base64顯示圖片的時候也可以用到。
 img.src = URL.createObjectURL(blob);

這樣比一長串的字符串好看很多。同理如果你想銷毀該地址對應的數據而節省內存可以這樣:

 URL.revokeObjectURL(img.src);

扯遠了點。下載就是模擬a標簽的點擊。

   function downloadRecord(record){
              var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
                save_link.href = URL.createObjectURL(record);
                var now=new Date;
                save_link.download = now.Format("yyyyMMddhhmmss");
                fake_click(save_link);
            }

       
            function fake_click(obj) {
            var ev = document.createEvent('MouseEvents');
            ev.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            obj.dispatchEvent(ev);
            }

每次發送 ,其實是講音頻數據緩存下來,標記下id。下次點擊的時候根據id獲取緩存的數據,然后叫給audio元素播放:

var msg={};
            //發送音頻片段
            var msgId=1;
            function send(){
                if(!recorder){
                    showError("請先錄音");
                    return;
                }

               var data=recorder.getBlob();
               if(data.duration==0){
                     showError("請先錄音");
                    return;
               }
                msg[msgId]=data;
                recorder.clear();
                console.log(data);
                var dur=data.duration/10;
                 var str="<div class='warper'><div id="+msgId+" class='voiceItem'>"+dur+"s</div></div>"
                $(".messages").append(str);
                msgId++;
            }
            
            $(document).on("click",".voiceItem",function(){
                var id=$(this)[0].id;
                var data=msg[id];
                playRecord(data.blob);
            })

內部是基於AudioContext實現:兼容性如下,基本上只能在谷歌和火狐瀏覽器里面玩。很可惜微信和ios目前不支持的。如果電腦沒有音頻驅動或者沒有麥都會報錯提示。

 

 有興趣的朋友可以玩玩。未來移動端支持就更好了。

源碼:http://files.cnblogs.com/files/stoneniqiu/Voice.zip

參考博客:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM