我正在使用托管在node.js服务器上的以下HTML进行测试:
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<title>Audio Testing</title>
</head>
<body>
<audio src='/public/tests/audioTest.mp3' controls autoplay loop></audio>
</body>
</html>问题是,音频只能在页面加载时播放一次(Chrome,因为它是mp3)。
我怀疑这是一个node.js问题,因为当我在本地测试时,音频循环很好,只需要加载没有任何webserver的HTML。它在我测试过的Apache服务器上也能正常工作。此外,如果我链接到一个驻留在Apache服务器上的mp3文件,那么它仍然能像预期的那样工作,节点服务器将为它提供HTML服务。
当编码为base64时,音频循环也很好。
我使用的是node.js的0.8.14版本。节点上托管的代码的现场演示可以访问这里。
编辑服务器有一个名为"public“的目录,如果需要的话,服务器将始终提供文件。音频文件和html页面都位于"public“目录中。
node.js服务器代码如下:
var http = require('http');
var fs = require('fs');
var mime = require('mime');//Third party library for looking up mime types
var handleRequest = function(req, res) {
if (req.url === '/') {
fs.createReadStream(__dirname+'/public/homePage.html').pipe(res);
return;
}
else if (req.url === '/favicon.ico') {
fs.createReadStream(__dirname+'/public/favicon.ico').pipe(res);
return;
}
else if (req.url.substr(0, 7) === '/public') {
var mim = mime.lookup(req.url);
var ext = mime.extension(mim);
console.log('mime '+mim+' ext '+ext);
if (ext !== 'bin') {
fs.exists(__dirname+'/'+req.url, function(exists) {
if (exists) {
if (req.headers.range) {
var filename = __dirname+req.url;
fs.readFile(filename, 'binary', function(err, file) {
var header = {};
var range = req.headers.range;
var parts = range.replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
var total = file.length;
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : total-1;
header["Content-Range"] = "bytes " + start + "-" + end + "/" + (total);
header["Accept-Ranges"] = "bytes";
header["Content-Length"]= (end-start)+1;
//header['Transfer-Encoding'] = 'chunked';
header["Connection"] = "close";
res.writeHead(206, header);
res.write(file.slice(start, end)+'0', "binary");
res.end();
return;
});
}
else {
res.writeHead(200,{'Content-Type':mim});
fs.createReadStream(__dirname+'/'+req.url).pipe(res);
return;
}
else {res.end();}
});
}
else {res.end();}
}
else {res.end();}
};
var server = http.createServer(handleRequest);
server.listen(8888);//Listening on port 8888发布于 2013-06-02 04:41:08
我怀疑这是因为您的Node.js服务器没有响应范围请求。
Chrome正在为文件中的某一组字节发送范围请求。我不知道为什么如果没有响应中的字节,它就不能循环,但这应该是唯一的区别。
https://stackoverflow.com/questions/16879822
复制相似问题