Javascript 在NodeJS中提供mp3文件以用于音频标签
我在NodeJS中提供mp3文件时遇到问题Javascript 在NodeJS中提供mp3文件以用于音频标签,javascript,node.js,html,Javascript,Node.js,Html,我在NodeJS中提供mp3文件时遇到问题 var filestream = fs.createReadStream('file.mp3'); filestream.on('open', function() { var stats = fs.statSync('file.mp3'); var fileSizeInBytes = stats["size"]; response.writeHead(200, { 'Content-Type': 'audio/mpeg',
var filestream = fs.createReadStream('file.mp3');
filestream.on('open', function() {
var stats = fs.statSync('file.mp3');
var fileSizeInBytes = stats["size"];
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': fileSizeInBytes});
filestream.pipe(response);
});
我正在设置文件送达前的内容类型以及内容长度
当我在页面上有文件时,我可以播放音频并获取内容的持续时间和当前时间
但是我不能像我不使用NodeJS来提供mp3文件时那样设置它的当前时间
<audio id='player' src='file.mp3'></audio>
<script>
var duration = player.duration; // 88 seconds
var time = player.currentTime; // 0 seconds
player.currentTime = 10;
var time = player.currentTime; // 0 seconds
</script>
var duration=player.duration;//88秒
var time=player.currentTime;//0秒
player.currentTime=10;
var time=player.currentTime;//0秒
只是想重复一下——当从目录中打开这个页面时(不使用nodejs作为服务器),我可以设置音频元素的currentTime。
这是为什么?感谢您的帮助。解决方案是在每个响应中添加一个“Accept Ranges”标题,并使用“range”标题修改对请求的响应,从标题中读取字节范围,并使用HTTP/1.1 206响应代码提供该内容 字节头的格式为
bytes=-
,例如bytes=0-49
这是我的更新代码:
var filestream = fs.createReadStream('file.mp3');
var range = request.headers.range.replace("bytes=", "").split('-');
filestream.on('open', function() {
var stats = fs.statSync('file.mp3');
var fileSizeInBytes = stats["size"];
// If the start or end of the range is empty, replace with 0 or filesize respectively
var bytes_start = range[0] ? parseInt(range[0], 10) : 0;
var bytes_end = range[1] ? parseInt(range[1], 10) : fileSizeInBytes;
var chunk_size = bytes_end - bytes_start;
if (chunk_size == fileSizeInBytes) {
// Serve the whole file as before
response.writeHead(200, {
"Accept-Ranges": "bytes",
'Content-Type': 'audio/mpeg',
'Content-Length': fileSizeInBytes});
filestream.pipe(response);
} else {
// HTTP/1.1 206 is the partial content response code
response.writeHead(206, {
"Content-Range": "bytes " + bytes_start + "-" + bytes_end + "/" + fileSizeInBytes,
"Accept-Ranges": "bytes",
'Content-Type': 'audio/mpeg',
'Content-Length': fileSizeInBytes
});
filestream.pipe(response.slice(bytes_start, bytes_end);
}
});
这个答案的部分灵感来自github的一个要点。请看这里-谢谢levi,这当然是问题所在。我将发布一个带有特定于节点的代码的答案。