YouTube・Netflix の動画はなぜ途切れず再生されるのか — ストリーミングとコーデックの基礎
YouTube や Netflix で動画を押すと、ほとんど待たずに再生が始まります。インターネットが遅くなると画質が一瞬ぼやけることはあっても、たいていは途切れません。二、三時間の映画も前もって全部ダウンロードしていないのに、どうしてすぐ見られるのでしょうか。
今回の記事では、動画がなぜ途切れず再生されるのか、その土台にあるストリーミングとコーデックとは何かを、コードなしで解きほぐしていきます。
動画は、まるごとではなく少しずつ受け取ります #
動画を見るというと、ファイルをまるごとダウンロードするのを思い浮かべがちですが、ストリーミングはそうではありません。動画を細かい断片に分け、いま見る部分を先に受け取って再生しながら、次の断片を続けて受け取っておきます。
水をくんで飲むのにたとえられます。浴槽をいっぱいに満たしてから飲むのではなく、コップでくんで飲みながら次のコップを満たす、という具合です。だから二時間の映画も、最初の数秒を受け取れば、すぐ始められ、見ているあいだに続きが満たされていきます。再生位置より少し先に受け取っておくこの余裕のぶんのおかげで、ちょっと遅くなっても途切れません。
コーデックは、重い動画を圧縮します #
動画はデータがとてつもなく大きいです。1 秒に何十枚もの絵が流れるようなものなので、手を加えていない動画は短くても容量が膨大です。そのままではとても速く送れません。
そこで動画は、コーデックという技術で圧縮して送ります。先に画像の圧縮で見たように、人の目に気づかれにくい情報を削り、前後の場面で変わっていない部分はくり返し書かないようにして、容量を大きく減らします。受け取る側では、この圧縮を解いて、ふたたび動画に広げます。送るときに圧縮し、見るときに解くこの一組がコーデックです。
ネットワークに合わせて、画質が変わります #
ストリーミングの賢いところは、画質を状況に合わせて変えることです。サービスは、同じ動画を複数の画質であらかじめ用意しておきます。そして、見る人のインターネットが速ければ高い画質の断片を、遅くなれば低い画質の断片を選んで送ります。
これを適応型ストリーミングと呼びます。ネットワークが遅くなったとき、動画が止まる代わりに一瞬ぼやける経験が、まさにこれです。途切れさせて待たせるより、画質を下げてでも再生を続けるほうがよい、と考えているのです。
動画は、近いところから受け取ります #
動画は重いので、遠いところから受け取ると遅くなります。そこでサービスは、先に扱った CDN を積極的に活用します。人気のある動画を世界じゅうの近いサーバーにあらかじめ複製しておき、ユーザーは自分にもっとも近いサーバーから受け取ります。
おかげで、遠く離れた本社のサーバーまで行く必要なく、近いところから速く断片を受け取れます。細かく分けた断片、コーデックで減らした容量、近い CDN がかみ合って、途切れない再生を作ります。
だから、動画を扱うとき #
動画をサービスにアップロードしたり扱ったりするときは、いくつかの点を一緒に押さえるとよいです。元の動画を高すぎる画質だけにしておくと配信が重くなるので、複数の画質で用意しておくほうがユーザー体験によいです。自動再生は便利ですが、モバイルでデータを多く使わせることがある点も念頭に置く必要があります。
生放送も似た原理で動きますが、断片をまとめて送る処理が入るために、画面が実際より数秒遅れて届きます。ライブのチャットと画面のあいだに時間差を感じるのは、ここに理由があります。
なぜ非開発者が知っておくと仕事が楽になるのか #
- 再生の問題を理解できます。 動画が途切れたり画質がばらついたりするとき、それがネットワークと適応型ストリーミングの働きだと知って説明できます。
- 費用と品質を見積もれます。 動画が CDN で配信されると知っていれば、動画の多いサービスで配信費用がなぜ大きいのかを理解できます。
- コンテンツを適切に用意できます。 複数の画質や自動再生、データ使用を知っていれば、動画をアップロードするときにユーザーの環境を一緒に考えられます。
まとめ #
今日は、動画が細かい断片で少しずつ配信され、コーデックで圧縮され、ネットワークに合わせて画質を変え、近い CDN から受け取って途切れず再生されることを見てきました。まるごと受け取るのではなく、前もって少し先に受け取っておく、という点が肝心です。
動画を速く届ける CDN とキャッシュが気になればなぜ「キャッシュを消してみて」と言うのか — キャッシュと CDNを、コーデックが容量を減らす土台である圧縮が気になれば画像ファイルはなぜ種類が多いのかを一緒に読んでみることをおすすめします。