シーク時間を短縮するためにHLSストリームを最適化するにはどうすればよいですか?

4
2022.03.07

私は現在、ランディングページの背景としてビデオを使用するWebアプリケーションに取り組んでいます。ビデオ自体は約10秒とかなり短いですが、コンテンツがシームレスにループするように編集されているため、それは問題ではありません。 VLCでビデオを再生するとき、焦点を合わせない限り、ビデオが再開する場所を検出することはほとんど不可能です。私はあなたにビデオ自体が問題ではないことを保証するためにこれを言います。

代わりに、ビデオをHLSストリームに変換すると問題が発生します。私はさまざまなオプションとパラメーターを試しましたが、これまでで最もうまくいったのはffmpeg -i video.mp4 -codec: copy -hls_time 1 -hls_list_size 0 -hls_segment_filename 'segment%1d.ts' -f hls stream.m3u8です。アプリケーションでビデオをソースとして単純に添付できない理由は、ファイルが約15MBとやや大きいためです。これはモバイルデータや接続不良には適していませんが、クライアントは品質を損なうことはできないと主張しました。ここで、ビデオをチャンクでストリーミングして、最初のチャンクを受信するとすぐに再生できるようにすることを考えました。別の方法は、再生が行われる前に、ポスター画像をかなりの時間見ることです。これまでの実装には本当に満足していますが、シームレスループにはこの問題があります。

ビデオが再起動するたびに、シームレスループを台無しにするほど目立つ最小限の遅延があります。元のビデオをソースとして添付しただけでは問題ありませんでしたが、ストリームを再生すると遅延が発生します。

質問:遅延を減らす、あるいは取り除く方法でストリームを最適化することは可能ですか?

必要に応じて、問題の簡単なデモンストレーションを提供することもできますが、それにはJavaScriptコードが含まれます。現在のアプリケーションでシームレスにループできる、自分で作成していない他のHLSストリームをいじくり回したため、問題はコードにあるのではないと考えました。

回答
4
2022.03.08

これはビデオの問題ではありませんが、HLSの動作の問題です。チャンクリストをダウンロードしてから、最初のチャンク(複数形)をダウンロードする必要があります。

この問題を回避する通常の方法は、複数のループを含むチャンクリスト(m3u8)を作成し、常に同じチャンクを何度も参照することです。

例えば

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXTINF:1.0000,untitled
segment0.ts
#EXTINF:1.0000,untitled
segment1.ts
#EXTINF:1.0000,untitled
segment2.ts
...
#EXTINF:1.0000,untitled
segment9.ts
#EXTINF:1.0000,untitled
segment0.ts
#EXTINF:1.0000,untitled
segment1.ts
...
#EXTINF:1.0000,untitled
segment9.ts
#EXTINF:1.0000,untitled
segment0.ts
#EXTINF:1.0000,untitled
segment1.ts

等々。このように、それは繰り返される10秒のビデオではなく、常に同じチャンクで構成される長く連続したビデオであるため、繰り返しの問題に悩まされることはありません。