在NodeJS中使用mp3文件以用于audio标签

我在使用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', 'Content-Length': fileSizeInBytes}); filestream.pipe(response); }); 

我在设置文件的内容types之前,他们被提供,和内容的长度。

当我在页面上有文件时,我可以播放audio并获取内容的持续时间,这是当前时间。

但是当我不使用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> 

只是为了重新打开 – 当从目录中打开这个页面(不使用nodejs作为服务器)时,我可以设置audio元素的currentTime。 为什么是这样?
谢谢你的帮助。

解决scheme是为每个响应添加一个“Accept-Ranges”头,并修改对“range”头的请求的响应,从头中读取字节范围,并使用HTTP / 1.1 206响应代码提供内容。

字节标题的格式是bytes=<start>-<end> ,例如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在这里find的要点所启发的。