webdevqa.jp.net

負荷を超えてYouTube動画をキャッシュする

ロードされたYouTubeビデオをページロード全体でキャッシュするようにブラウザに強制する方法はありますか?

つまり、動画の読み込みがすでに開始されている(または完全に読み込まれている)動画ページを更新すると、プレーヤー/ブラウザは動画全体の再ダウンロードを開始しますevenすでにキャッシュにあるバージョンを使用する代わりに、同じ解像度を使用する場合。その動作を変更する方法はありますか?

上記は、Flashプレーヤーと実験的なHTML5プレーヤーの両方を使用した場合に観察されます。

4
Chris

編集:以下に書いたことはHTML5バージョン(ブラウザがすべてを制御する)にも当てはまります。Flashバージョンでは、Flash設定も重要な場合があります。


残念ながら、特にYouTubeに関しては、ケースは非常に複雑です(おそらく、他のビデオサイトではもっと単純です)。

まず、Firefoxがオーディオ/ビデオファイルをキャッシュしている場合、これらのabout:config設定は次のことに影響する可能性があります。

browser.cache.disk.enable
browser.cache.memory.enable
browser.cache.disk.capacity
browser.cache.disk.max_entry_size
browser.cache.memory.max_entry_size

2種類のキャッシュの少なくとも1つを有効にし、適切なキャッシュサイズを設定し、さらにmax_entry_sizeを十分に高くする必要があります。最初は、max_entry_sizeはそれほど高くありませんこれは理にかなっています。HDVEVOビデオを保存するためにキャッシュの半分をワイプしたくないからです。

さて、ブラウザ側は問題ありません。次のステップは、サーバー側のキャッシュ制限です。私はランダムなYouTubeビデオを開きました(ユーザーがアップロードしたもので、著作権で保護されたものではありません。異なる場合がありますが、チェックしていません)。FLVファイルの応答ヘッダーは次のとおりです(Fiddlerで取得)。

HTTP response headers, Fiddler

  • Cache-control: privateは、ファイルをブラウザにキャッシュできるが、中間キャッシュ(ISPキャッシュなど)ではキャッシュできないことを意味します
  • Expiresmax-ageの両方が指定されている場合、 max-age wins

    14.9.3基本的な有効期限メカニズムの変更

    応答にExpiresヘッダーとmax-ageディレクティブの両方が含まれている場合、Expiresヘッダーがより制限されていても、max-ageディレクティブはExpiresヘッダーをオーバーライドします。

これまでのところ、max-ageは、ブラウザでローカルに最大6時間キャッシュできることを意味します。

ただし、ページを更新するか、新しいタブにロードして、HTTPリクエストのリストを比較してみましょう。

http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?upn=mY2b-T1WqcI&...
http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?upn=U175csZ9oyw&...

YouTubeは、再生回数を追跡したり、不正使用と戦ったり(予測できないビデオURLを使用したりするため)、その他のパラメータを追加しているようです。

新しいタブで開くと、さまざまなサーバーがターゲットになっているのを見たこともあります(ロードバランサーが機能しています)。

http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?..
http://o-o---preferred---sn-25g7rn7s---v12---nonxt5.c.youtube.com/videoplayback?..

これは、FlashベースおよびHTML5ベースのビデオ視聴でも同じです。

URLが異なるため(これが1文字であっても)、ブラウザーはビデオ全体を再ダウンロードする必要があります。

毎回異なる動画URLがターゲットになっているのはなぜですか?これは、次のような動画のリクエスト元のURLが原因です。

http://www.youtube.com/watch?v=[[videoid]]
http://youtube.googleapis.com/v/[[videoid]]

応答ヘッダーがあります

Cache-Control: no-cache

つまり、ブラウザはこのページをキャッシュすることをまったく許可されていません。必要なサーバーへのリクエストがあるたびに、サーバーは新しい200のOK応答と、ビデオのクエリに使用されるさまざまなパラメータで応答します。

他のビデオサイトはそれほど制限的ではない可能性があるため、ロードの間にビデオをキャッシュすることができます。

-

IE8でビデオ(約5 MB)を開くと、さらに興味深いことに気づきました。 Firefoxでは、ビデオ全体が1つのストリームとしてロードされます。 IE8では、3つの〜1.7MBチャンクとして送信されます。おそらく、いくつかの内部IE大きなファイルをうまく処理できないこと。

-

キャッシュを有効にする方法は?

Firefoxのアドオン、またはYouTube HTTP応答から適切なキャッシュ関連のヘッダーを削除または置換するFiddlerスクリプトを記述して、ブラウザーに許可されていることをごまかすことができます。次に、他のすべての要件が満たされている場合、ブラウザはより積極的にキャッシュし、ロード全体でビデオを保持します。

2
jakub.g