動画配信を実現する要素技術
さて、ここまで過去の話をしてきましたが、動画配信は、現在は具体的にどのように実現されているのでしょう?
おおざっぱに説明すると、動画データを圧縮し、それらを決まった形式でHTTPを使って参照可能にして、プレイヤーで再生させれば、それだけで動画配信は実現できます。
それぞれの工程は、エンコード、パッケージング、配信(キャッシュ)、プレイヤーと呼称でき、これらを理解できれば動画配信ができるようになります(断言)。
動画データを圧縮する:エンコード
ここでいうエンコードとは、データ圧縮のことです。動画はとてつもなく情報量が多く、例えばカメラの受光素子から得られた非圧縮のデータは、1秒間で100MBに迫る容量です(FullHD 12bit 30fpsの場合、1920px×1080px×12bit×30fps=746,496,000bit=93,312,000Byte=93.312MBという計算になります)。そのため、普段目にする動画データは、確実に圧縮されていると考えてよいでしょう。圧縮には非可逆圧縮と可逆圧縮の2つがありますが、動画で主に用いられるのは非可逆圧縮です。すなわちデータ量の削減と引き換えに、映像の劣化が発生します。そのため映像作成時に出力されるデータは大きめのデータで、配信時にはさらにデータ圧縮が行われることが一般的です。
エンコードには膨大な計算量を必要とするため、それをいかにうまくやるかが工夫点となります。
また、音声についても動画ほどではありませんが、大きなデータのため圧縮が必要です。
決まった形式にする:パッケージング
動画のストリーミング再生において、プレイヤーを開くとすぐ再生が始まり、シークを行うと即座にその位置の映像が流れます。当たり前のことですが不思議だと思いませんか?Webにおいて映像データもHTTPリクエストでやり取りされているはずなのに、映像の全データのダウンロードを行わずに再生が開始され、シークを行っても目的の再生位置の映像が即座にダウンロードされています。これを実現するために、実はエンコードされた映像や音声のデータはさらに加工されています。いわば正規化のような感じです。この工程をパッケージングと呼びます。
動画配信におけるパッケージングでは、上記のようなデータの正規化や、コンテンツ保護のための暗号化等が実施されます。これらの処理はエンコードと比較するとそこまで計算コストが掛からないため、静的ではなく動的(オンザフライ)に行うこともあります。弊社の場合は動的パッケージングを主に利用しているため、後述の配信とも密結合しています。
HTTPで転送する:配信(キャッシュ)
エンコードしているとは言え、動画データは大容量です。FullHD(1080p)の映像データも最新の技術でエンコードしたとしても1Mbps程度にはなります。仮に1Mbpsとした場合、10万人が同時にその動画を見たとすると、秒間12.5GBのデータが転送されます。(100Gb=12.5GB)
これほどのデータを安定して転送するためには多くの創意工夫が必要です。また当然ながらそこにはさまざまなコストがあります。
幸いなことに最近はCDNが充実しているので、任せてしまえば上記のような膨大なトラフィックも数分の準備で処理させることが可能です。コスト削減やさらなる工夫のために自前でキャッシュアーキテクチャを構築することもあるでしょう。
また、映像データ自体を保存することにも膨大なリソースが必要となります。弊社の場合は数十PB(数万TB)のストレージを保有しており、そちらに格納しています。
ストレージ、キャッシュ、ネットワーク等々、さまざまな技術によって安定した配信を実現しています。
再生する:プレイヤー
映像データを受け取り、再生させる仕組みを実装することでプレイヤーは動作します。再生にまつわる仕組みは概ねAPIで提供されているため、それらを操作するコードを書けば動作します。10秒スキップも「再生位置を今の再生位置+10秒に変更する」というような指示をAPIに出しているに過ぎません。他にも例えば、ブラウザにはEMEと呼ばれるインターフェースが存在しており、これによってサーバーから受け取った暗号化済み映像データを、暗号化されたまま再生エンジンに渡すことができます。この仕組みのお陰で、商用配信においてもコンテンツホルダーは映像データをコピーされる心配なく配信を行えます。
次回予告
第2回から、上記で紹介したそれぞれの項目について解説しつつ、コンテンツ保護や視聴体験を向上させる技術等の掘り下げもしていきます。次回もお楽しみに!