我正在尝试仅使用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 ,或者类似这样的请求,即仅获取所需的字节范围以在指定的时间之间播放音频。

10-05 20:50
查看更多