我的目标是从浏览器中读取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