HTTPライブストリーミング用のレスポンシブビデオの準備

ほとんどの人がそれを使用しており、確かに、多くの人がビデオストリームのネットワーク帯域幅への動的な適応について聞いています。 最近、これはインターネット上のオンラインビデオのほぼ必須の要件になっています。 アダプティブビデオストリームの利点は明らかです。ネットワークが時々「サグ」する場合、目に見えるページングとバッファリングなしでビデオがプレーヤーに表示され続けます。 ネットワーク帯域幅に適した画質が自動的に選択されます。



ビデオストリームの動的な適応はすでに比較的「古い」技術であるという事実にもかかわらず、最良の結果を達成する方法については多くの小さな詳細があります。 そのため、サーバー側ではよりシンプルで安価であり、そのようなビデオはできるだけ多くのクライアントと互換性があります(Web、iOS、Android、スマートTVも忘れないでください)。







ハブにはアダプティブビデオに関する記事が既にいくつかありましたので、繰り返しはせず、その仕組みと作成方法に焦点を当てようとします。



叙情的な余談 (アダプティブビデオについてできる限り簡潔かつシンプルに):



明らかに、インターネット上でビデオを配信する最も簡単な方法は、mp4ファイルを取得してHTTPサーバーにアップロードすることです。 このオプションは、ファイルが1つしかなく、非常に多くのクライアントがあり、高品質でインターネット接続ではない同じセットを持っているという点で悪いです。 ビットレートが20メガビット/秒(Blueray品質)の1080pビデオをアップロードすると、スマートフォンで視聴できなくなり、スマートフォン用のビデオ(たとえば、1メガビット/秒および320x240)をアップロードすると、55インチのテレビではひどく見えます。



さて、1つのファイルが悪いので、1つのソースからさまざまなビデオを「カット」し、モバイルから1080pまでのすべてのビットレートとすべてのフレームサイズ、1メガビット/秒から20のビットレートがあります。 しかし、問題があります。 同じスマートフォンを自宅のWi-Fi(高速)とレストラン(低速)の両方に配置できます。 同じテレビがモスクワの人々とサハリンの人々の両方に利用可能です。



次に、プレーヤーにネットワークの帯域幅を何らかの方法で確認させ、測定して、表示に必要なファイルを選択します。 最後に、別の未解決の問題は、映画が2〜3時間続き、インターネットが「たくさん」、「少し」という事実を考慮することです。 ネットワーク帯域幅測定を定期的に実行しますか? この方法は機能しますが、ネットワークの「沈下」または「加速」中に、多少なりとも「高品質」ファイルに切り替える必要がある場合はどうすればよいでしょうか? これを迅速に(そして、既に励起されたものの表示を停止することなく)行うには、新しいファイルのどこからダウンロードを開始する必要があるかを事前に知る必要があります。 残念ながら、ファイルの先頭からムービーの時間までのオフセットの比率は、ビットレートが可変であるため、非常に多くの場合非線形です。 たとえば、ジェームズボンドが別の敵を追いかけている高速シーンでは、画像が頻繁に変化してビットレートが高くなり、雲一つない空の滑らかなパノラマでは、画像はほとんど変化せず、ビットレートは低くなります。



このタスクに対処するには、事前にすべてのファイルのインデックスを作成する必要があります(「フィルムのシーン時間/ファイルの先頭からの位置」のペアを構成します。これらのペアはセグメントと呼ばれます。次のセグメントをダウンロード:シームレスなスイッチングのために、異なるビットレートからのセグメントが時間内に整列されます。





もちろん、これらの機能はすべて、ほとんどすべての最新のデバイスに長い間実装されてきました。 同じフィルムのいくつかの異なるビットレートとフレームサイズは、特定の形式でパックされています。ファイルと場所に関する情報は、特別な記述子ファイル(マニフェストと呼ばれます)に記述されています。 表示する前に、クライアントはマニフェストファイルをダウンロードし、ダウンロード元、ビデオのサイズ、サーバー上のビットレートを「理解」します。



悪いニュースは、現代の世界では、この単純なアプローチがさまざまな企業によってさまざまな時期にさまざまな方法で実装されているということです。 HTTP経由でビデオを適応的に配信する最も有名で一般的な方法のリストを次に示します。







また、マニフェストからの直接リンクの代わりに(HDSおよびスムーズストリーミング形式で)特別なセグメントアドレッシングスキームが使用される場合もあります。サーバーがこの特別なスキームを使用してクライアント要求を「計算」する場合マニフェスト



HLSの例を最もシンプルで最も広くサポートされているデバイスの形式として使用して、アダプティブビデオの準備を詳しく見てみましょう。



HLSのマニフェストは、1つの「マスタープレイリスト」と複数の「ストリームプレイリスト」からのプレイリストのグループです。 これを例で示すのが最も簡単です。 非常に短いフィルム(簡単にするために、10秒の3つのセグメントのみ)があり、 500 kbps1000 kbps2000 kbpsの 3つのビデオビットレートを作成したとします。 サーバーファイルシステムでは、たとえば次のように配置できます。



/master-playlist.m3u8 /500K/ /500K/playlist-500K.m3u8 /500K/segment0.ts /500K/segment1.ts /500K/segment2.ts /1000K/ /1000K/playlist-1000K.m3u8 /1000K/segment0.ts /1000K/segment1.ts /1000K/segment2.ts /2000K/ /2000K/playlist-2000K.m3u8 /2000K/segment0.ts /2000K/segment1.ts /2000K/segment2.ts
      
      







内部のmaster-playlist.m3u8ファイルは次のようになります(プレゼンテーションを簡単にするためにいくつかの情報を削除しました)。



 #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=500,CODECS="mp4a.40.2, avc1.640028",RESOLUTION=640x480 500K/playlist-500K.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1000,CODECS="mp4a.40.2, avc1.640028",RESOLUTION=640x480 1000K/playlist-1000K.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2000,CODECS="mp4a.40.2, avc1.640028",RESOLUTION=640x480 2000K/playlist-2000K.m3u8
      
      







m3u形式に精通している人は、何が何であるかを簡単に理解できます。 ファイルには、他のm3u8プレイリストへのリンクが3行含まれており、各リンクの上の「#」アイコンでコメントされた行には、対応するビットレートのデータが含まれています。 帯域幅、コーデック、解像度 -一般に、用語はそれ自体を表しています。 実際にはすべてのパラメーターが異なる場合がありますが、BANDWIDTHのみが異なることがわかります。 クライアントのタスクは、これらのパラメーターから、現在どのプレイリストが適しているかを理解することです。



クライアントが「良い」インターネットを持っていることを知っていて、高いビットレート(2000K)を好むとします。 クライアントは2000K /プレイリスト-2000K.m3u8プレイリストをダウンロードします。このプレイリストは次のようになります。



 #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.8849, segment0.ts #EXTINF:9.9266, segment1.ts #EXTINF:9.9266, segment2.ts #EXT-X-ENDLIST
      
      







個々のセグメントへのリンクが表示されます。秒単位の期間は、ゼロセグメントの場合、上の行で示されます(例: "#EXTINF:9.8849")。 このプレイリストをダウンロードした後、クライアントは最初のセグメントから3番目のセグメントまで再生を開始します。 セグメントを見ている間、次のセグメントがふらつきます。 クライアントが次のセグメントの出力が遅すぎると感じた場合、クライアントはダウンロードを停止し、別のプレイリスト(500K / Playlist-500K.m3u8など)から同じセグメント(映画の同じ場所)のダウンロードを開始できます。 インターネットの速度が回復すると、クライアントは再び1000Kまたは2000Kプレイリストからセグメントをダウンロードするように切り替えることができます。



HLSのシンプルさにより、事実上すべてのサーバープラットフォームからHLSを配布できます(実際、配布にはサーバー「ロジック」は必要ありません)。 個々のセグメントは、必要に応じて、可能な方法で簡単にキャッシュされます。



次に、HLSでビデオを作成およびパッケージ化するために使用できるツールを見てみましょう。 このプロセスは、3つの主要なステップで構成されています。



手順1.目的のビットレートとフレームサイズのソースファイル(.movまたはH.264の.mp4)の準備。



ここには多くのオプションがありますが、最も明白なのは無料のffmpegを使用することです。 MacOSXおよびWindows用の多くのGUIビデオエディターがあります。 この段階で上記の例の場合、平均ビットレートが500K、1000K、および2000Kの3つの.mp4または.movファイルを取得する必要があります。 すべてのプロセスで同じソースを使用することが重要です。これにより、プロセス全体の最後に、時間的に同じセグメントを取得できます。



たとえば、元のmovie.mp4ファイルがある場合(ビットレートが2000Kを下回らないと仮定)、次のようにffmpegを実行するだけで十分です(キーはサウンドトラックをそのまま使用でき、ビデオのビットレートが変更されることを示します)。



 $ ffmpeg -i movie.mp4 -acodec copy -vb 500K movie-500K.mp4 $ ffmpeg -i movie.mp4 -acodec copy -vb 1000K movie-1000K.mp4 $ ffmpeg -i movie.mp4 -acodec copy -vb 2000K movie-2000K.mp4
      
      







ステージ2. 1ビットプレイリストの作成。



次に、m3u8プレイリストと各ムービーの* .tsセグメントのセット-* K.mp4を作成する必要があります。 セグメントが異なるビットレート間で同期していることが重要です。 ffmpegはmp4をm3u8 +セグメントに「チョップ」できることをすぐに言わなければなりませんが、1つのビットレートの枠組み内でのみです。 残念ながら、マスタープレイリストは手動で作成する必要があります。 それほど難しいことではありません(最低限のバージョンではテキストエディタで十分です)が、もしあなたがApple iOSまたはOSX開発者であるなら、 HTTP Live Streaming Toolsパッケージ(MacOSX用)をお勧めします 。 いくつかのプログラムが含まれていますが、そのうち2つが便利です: mediafilesegmentervariantplaylistcreatorです。 1つ目はmp4ファイルをm3u8プレイリストと「スライス」セグメントに変換し、2つ目はいくつかの1ビットプレイリストを収集してマスタープレイリストにします。



そのため、前の手順で取得した3つのファイルから3つのプレイリストを作成します(ムービー-*。Mp4ファイルは現在のフォルダーにあると想定されます)。



 $ mkdir 500K $ mediafilesegmenter -I -f 500K -B segment movie-500K.mp4 $ mkdir 1000K $ mediafilesegmenter -I -f 1000K -B segment movie-1000K.mp4 $ mkdir 2000K $ mediafilesegmenter -I -f 2000K -B segment movie-2000K.mp4
      
      







少し説明:



-Iスイッチでは、特殊なファイル(バリアントplist)を作成する必要があります。これは、後でvariantplaylistcreatorプログラムで必要になります。



-f 500Kスイッチは、「スライスされた」セグメントを追加するディレクトリ(500K)を示します。



-Bセグメントスイッチは、どのセグメントファイルを呼び出す必要があるかを示します(数字と拡張子.tsで補足されるプレフィックス)。



この段階では、セグメントファイル、3つのプレイリスト、各フォルダーに1つ、拡張子が.plistの3つのファイルで満たされた3つのフォルダーが必要です。 シングルビットプレイリストは、デフォルトでprog_index.m3u8と呼ばれます。 クライアントでそれらがどのように再生されるかを同時に確認できます。そのためには、それらをHTTPサーバーに配置し、クライアント上のこれらのprog_index.m3u8のいずれかで表示を開始する必要があります。



ステージ3。1つのマスターに3つの別々のプレイリストを収集します。



これを行うには、 variantplaylistcreatorを使用します 。 次のように始まります(この例では):



 variantplaylistcreator -r -o movie.m3u8 \ 500K\prog_index.m3u8 movie-500K.plist \ 1000K\prog_index.m3u8 movie-1000K.plist \ 2000K\prog_index.m3u8 movie-2000K.plist
      
      







-rスイッチでは、いわゆる解像度タグ(ビデオフレームサイズ)を指定する必要があります。 一般に、それは必要ではありませんが、異なる解像度(たとえば、モバイル品質、480pおよび1080p)の複数のビデオを1つのマスタープレイリストにパックする場合、指定する必要があります。 この場合、クライアントはマスタープレイリストから直接、使用可能なアクセス許可を認識します。



-o movie.m3u8スイッチは、出力ファイル(マスタープレイリスト)の名前を示します。



コマンドラインの残りの部分は、前の手順で取得した各ビットレートのプレイリストとplistのペアです。



これで、 movie.m3u8マスタープレイリストが作成されました。 現在のディレクトリとサブディレクトリをHTTPサーバーにアップロードして、クライアントでmovie.m3u8ファイルの表示を開始できます。 ちなみに、* .movファイルは不要になりました。コンテンツが占有するスペースを減らすために、フォルダーから削除できます。



現時点ではこれですべてですが、このトピックが尊敬されるコミュニティにとって興味深いものである場合は、今後の投稿で代替のオーディオトラックと字幕をHLSに追加する方法、およびMPEG-DASHをHLSのスマートテレビと互換性を持たせる方法を説明します。 ご清聴ありがとうございました。



All Articles