Javascript:从特定时间范围发送部分音频块

问题描述:

我试图只发送音频文件的一部分与nodejs,从60秒到100秒。我不想使用时间范围src='path/to/audio.mp3#t=60,100',因为我不想将整个文件从服务器发送到只播放几秒钟。Javascript:从特定时间范围发送部分音频块

所以我必须发送部分块。问题是我不知道我需要的时间范围的字节范围。我认为时间和字节是线性的,所以我尝试使用总时间的等价时间范围来计算字节范围。它只发送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); 
+0

我想你需要解析它的帧,看看这个https://github.com/audiocogs/mp3.js/blob/master/src/decoder.js –

我不希望使用时间范围src='path/to/audio.mp3#t=60,100',因为我不想从服务器发送整个文件,只打了几秒钟。

为您的服务器支持正常字节范围请求,则浏览器将不会被取出由服务器的整个文件这么久。它可能会提出两个请求。首先标题为Range: bytes=0-,它会在解析必要的元数据后立即中止。它应该跟着第二个请求,如Range: bytes=61234-105678或类似的东西,只会提取所需的字节范围,以在指定的时间之间播放音频。

+0

我正在使用字节范围请求已经可以发送'Range:bytes = 61234-105678'。我想知道的是如何获得什么部分的音频在几秒钟内对应于什么范围的数据字节。我现在所需要的时间范围和播放时间(例如,60-70秒将播放10秒的文件),但它不会在文件正确的时间开始播放(60-70秒的例子实际上播放的是13秒--23秒) 。我如何正确计算范围? – iKey

+0

@iKey让浏览器通过使用'src'path/to/audio.mp3#t = 60-100''语法来做到这一点。浏览器将通过从服务器请求整个文件来解析音频文件中的元数据。一旦它成功解析了元数据(不下载整个文件),它就会中止该请求。最后它会以正确的偏移量进行附加的字节范围请求。 – idbehold