2017-09-20 190 views
1

我正在嘗試使用Web Audio Api爲音樂編寫自定義網絡播放器,但是我遇到了解碼音頻的問題。AudioBuffer無法緩存/ decodeAudioData需要很長時間

我使用AudioContext.decodeAudioData函數從後端獲取.mp3作爲ArrayBuffer並對其進行解碼。

const resp = await fetch(url); 
    const raw = await resp.arrayBuffer(); 
    const audioBuffer = context.decodeAudioData(raw); 

我試圖緩存AudioBuffer在IndexedDB的,但它不是可克隆。我的設備上的解碼需要大約10秒鐘的時間,而且這個時間很長。除了預取和「預解碼」之外,我還有其他選擇來防止歌曲之間漫長的等待時間嗎?

+0

難道您不能將數據作爲流獲取並將其解碼爲部分? – Nit

+0

在部分解碼它似乎相當複雜,因爲javascript時鐘非常不準確。我試過了,但我無法阻止音頻片斷之間的crack ling聲。此外,該文件說:。 「異步解碼包含在ArrayBuffer音頻文件數據在這種情況下,ArrayBuffer通常是從一個XMLHttpRequest的響應屬性加載設置的responseType到arraybuffer後,此方法僅適用於完整的文件,而不是碎片音頻文件「。 https://developer.mozilla.org/de/docs/Web/API/AudioContext – Lucas

回答

4

AudioBuffer並不意味着大塊音頻

此接口的代表內存駐留音頻資產(爲一次性的聲音和其他短音頻剪輯)。其格式是非交錯IEEE 32位線性PCM,標稱範圍爲-1 - > +1。它可以包含一個或多個頻道。通常,預計PCM數據的長度將是相當短(通常略小於1分鐘)。對於較長的聲音,如音樂配樂,流應與音頻元素和MediaElementAudioSourceNode使用。

(重點煤礦)

https://www.w3.org/TR/webaudio/#AudioBuffer

你可能要考慮MediaElementAudioSourceNode如果你確實需要操作上飛的聲音。否則,一個簡單的音頻元素就足夠了。

+0

哦該死的,所以我完全濫用decodeAudioBuffer方法。感謝您的澄清,我會嘗試使用html元素來實現播放器。 – Lucas