youtube動画の調査:その2
こんなブログ記事、誰も読まない気もしますが・・・昨日に続きyoutube動画の調査をしていました。昨日は動画フォーマットを中心に調べましたが、今日はどのように取得するかを調べていました。
途中経過の説明は長くなるので省略し、、結果としては、PCとスマホでかなり違うという感じでした。PCはWindows8とMacOSXでIE,Safari,Chrome,FireFoxで観察し、スマホはiOS6,7でSafari,youtubeアプリ、AndroidでChrome,youtubeアプリで観察しました。
PCでは普通の使い方ならブラウザ内のFlushが動画を再生するので、ブラウザによる違いはほとんどなく、どれも基本的にはリクエストURLにRangeが埋め込まれて、分割ダウンロードする感じでした。コンテントタイプはapplication/octet-stream。分割のしかたは同じ動画の同じ解像度なら、リクエストするたびに違うことはなく、同じ感じのやりとりで取得している感じです。
スマホはFlushを使わず、MP4でダウンロードするのですが、かなり強引です。URL埋め込みではなく、Rangeヘッダで最初は全体を取得しようとしますが、途中でバッファに余裕ができると切断してしまいます。コンテントタイプはvideo/mp4です。再生が進むとその先を取得するために、その先から最後までのRange指定で、また途中で切断、という動きを繰り返します。TCPのセッションの途中で切るのはあまり行儀が良いものではありません。TCPでの通信はOSがかなりバッファリングするので、アプリが自分の都合が良いところまで読んで切っても、実はOSにはもっと先まで受信できていることが多く、途中で切った割にはトラフィックが減らないことが多いのです。PCと同じようにきちんとRangeの末尾側も指定して取得すれば良いと思うのですが、なぜ違うのでしょうね。また、PCとは違い、切るタイミングは同じクライアント環境でも観るたびに違う感じです。また、ブラウザとyoutubeアプリの動きも少々違います。
さらに、iOSはRange:0-1で、2バイトだけ取得する動きが見られます。これで様子を調べてから全体取得を始める感じです。
ということで、マニアックな内容ですが、youtube動画は、動画フォーマットもたくさんあり、さらに通信のやりとりもさまざま、という感じですね。
昔のyoutubeはFLV形式を単にダウンロードしながら再生していく感じで、分割はしていなかったと思います。おそらく、最後まで観ないことが多いことや、モバイル端末での通信の不安定さを考慮して、分割するようになり、さらにFlushの有無やどのくらいキャッシュできるかなどでやりとりを変えているのでしょう。半年に1回くらい変化があるといわれていますが、今やスマホの普及により電車の中でも動画を見ている人がたくさんいる時代。配信する側も大変でしょうし、さらに回線事業者も大変なのです。