2016-05-31 37 views
1

我試圖只發送音頻文件的一部分與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 –

回答

0

我不希望使用時間範圍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