2016-05-31 4 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'を使用したくありません。

サーバーが通常のバイト範囲要求をサポートしている場合、ブラウザはサーバーからファイル全体をフェッチしません。おそらく2つの要求をするでしょう。最初にヘッダーRange: bytes=0-で、必要なメタデータを解析した後すぐに中断します。 Range: bytes=61234-105678のようなヘッダーを持つ2番目の要求や、指定した時間の間にオーディオを再生するために必要なバイト範囲だけを取得するようなもので、それをフォローする必要があります。

+0

私はバイトレンジリクエストを使用していますすでに、私は 'Range:bytes = 61234-105678'を送ることができます。私が知りたいのは、何秒間のオーディオの部分がどの範囲のデータバイトに対応するかを取得する方法です。私は今、時間範囲と演奏(例えば、60秒〜70秒はファイルの10秒を再生する)を取るが、ファイルの適切な時間に開始しない(60秒〜70秒の例は実際に13秒〜23秒を演奏する) 。範囲を正しく計算するにはどうすればよいですか? – iKey

+0

@iKeyブラウザは 'src'path/to/audio.mp3#t = 60-100''構文を使ってそれを行います。ブラウザは、サーバーからファイル全体を要求することによって、オーディオファイルのメタデータを解析します。その後、(ファイル全体をダウンロードすることなく)メタデータを正常に解析したら、その要求を中止します。最後に、正しいオフセットで追加のバイト範囲要求を行います。 – idbehold

関連する問題