Node.js NodeJS mp3流在浏览器中不工作
我想从NodeJS/ExpressJS后端流式传输MP3音频文件。我在论坛中找到了一些代码(例如,在这里),但它似乎不适合我。我有以下代码:Node.js NodeJS mp3流在浏览器中不工作,node.js,express,stream,Node.js,Express,Stream,我想从NodeJS/ExpressJS后端流式传输MP3音频文件。我在论坛中找到了一些代码(例如,在这里),但它似乎不适合我。我有以下代码: const express = require('express'); const path = require('path'); const fs = require('fs'); const app = express(); app.get('/', (req, res) => { res.sendFile(path.join(__d
const express = require('express');
const path = require('path');
const fs = require('fs');
const app = express();
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.get('/api/play', (req, res) => {
var music = path.join('Z:', 'Music', 'Metallica', "Kill 'Em All", '01 - Hit the Lights.mp3');
var stat = fs.statSync(music);
var range = req.headers.range;
var readStream;
if (range != undefined) {
var parts = range.replace(/bytes=/, '').split('-');
var partialStart = parts[0];
var partialEnd = parts[1];
if (isNaN(partialStart) || partialStart == '') {
partialStart = '0';
}
if (isNaN(partialEnd) || partialEnd == '') {
partialEnd = stat.size - 1;
}
var start = parseInt(partialStart, 10);
var end = parseInt(partialEnd, 10);
var contentLength = end - start + 1;
console.log(`Streaming ${music} as ${contentLength} bytes from ${start} to ${end}`);
res.writeHead(206, {
'Content-Type': 'audio/mpeg',
'Content-Length': contentLength,
'Content-Range': 'bytes=' + start + '-' + end + '/' + stat.size,
'Accept-Ranges': 'bytes'
});
readStream = fs.createReadStream(music, { start: start, end: end });
} else {
console.log(`Streaming ${music} as ${stat.size} bytes`);
res.header({
'Content-Type': 'audio/mpeg',
'Content-Length': stat.size
});
readStream = fs.createReadStream(music);
}
readStream.pipe(res);
console.log('Done');
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
index.html基本上只是一个音频标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<audio controls="controls" preload="all">
<source src="http://localhost:5000/api/play" type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
</body>
</html>
但是,当我尝试从RestMan扩展中执行相同操作时,我会得到完整的4MB文件作为响应,其标题如下:
date: Mon, 30 Sep 2019 17:41:01 GMT
connection: keep-alive
x-powered-by: Express
content-length: 15987040
content-type: audio/mpeg
我尝试使用不同的“接受”标题“0-”从RestMan客户端手动执行,正如浏览器所做的那样,“0-2”、“0-200”、“100-200”等,我总是以正确的字节数得到正确的响应(例如,101字节表示“100-200”)。那么,为什么浏览器无法加载音频呢?即使我直接打开/api/play URL,我也只会得到一个自动生成的“video”标记,但它不会播放,同样的事情也会发生
我还尝试过MP3,文件名中没有空格或特殊字符,尝试过从没有空格或特殊字符的目录加载,从本地驱动器加载(Z:是网络连接存储),尝试过从与html相同的目录加载,总是一样的
如果你有什么想法,请帮忙。我不确定这是否是一个问题,或者是NodeJS方面缺少的东西,或者是完全其他的东西。啊,我找到了。似乎“部分内容”的回应才是罪魁祸首。我把它改成了200,现在可以用了。如果请求完整范围,可以返回200,只有在返回完整文件的一部分时才使用206吗?啊,我找到了。似乎“部分内容”的回应才是罪魁祸首。我把它改成了200,现在可以用了。如果请求完整范围,可以返回200,而仅在返回完整文件的一部分时使用206吗
date: Mon, 30 Sep 2019 17:41:01 GMT
connection: keep-alive
x-powered-by: Express
content-length: 15987040
content-type: audio/mpeg