成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高性能現(xiàn)代瀏覽器超大wav音頻的波形繪制方案

smartlion / 659人閱讀

摘要:音頻的增量解碼在瀏覽器中,提供了對(duì)音頻處理的對(duì)象。文件為實(shí)現(xiàn)文件的分割與重組,先了解音頻文件的組成文件說(shuō)明。使用的即可進(jìn)行對(duì)數(shù)據(jù)的繪制。

在繪制大音頻波形的場(chǎng)景(目前只支持wav格式),急著用的同學(xué)點(diǎn)這里,如果有問(wèn)題可以聯(lián)系我,我會(huì)盡快修復(fù)。github: https://github.com/CofeeWithR...

效果圖

傳統(tǒng)的音波圖渲染流程是 ajax完整加載音頻,使用audioContext解碼完整的音頻, 下載解碼后的數(shù)據(jù)使用canvas繪制,這種方式當(dāng)音頻較小時(shí)是沒(méi)有問(wèn)題,但遇到超大音頻(超過(guò)100M)時(shí)會(huì)出現(xiàn)從加載到渲染需要很長(zhǎng)的時(shí)間(3~8)s。

我們是否能夠從下載到繪制逐步地進(jìn)行,從而做到既不會(huì)因占用大量的內(nèi)存與集中的大量數(shù)據(jù)繪制造成卡頓,又有快速的響應(yīng)(用戶可以看到加載繪制的過(guò)程)。下面主要從下載、解碼、繪制三個(gè)方面來(lái)研究其實(shí)現(xiàn)的可行性。

增量的數(shù)據(jù)下載

XHR 與 fetch

XHR 有responseType屬性, 支持 "" | "arraybuffer" | "blob" | "document" | "json" | "text" 6種值,參照MDN若是 "arraybuffer"|"blob",在onprogress回調(diào)中獲取的response的值為nul, 這樣就不能下下載過(guò)程中邊下載,邊繪制。
參照下面代碼:

    const xhr  = new XMLHttpRequest();
    xhr.responseType = "arraybuffer"; 
    xhr.onprogress = data => {
        console.log( "data: ",data );
        console.log("onprogress response: ", xhr.response && xhr.response.byteLength);
    }
    xhr.onloadend = data => {
        console.log("load end..");
    }
    xhr.open("get","/source/test.wav" );
    xhr.send();

以上是使用xhr獲取音頻文件,只有在最后一次的onprogress回調(diào)中,獲取到完整的數(shù)據(jù),不能增量的獲取數(shù)據(jù),達(dá)到我們?cè)隽康睦L制目的。

fetch

fetch API支持對(duì)管道的管道操作與取消. 看下面的例子:

    
    
    fetch("/source/test.wav").then( (val: Response) => {
        if(val.body){
            // 從Response中獲取可讀流的reader,用于從管道中讀取數(shù)據(jù)。
            const reader: ReadableStreamReader =  val.body.getReader();
            readData(reader);
        }
    })
    
    function readData(reader: ReadableStreamReader){
        // 從管道中讀取數(shù)據(jù)。
        reader.read().then(data => {
    
            if(!data.done){
                // data.value 為一個(gè)Uint8Array.
                console.log(data.value.byteLength);
                // 若還有數(shù)據(jù),繼續(xù)讀取。
                readData(reader);
            }
        })    
    };

fetch 返回的 Promise中返回的是一個(gè)Response對(duì)象,最終我們可以在Response的body.getReader() 獲取到一個(gè)ReadableStreamReader ,通過(guò)該對(duì)象我們可以讀取網(wǎng)絡(luò)管道中的數(shù)據(jù)片段,以滿足我們?cè)隽夸秩緮?shù)據(jù)的需求。ReadableStreamReader 的read對(duì)象可以獲取一個(gè)返回值包含ArrayBuffer對(duì)象的Promise.
自此,就可以增量的從網(wǎng)絡(luò)管道中獲取數(shù)據(jù)。

音頻的增量解碼

在瀏覽器中,提供了對(duì)音頻處理的audioContext對(duì)象。它提供了一個(gè)解碼音頻的Api decodeAudioData, 但不幸的是它只支持完整音頻的解碼。所以解碼變成了完成增量渲染的核心部分。

為簡(jiǎn)單,目前只對(duì)wav音頻做解碼支持。由于WAV格式的特殊性,實(shí)現(xiàn)的總體思想也相當(dāng)簡(jiǎn)單:

1、wav文件分為文件頭部與數(shù)據(jù)部分,于是將wav文件的頭部取出,將數(shù)據(jù)部分分割為多段。

2、當(dāng)解碼時(shí),將文件頭稍作修改與數(shù)據(jù)片段組合成完整音頻,再使用decodeAudioData API進(jìn)行解碼。

wav文件

為實(shí)現(xiàn)wav文件的分割與重組,先了解wav音頻文件的組成 wav文件說(shuō)明。
在文檔中,給出了詳細(xì)的定義與說(shuō)明,其中關(guān)鍵的部分做下介紹:

摘自http://soundfile.sapp.org/doc...

由wav文件的結(jié)構(gòu)可以看到,只需要對(duì)data塊的size進(jìn)行修改,就可以使用該頭部與數(shù)據(jù)部分進(jìn)行拼接,形成新的被切割后的文件。

繪制

解碼后會(huì)得到AudioBuffer對(duì)象,可獲取的數(shù)據(jù)為 -1~1的浮點(diǎn)數(shù)。
使用canvas的Context.beginPath, 即可進(jìn)行對(duì)數(shù)據(jù)的繪制。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109393.html

相關(guān)文章

  • 優(yōu)化Recorder H5錄音:可邊錄邊轉(zhuǎn)碼上傳服務(wù)器,支持微信提供Android IOS Hybr

    摘要:開(kāi)源庫(kù)隨著支持功能的增多,音頻轉(zhuǎn)碼處理效率漸漸的跟不上需求了,近期抽時(shí)間對(duì)音頻轉(zhuǎn)碼部分進(jìn)行了升級(jí)優(yōu)化,以支持更多實(shí)用的功能?;谝陨蟽牲c(diǎn)問(wèn)題,似乎只有多線程能夠解決。 Recorder H5 GitHub開(kāi)源庫(kù)隨著支持功能的增多,音頻轉(zhuǎn)碼處理效率漸漸的跟不上需求了,近期抽時(shí)間對(duì)音頻轉(zhuǎn)碼部分進(jìn)行了升級(jí)優(yōu)化,以支持更多實(shí)用的功能。另外IOS的Hybrid App也完成了移植,Android...

    CrazyCodes 評(píng)論0 收藏0
  • 如何在覽器中播放pcm音頻

    摘要:格式文件中不包含頭部信息,播放器無(wú)法知道采樣率,聲道數(shù),采樣位數(shù),音頻數(shù)據(jù)大小等信息,導(dǎo)致無(wú)法播放。 本文記錄一點(diǎn)工作經(jīng)歷,探討音頻文件的格式更多訪問(wèn)我的博客 前言 最近在整理音視頻編程的知識(shí),回憶起半年多,有一次需求是在后臺(tái)播放某來(lái)源的 pcm 文件,當(dāng)時(shí)處理方法用了點(diǎn)技巧,記錄下來(lái) 背景:業(yè)務(wù)需求,在web后臺(tái)里播放 pcm 文件,文件不大(約300KB,已知 pcm 的參數(shù)采樣...

    zxhaaa 評(píng)論0 收藏0
  • 重磅重構(gòu)開(kāi)源 讓H5標(biāo)簽代替C++實(shí)時(shí)解碼播放speex壓縮協(xié)議音頻文件 【IM福音】

    摘要:編碼結(jié)束后,調(diào)用函數(shù),來(lái)銷毀和編碼器。調(diào)用函數(shù)對(duì)參數(shù)中的格式音頻數(shù)據(jù)幀進(jìn)行解碼,參數(shù)中存放解碼后的音頻數(shù)據(jù)幀。調(diào)用函數(shù)來(lái)銷毀和解碼器說(shuō)重點(diǎn)當(dāng)做即時(shí)通信產(chǎn)品,像微信這種的手機(jī)端,它們接受到很有可能就是協(xié)議壓縮后的音頻文件。 showImg(https://segmentfault.com/img/bVbtzkh?w=1024&h=682); 這么牛逼的輪子,肯定要美圖鎮(zhèn)樓 Speex是一...

    curried 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<