gpt4 book ai didi

javascript - 在 NodeJS 中提供 mp3 文件以用于音频标签

转载 作者:行者123 更新时间:2023-11-28 03:07:12 24 4
gpt4 key购买 nike

我在 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 作为服务器)我可以设置音频元素的当前时间。这是为什么?
感谢您的帮助。

最佳答案

解决方案是为每个响应添加一个“Accept-Ranges” header ,并修改对具有“范围” header 的请求的响应,从 header 读取字节范围并使用 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 上的一个要点,发现 here .

关于javascript - 在 NodeJS 中提供 mp3 文件以用于音频标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32083781/

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