我正在尝试仅使用nodejs发送音频文件的一部分,例如60秒到100秒。我不想使用时间范围src='path/to/audio.mp3#t=60,100'
,因为我不想从服务器发送整个文件只是为了播放几秒钟。
因此,我必须发送部分数据块。问题是我不知道所需时间范围的字节范围。我假设时间和字节是线性的,所以我尝试使用与总时间等效的时间范围来计算字节范围。它仅发送40秒的剪辑,但它在错误的时间开始播放。
请我如何获得正确的时间。
var start = 60;
var end = 100;
var track = "/path/to/audio.mp3";
var total = Math.ceil(probeData.format.duration); //total length of audio in seconds
var start_ratio = (start/total); //ratio of the starting position
var end_ratio = (end/total); //ratio of the ending position
var start_chunk = Math.ceil(start_ratio * file_size); //using it on the file_size
var end_chunk = Math.ceil(end_ratio * file_size);
var chunksize = (end_chunk - start_chunk) + 1;
var file = fs.createReadStream(track, {start: start_chunk, end: end_chunk});
res.writeHead(206, {
"Content-Range": "bytes " + start_chunk + "-" + end_chunk + "/" + file_size,
"Accept-Ranges": "bytes",
"Content-Length": chunksize,
"Content-Type": "audio/mp3"
});
file.pipe(res);
最佳答案
只要您的服务器支持正常的字节范围请求,浏览器就不会从服务器中获取整个文件。它可能会提出两个请求。首先带有头Range: bytes=0-
,在解析必要的元数据后,它将立即中止。它应该在第二个请求之后跟它发送一个带有Range: bytes=61234-105678
之类的 header ,或者类似这样的请求,即仅获取所需的字节范围以在指定的时间之间播放音频。