gpt4 book ai didi

node.js - 为什么

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:01 25 4
gpt4 key购买 nike

我正在使用 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 问题,因为当我通过在没有任何网络服务器的情况下加载 HTML 文件进行本地测试时,音频循环正常。它在我测试的 Apache 服务器上也按预期工作。此外,如果我链接到 Apache 服务器上托管的 mp3 文件,它仍然可以按预期工作,并由 Node 服务器提供 HTML。

当编码为 base64 时,音频也可以正常循环。 .

我使用的是node.js 0.8.14版本。可以访问 Node 上托管的代码的实时演示 here .

编辑服务器有一个名为“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

最佳答案

我怀疑这是因为您的 Node.js 服务器没有响应范围请求。

Chrome 正在发送文件中特定字节集的范围请求。我不知道为什么如果没有在响应中获取这些字节,它就无法循环,但这应该是唯一的区别。

关于node.js - 为什么 <audio> 元素不会为 Node.js 服务器上托管的文件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16879822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com