在NodeJS中为音频标签提供mp3文件
Serving mp3 files in NodeJS for use in audio tag
我在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);
});
我正在设置文件提供之前的内容类型和内容长度。
当我在页面上有文件时,我可以播放音频并获得内容的持续时间和当前时间。
但我不能设置它的当前时间像我可以当我不使用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作为服务器)我可以设置音频元素的currentTime。为什么会这样?
谢谢你的帮助。
解决方案是为每个响应添加一个"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上的一个要点。
相关文章:
- 如何使用javascript只加载mp3文件标题
- 获取二进制数据并将其保存为.mp3文件Javascript
- 如何将MP3文件播放到麦克风输入jQuery中
- 使链接播放.mp3文件
- JavaScript/HTML5音频:在Android Chrome中播放用户通过文件选择器加载的mp3文件
- 播放mp3文件之前,请参阅其他页面的javascript
- HTML5网络音频API wavesurfer.js在大型mp3文件上崩溃
- MP3文件未通过联机播放器播放
- 为什么不能在人行横道中选择“mp3”文件
- 我正在尝试一个接一个地播放一个 mp3 文件(一个作为介绍),但它不起作用.我该怎么做
- 是否可以使用 Javascript 或 jQuery 将 mp3 文件转换为 m4r
- 通过PHP从mp3文件中获取封面艺术并显示它
- 将 mp3 文件从另一台服务器下载到我的服务器
- 在点击时播放mp3文件与javascript
- 在主文件夹和子文件夹中搜索.mp3文件
- 离子如何创建一个mp3文件
- 基本 Web 音频 API 不播放 mp3 文件
- 节点 - 将 m3u8 流另存为 mp3 文件
- 动态路径变量播放音频.mp3文件 如何?D3 JavaScript 咖啡脚本
- 如何使用Jplayer播放多个mp3文件