2009-04-05 12 views
3

私はビデオポッドキャストのサポートをメディアブラウザに追加することに本当に関心を持っています。TCPソケットを使用してローカルでビデオをプロキシする

利用可能なビデオポッドキャストをナビゲートし、インターネットからストリーム配信できるようにしたいと思います。それは本当に簡単ですメディアプレーヤーなどは、幸せにクラウドに住んでいるファイルを再生します。

問題は、これらのファイルをローカルにキャッシュして、その後の同じエピソードの視聴にストリーミングが含まれず、代わりにローカルファイルが再生されることです。

HttpListenerをホストしていないのですが、メディアプレーヤーがファイルのビット数を尋ねると、HttpListenerをダウンロードしてローカルに保存してください。次回にユーザーがファイルを再生するときには、すでにファイルの一部がローカルに保存されています。

HttpListenerをプロキシとして使用するサンプルコードを知っている人はいますか?

EDIT

アイデアが唯一のMP3や楽章のようなプロキシの簡単なストリーミングコンテンツになります。 賞金は実際の実装に移ります。ここで

は、私が希望のAPIです:

// will proxy a uri on the local port, if cacheFile exists it will resume the 
// download from cacheFile. 
// while the file is downloading it will be name cacheFile.partial, after the 
// download is complete the file will be renamed to cacheFile. 
// Example usage: ProxyFile("http://media.railscasts.com/videos/176_searchlogic.mov", 8000, @"c:\downloads\railscasts\176_searchlogic.mov") 
// 
// Directly after this call http://localhost:8000 will be the proxy stream, it will be playable locally. 
void ProxyUri(Uri uri, int port, string cacheFile) 

編集2

HttpListenerはかなり見込みがない探しているHttpListener sがいるように見えるように私はおそらく、TCPソケットレベルでの作業を行う必要がありますプログラムを管理者として実行する必要があります。これは本当に面倒なことになります。

+0

実装を提供する前に...要件を明確にしたいと思います。あなたがプロキシを提供するだけでなく、ダウンロードするコンテンツをキャッシュして、ユーザーが再生したいときに毎回コンテンツをラウンドトリップする必要がないように思えます...そうですか? –

+0

@ジャスティン、はい、完全に、APIで拡張されます。 –

+0

私は自分の答えを要点へのリンクで更新しました。 –

答えて

3

私はHttpListenerでこれまで何もしていなかったので、これは自分自身をスピードアップするのにはちょっとしたエクササイズになると思っていました。私はそれをProxyListenerクラスとして実装し、そのコンストラクタは指定したProxyUri関数のパラメータをとります。インスタンスを取得したら、Startメソッドを呼び出すことでリスンを開始します(潜在的にダウンロードする)。完了したら、Cleanupに電話してください。

粗いエッジが1つまたは2つありますが、基本的には問題ごとに動作します。これをテストするために、Programクラスのコンソールアプリケーションとしてビルドしました。このクラスは(uri、port、filename)からなる入力行を受け取り、スペース区切りでProxyListenerインスタンスを作成して起動します。このコンソールアプリケーションを実行し、適切な行をタイプすると、ダウンローダが起動します(コンソールへの進捗状況の出力)。同時に、例えば次のことができます。 IEを起動し、指定されたポートからファイルを取得すると、ダウンローダがまだ動作している間にダウンロードできます。 「アップローダ」の進行状況もコンソールに表示されます。

私はここにそれを貼り付けるのに少し問題があります。それは大きさによるかもしれません(それはそれほど大きくはありませんが、ここに通常見られるスニペットよりも大きい - ProxyListenerクラスは200行以下のものです)。興味深いと聞こえますか?もしそうなら、私はペーストビンにそれを掲示し、この答えをリンクで更新するでしょう。

更新:投稿者はgistです。

HttpListenerに必要なので、プログラムを実行するには管理者権限が必要です。

アップデート2:特定の状況下ではHttpListenerを実行するには管理者権限を持っている必要はありません。 this linkおよびthis oneを参照してください。アイデアは、インストール時にURL名前空間を予約できる場合、その名前空間を聞いているユーザーは管理者権限を持っている必要はないということです。

+0

長いコードスニペットで悪いことになっていることはよく知られていますが、http://gist.github.com/の代わりに要点を投稿してみてください。このコードをmediabrowser(www.mediabrowser.tv)で使用してもよろしいですか? –

+0

いいえ、心配しないで。結局のところ、あなたはあなたの質問でそれを言いました。 –

+0

それは私が望んでいたように挑戦的に見えます(まだサポートを再開するのはとても素敵です)。他の人にもこの機会を与えてもらいますが、48時間以内に他に解決策がなければ、あなたに賞金を授与します。 ...サイドノート、コードはGPLの下でライセンスされており、プロジェクトはMITの下にありますので、ライセンスの計算上の問題が少しあります。 –

0

ストリーミングは保存されるようには設計されておらず、これらのプロトコルも非常にカスタムであり、実装が非常に複雑です。ストリーミングセッションは、模倣するのが非常に難しい多くの検証と同期を行います。もちろん、それは不可能な仕事ではありませんが、それはかなり大きな仕事です。それ以外の方法は、ローカルメディアファイルとして読み込んで保存し、それを参考にすることです。 Windows Mediaエンコーダを使用してストリームを読み込み、ストリームデータをローカルファイルとして書き込むことができますが、それでもコピープロテクトされたデータを作成することはできません。

+0

Akash、私はダウンロード可能なファイルだけをプロキシストリームにするつもりはない。例えば.. http://www.somewhere.com/xyz.wmv、多くのフォーマット、例えば。 mp3は、ファイル全体をダウンロードする前に使用可能です。 –

0

キャッシング機能を備えたHTTPプロキシの使用を検討しましたか?

同様:mod_proxymod_cache

  • Squid
    • Apache httpdは、あなたのアプリケーションは、Webキャッシュコンポーネントを持つようにしたい場合は、私が提案するもWeb Cacheウィキペディア

      @を参照してください。あなたは.NETでWeb Cacheの実装を探します。それをゼロからコード化する。

    +0

    本当に、私は最小限の設定で.netアプリでこれを展開したいと思います。 –

    関連する問題