我的目標是從瀏覽器中讀取HTTP MP3音頻流並可以訪問原始音頻數據。XMLHttpRequest和http流
HTML5 <音頻>讓我輕鬆地播放流,但據我所知,不授予訪問原始音頻數據。它只是玩它。
JS XMLHTTPRequest可以通過HTTP下載文件並處理原始音頻數據。它似乎是一個很好的候選者,但它有一個限制:它不會授予對二進制數據的訪問權限,直到下載完成(readystate = 4)。在我的情況下,這個流是無限的,所以readystate永遠保持在3,XHR響應爲null(這個行爲在mozilla文檔中有詳細描述)。請注意,我連接到服務器的跨域策略是訪問控制允許來源:*
代碼示例,對於本地普通文件的工作,而不是流。我會在request.response.length一個空指針異常
request = new XMLHttpRequest();
//request.open('GET', 'test.mp3', true);
request.open('GET', 'http://domain.com/stream.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
console.log("request onload");
var audioData = request.response;
audioCtx.decodeAudioData(audioData,
function(buffer) { myBuffer = buffer; source.buffer = myBuffer; },
function(e){"Error with decoding audio data" + e.err}
);
}
request.onreadystatechange = function() {
console.log("ready state = " + request.readyState);
console.log(request.response.length);
}
request.send();
是否有人知道的替代品,以及解決這些選項,使原始的二進制包可以在下載流中讀取?
請注意,我沒有在服務器上的控制權。這是一個icecast http流。 另外,在瀏覽器端,我想避免使用Flash。 謝謝
編輯:爲了澄清可能的跨源問題,JS運行在託管在本地主機服務器上的頁面上。
要清楚,您需要原始解碼的PCM音頻數據,而不是來自服務器的比特流,是的?如果是這樣,那麼Web Audio API就是您需要的。 – Brad
@Brad事實上,我使用Web Audio API(作爲提示參見上面的decodeAudioData方法,在我的部分代碼中)。我只是無法從流中獲取緩衝區並將其放入API中。我想我找到了一個解決方案,請參閱下面的解決方案。 – astooooooo