MPEGファイルを再生する(ダウンロード再生)

DirectShowを使ってローカルマシン内にある映像ファイルを再生する方法を説明しましたが、同様の方法でネットワークからダウンロードしながら再生を行うコードも簡単に作成できます。 ここでいうダウンロードとは、HTTPでのダウンロードです。 ここでは、DirectShowを使ってHTTP経由でMPEGファイルをダウンロードしながら再生する方法の説明をしたいと思います。 (注意)ここの例では、サンプルを簡潔にするためにエラー処理を書いていません。

とりあえず、コードを書いてみる

まず、何も考えずに以下のコードを書いてみましょう。 「http://localhost/butterfly.mpg」というURLに置いてあるMPEGファイルを再生します。 「localhost」は自分のマシンを表しています。 下記サンプルコードを試すために、ローカルマシンでapache(フリーのWWWサーバ)を動かしてMPEGファイルを置いておきました。 URL部分は適当に変更して試してください。


#include <stdio.h>

#include <dshow.h>

#define	URL L"http://localhost/butterfly.mpg"

int
main()
{
 IGraphBuilder *pGraphBuilder;
 IMediaControl *pMediaControl;

 // COMを初期化
 CoInitialize(NULL);

 // FilterGraphを生成
 CoCreateInstance(CLSID_FilterGraph,
	NULL,
	CLSCTX_INPROC,
	IID_IGraphBuilder,
	(LPVOID *)&pGraphBuilder);

 // MediaControlインターフェース取得
 pGraphBuilder->QueryInterface(IID_IMediaControl,
	(LPVOID *)&pMediaControl);

 // Graphを生成
 pMediaControl->RenderFile(URL);

 // 再生開始
 pMediaControl->Run();

 // 再生中にプログラムが終わってしまわないように
 MessageBox(NULL,
	"Block Execution",
	"Block",
	MB_OK);

 // 資源を解放
 pMediaControl->Release();
 pGraphBuilder->Release();

 // COM終了
 CoUninitialize();

 return 0;
}

このコードが行っている事は、「MPEGファイルを再生する」で行ったMPEGファイル再生と全く同じ事を行います。 ただし、MPEGファイルを取ってくる場所が違っています。 上記サンプルでは、手元のPCに入っているファイルではなく、WEB経由でMPEGデータをダウンロードしています。 WEB経由でMPEGデータをダウンロードして再生するというと、非常に難しい事をしているように思えますが、難しい部分は全部DirectShowがやってくれるので非常に簡単にHTTPダウンロード(ストリーミング)再生が出来てしまいます。 DirectShowは、RenderFileの引数がURLである場合には、内部で勝手にFile Source(URL)というソースフィルタ(Source Filter)を利用することによりこれを実現しています。

Dirctshowでは、プログラムを書くときにファイル名をURLに書き換えるだけでダウンロード再生ができてしまいますが、ファイルから再生することとネットワークから取得して再生することは技術的には大きく異なります。 そのため、実際に動作させるときには微妙な違いが発生する場合があります。 例えば、ネットワーク経由の方が再生開始が遅くなりがちです。 これは、ネットワークから取得する方がローカルファイルから取得するよりも時間がかかることと、再生の途切れを抑制するためにDirectShow内部でバッファリングを行っているためであると思われます。 また、ネットワークからのダウンロードはネットワークの状態に大きく影響を受けます。 ネットワークが混雑している場合には再生が途切れたり、最悪の場合には途中で再生が終わってしまいます。

以上のように、ダウンロード再生は使うときに多少違いはありますが、プログラムを書くのは非常に簡単です。 色々実験して楽しんでみてください。