ダウンロードとストリーミング


[要約]YouTubeはTCP(https)で音声・動画を細切れに送る。ファイルとしては保存されないので、一種のストリーミングである。


ネットを使った音楽やビデオの再生方式として、ダウンロード方式とストリーミング方式に分けて説明することがよくあります。ダウンロード方式はファイルを全部取ってきてからしか再生が始まらないのに対して、ストリーミング方式は再生がすぐ始まると書いてあったり、ダウンロード方式は再生したあとでもファイルが残るけれども、ストリーミング方式ならファイルが残らないと書いてあったりします。

これら以外にプログレッシブダウンロード方式ということばも出てくるかもしれません。その場合、ふつうのダウンロード方式はファイルを全部取ってきてからしか再生が始まらないのに対して、プログレッシブダウンロード方式ならダウンロードしながら再生できると説明されています。この場合、ストリーミング方式との違いはファイルとして残るか残らないかの違いというふうに説明されています。

高校「情報」教科書には、ストリーミング方式は(TCPではなく)UDPを使うと書いてあるものも一冊ありました。

ではYouTubeはどの方式でしょうか? 授業でダウンロードとストリーミングを習ったなら、もしかしたら試験に出そうですね。

英語版WikipediaのYouTubeの項目には Dynamic Adaptive Streaming over HTTP(DASH、MPEG-DASH)を使うと書いてあります。Streaming ということばが入っていますので、ストリーミングの一種のようです。別のサイトには、HLS(HTTP Live Streaming)またはMPEG-DASHを使うと書いてあるものもありました。一方、日本語版WikipediaのYouTubeの項目には「2015年からHTML5での再生が標準になった」としか書かれていません(いずれにしてもUDPではなくTCPですので、ストリーミングはUDPだと習った人はこの時点でダウンロード確定かもしれません)。

でも、日本語版Wikipediaのプログレッシブダウンロードの項目には「プログレッシブダウンロードを使用しているサイトとしてはYouTubeやその他動画共有サイトなどがある」と書かれていて、YouTubeはストリーミングではないことになっています。なお、英語版Wikipediaにはprogressive downloadという独立の項目はなく ISO base media file format の中の Streaming というセクションで簡単に説明されています(プログレッシブダウンロード用はファイル中のメタデータがファイルの先頭にある)。

ここまでをまとめると、

ということになりそうです。ではYouTubeはファイルは残らないのでストリーミング方式でいいのでしょうか。

ここで、渋川よしきさんが書かれたReal World HTTP 第2版という本を紹介していただいたので読んでみました。この本の第8章にはHLSやMPEG-DASHのようなYouTube系のサービスが使っている方式が詳しく説明されています。この中でHLSについて「デメリットとしては「ストリーミング」と名乗っていますが実体はプログレッシブダウンロード方式になっているという点です」、MPEG-DASHについて「MPEG-DASHも、HTTPによるプログレッシブダウンロードを核としたストリーミング方式です」と書かれており、YouTube系のサービスの実態はプログレッシブダウンロードだと主張されています。しかし、プログレッシブダウンロードの定義は書かれていません。

だんだんよくわからなくなってきたので、実際のYouTubeの中身を解析してみることにしました(実は大昔に解析したことがあったのですが、そのころからかなり変わっています)。いくつか調べたところ、webm形式のビデオファイルとオーディオファイルが別々に数秒単位で細切れになって、httpsで(したがってTCPで)ダウンロードされているようです(しかし保存されている形跡はありません)。これを何と呼ぶべきでしょうか。

いろいろ説明を探したのですが、NGINXの What Is Progressive Download? というページで、プログレッシブダウンロードはファイルの先頭にメタデータがあって一つのファイルをダウンロードしながら再生することと説明されており、YouTubeのような方式は pseudo-streaming(擬似ストリーミング)と呼んでいるようです。これが一番しっくりくるように思いました。

まとめると、

のようにとりあえず整理できそうですが、高校「情報」では難しすぎるので、上二つと下二つをまとめて、

と二分するのでいいような気がします。この場合、YouTubeはストリーミングになります(ストリーミングはUDPだと書いた教科書とは矛盾するかもしれません)。

ちなみに、Zoomで出力されるMP4ファイルはメタデータが最初にあるのでそのままサーバに置けばプログレッシブダウンロードできると思いますが、メタデータが最後にあるファイルの場合は、ffmpeg の -movflags faststart オプションでメタデータを最初に持っていきます。例:

ffmpeg -i in.mp4 -codec copy -movflags faststart out.mp4

詳しくは FFmpeg の項をご参照ください。

ところで、YouTubeはTCPだと書きましたが、UDPはストリーミングに使われる?にも書いたように、HTTPなど従来TCPでやっていたことが徐々にUDPで再実装されつつあります。つまり、TCPとUDPの違いはなくなりつつあります。