6

私はnode.jsサーバーがmp3をオンザフライで変換してストリーミングしています。このストリームを消費するためにHTML5オーディオタグを使用していますが、オーディオ要素がすべての再生を終了するまでmp3の継続時間を認識しないという問題があります(明らかに)。私のサーバーはmp3を送信する前にその期間を知っているので、サーバーなどからの応答のヘッダーに期間を含めることができ、それを消費するクライアントが期間を知っている方法はありますか?

ありがとう

4

2 に答える 2

4

半年前ですが、先週出会ったばかりなので...

httpサーバーの実装に206パーシャルコンテンツのサポートを追加すると、この問題は解消されます。コンテンツ内での検索も機能し始めます。

オーディオとビデオのhtml5タグは、範囲要求を行っています。

Range: bytes=0-  or..
Range: bytes=0-12345

仕様からの適切な応答の重要な部分:

HTTP/1.1 206 PARTIAL CONTENT
Accept-Ranges: bytes
Content-Range: bytes 0-12345

206応答コードがないと、発生している動作が発生します。

私はこれをPerlでこのように行います。ここで、$ requestには、正規化されたクライアントからの要求ヘッダーが含まれています。たとえば、ほとんどの場合、SERVER_PROTOCOLには「HTTP/1.1」が含まれています

my $crlf = "\012";
if ( $request->{RANGE} && $request->{RANGE} =~ /bytes=(\d*)-(.*)$/ ) {
    $offset = $1;
    $end = $2 || $size; # end is optional in the spec.  Default to size.
    $header = $request->{SERVER_PROTOCOL} . ' 206 PARTIAL CONTENT' . $crlf .
    'Content-Range: bytes ' . $offset . '-' . $end . '/' . $size . $crlf;
} else {
    $header = $request->{SERVER_PROTOCOL} . ' 200 OK' . $crlf;
}
my $left = $end - $offset;
$header .= 'Server: ' . $SERVER_NAME . $crlf .
    'Accept-Ranges: bytes' . $crlf . 
    'Date: ' . $http_date . $crlf .
    'Content-Type: ' . ($self->simplemime($raw_path) || magic($fh)) . $crlf .
    'Last-Modified: ' . $http_date . $crlf .
    'Content-Length: ' . $size . $crlf .
    'Connection: Keep-Alive' . $crlf .
    'Cache-Control: max-age=' . $EXPIRE . $crlf . $crlf;

もちろん、要求されたコンテンツに適切な範囲のバイトを配信することにより、要求を尊重する必要があります。
クライアントは、再生速度に合わせてダウンロードを「ストール」することも多いため、MojoliciousAnyEvent、Node.jsなどの適切なイベント駆動型サーバーはスケーリングしますが、PHPなどの接続モデルごとに1スレッドはスケーリングしません。(ラチェットはハッキングやXsendfileの使用を伴うと思います)

ちなみに、ほとんどのRangeリクエストは最終的に次のようになります。

Range: bytes=0- 

これは、シークできず、キャッシュが無効になっている(そしてブラウザが実際にそれを尊重している)限り、通常のHTTP /1.1200応答のヘッダーを重要な部分に書き換えるだけで実際に回避できます。HTTP / 1.1 206応答であり、一部のコンテンツで機能します。具体的には、これはファイルの最後にメタデータが必要ないコンテンツに対して機能するようです。これらのファイルタイプの場合、最後までシークし、ファイルの先頭から再開するRangeリクエストを確認しました。このため、実際のシークを実装する方が良いですが、上記は機能します...自分の危険で使用してください。

于 2014-02-26T04:36:00.820 に答える
2

とりあえず、広くサポートされているソリューションの観点から、あなたは別のリクエストを介して(またはリンクのある種のマニフェスト内で-あなたが指すために使用するプレイリストに含まれている)そのようなものを送信するのに行き詰まっていると思いますたとえば、適切なURI)。もちろん、これは、曲が最初に追加されたときにサーバーによって動的に生成され、それ以降は静的に提供される可能性があります。

私が構築しているメディアプレーヤーでは、これに似た何かをしています-通常は.mp3メタデータ内にあるものを含むjsonファイルをダウンロードします(これは非mp3バージョンなどもサポートします)。

これは理想からはほど遠いですが、html5オーディオ/ビデオが最初の反復で解決することを意図していなかったものの1つです。

于 2012-08-27T04:15:26.330 に答える