読者です 読者をやめる 読者になる 読者になる

daisuke_nomura の日記

Android プログラマーな鉄道ファンのブログ

MediaElementのHTTPリクエストにCookieを無理やりセットする

この記事は、Windows Phone Advent Calendar 2013の21日目の記事です。
 

はじめに

 Windows Phoneで動画を表示する場合、MediaElementオブジェクトを使用します。
 上記コードのSourceの"hoge"をURLに書き換えることで、Windows Phoneアプリに動画再生機能を持たせることができます。
 ただし、MediaElementには制限があり、任意のCookieをセットすることができませんCookie Containerプロパティはありません。
 そのため、例えばCookieで認証情報を持ち、ユーザー管理を行っているWebサーバーにある動画を再生したい場合、問題が出てきます。
 

Windows Phone 7で対応する方法

 Windows Phone 7の場合、  
1. HttpWebRequestにCookieをセットして動画ダウンロード完了まで待つ
2. MediaStreamSourceクラスを使ってMP4のパースを行う
 
で対応できます。前者はダウンロード完了を待つ必要があり、後者はMP4のパースを自作する必要があるため、手間と時間が掛かります。Windows Phone 8ではこれ以外にもう1つ選択肢があります。
 

Cookieを使用しつつ動画を再生する方法

 CookieはWebサーバーへのHTTPリクエストにセットできればいいため、MediaElementがHTTPリクエストする先を変えてやります。変えた先でCookieをセットし、HTTPリクエストを代理で行えばいいわけです。  
 アプリ(端末)からWebサーバーへのリクエストを以下のように以下の順で行います。
 
1. StreamSocketListenerオブジェクトで81番ポートでHTTPリッスン
2. MediaElementのHTTPリクエスト先を127.0.0.1:81にする
3. StreamSocketListenerオブジェクトがHTTPリクエストを受けたら、HttpWebRequestのCookieContainerプロパティにCookieをセットした上で、WebサーバーにHTTPリクエストする
4. WebサーバーからのHTTPレスポンスを取り出し、StreamSocketListenerにそのまま流す
 
 画像に表すと以下のようになります。  

f:id:daisuke_nomula:20131221145438p:plain


 

MediaElementでCookieをセットするコード

 XAMLは先程のコードで問題ありません。C#のコードを以下のようにします。  コード説明は省きます。
 上の方で基本的な準備をし、下の方で通信の中継をしています。
 これだけで、Cookieが必要なWebサーバーにある動画を再生できます。
 

さいごに

 先ほどのコードはコンパイルしていません///
 

余談

 SmoothStreamingMediaElementにはCookieContainerプロパティがありますが、MP4のリクエスト時にはセットされません。