現在DirectShowとvc++ expressでmpegの動画ファイルを再生するプログラムを作っています
参考にしたページはこちらですhttp://www.geekpage.jp/programming/dire ... letion.php
今やりたいことは、用意した動画ファイルを再生して、その再生が終わったらすぐに次の動画ファイルを再生するということです
#include <stdio.h>
#include <dshow.h>
#define FILENAME L"c:\\test1.mpeg"
int main()
{
IGraphBuilder *pGraphBuilder;
IMediaControl *pMediaControl;
IMediaEvent *pMediaEvent;
long eventCode;
CoInitialize(NULL);
CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder,
(LPVOID *)&pGraphBuilder);
pGraphBuilder->QueryInterface(IID_IMediaControl,
(LPVOID *)&pMediaControl);
pGraphBuilder->QueryInterface(IID_IMediaEvent,
(LPVOID *)&pMediaEvent);
MOVIE_START:
pMediaControl->RenderFile(FILENAME);
pMediaControl->Run();
// 一つ目の引数はタイムアウトです。
// 例えば、-1の部分を2にすると2秒でタイムアウト。
pMediaEvent->WaitForCompletion(-1, &eventCode);
switch (eventCode) {
case 0:
printf("timeout\n");
break;
case EC_COMPLETE:
printf("complete\n");
break;
case EC_ERRORABORT:
printf("errorabort\n");
break;
case EC_USERABORT:
printf("userabort\n");
break;
}
goto MOVIE_START;
pMediaControl->Release();
pGraphBuilder->Release();
CoUninitialize();
return 0;
}
このプログラムを実行したら思い通りに動画が再生され、再生が終わり次第先頭からまた再生が始まるのかとおもっていたのですが、実際は「動画の再生が終わったら、そのウインドウは動画の最後のコマを表示したままになり、RenderFileに到達したところでまた新しいウインドウが生成され、そのウインドウ上で動画が再生される」といったことになりました。
MSDNのIGraphBuilder::RenderFileのページhttp://www.google.co.jp/url?url=http:// ... e82FFX9zMQには
>RenderFile メソッドは、グラフからフィルタを削除しない点に注意すること。
>RenderFile を 2 回呼び出すと、2 回目の呼び出しでは単純に追加のフィルタがグラフに追加される。
>グラフを実行すると、両方のソースが同時に再生される。
と書かれていました。
多分これが意味するところは、RenderFileを実行した時に、RenderFileの中でフィルタというものを作っているから、同じウインドウで違う動画を再生したいならRenderFileを自分で作って、その中でフィルタを再利用すればいい、ということだと思います。
ただ、どうにも私の知識ではRenderFileを自分で書いてみるということは出来ませんでした。
RenderFileを自分で書く以外にも同じウインドウで違う動画を再生する方法がありましたら教えて下さい。
よろしくお願いします。