タイムラインの作成サンプル コード
次のサンプル コードは、DES でのタイムラインの作成とプレビューの方法を示したものである。
注 : 簡潔にするために、サンプル コードではエラー チェックを行っていない。実際のアプリケーションでは、メソッド呼び出しの戻り値をチェックして、失敗がないようにする必要がある。
#include <dshow.h>
#include <qedit.h>
// タイムラインをプレビューする。
void PreviewTL(IAMTimeline *pTL, IRenderEngine *pRender)
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// グラフを作成する。
pRender->SetTimelineObject(pTL);
pRender->ConnectFrontEnd( );
pRender->RenderOutputPins( );
// グラフを実行する。
pRender->GetFilterGraph(&pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
pControl->Run();
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
pControl->Stop();
// クリーン アップ。
pEvent->Release();
pControl->Release();
pGraph->Release();
}
void main( void )
{
// 最初に空のタイムラインを作成する。
IAMTimeline *pTL = NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER,
IID_IAMTimeline, (void**)&pTL);
// グループ : ビデオ グループをタイムラインに追加する。
IAMTimelineGroup *pGroup = NULL;
IAMTimelineObj *pGroupObj = NULL;
pTL->CreateEmptyNode(&pGroupObj, TIMELINE_MAJOR_TYPE_GROUP);
pGroupObj->QueryInterface(IID_IAMTimelineGroup, (void **)&pGroup);
// グループ メディア タイプを設定する。この例では、タイプを "ビデオ"
// に設定し、DES にデフォルト設定を選択させる。詳細な例については、
// 「グループ メディア タイプの設定」を参照すること。
AM_MEDIA_TYPE mtGroup;
ZeroMemory(&mtGroup, sizeof(AM_MEDIA_TYPE));
mtGroup.majortype = MEDIATYPE_Video;
pGroup->SetMediaType(&mtGroup);
pTL->AddGroup(pGroupObj);
pGroupObj->Release();
// トラック : グループにトラックを追加する。
IAMTimelineObj *pTrackObj;
IAMTimelineTrack *pTrack;
IAMTimelineComp *pComp = NULL;
pTL->CreateEmptyNode(&pTrackObj, TIMELINE_MAJOR_TYPE_TRACK);
pGroup->QueryInterface(IID_IAMTimelineComp, (void **)&pComp);
pComp->VTrackInsBefore(pTrackObj, 0);
pTrackObj->QueryInterface(IID_IAMTimelineTrack, (void **)&pTrack);
pTrackObj->Release();
pComp->Release();
pGroup->Release();
// ソース : トラックにソースを追加する。
IAMTimelineSrc *pSource = NULL;
IAMTimelineObj *pSourceObj;
pTL->CreateEmptyNode(&pSourceObj, TIMELINE_MAJOR_TYPE_SOURCE);
pSourceObj->QueryInterface(IID_IAMTimelineSrc, (void **)&pSource);
// タイムとファイル名を設定する。
pSourceObj->SetStartStop(0, 50000000);
BSTR bstrFile = SysAllocString(OLESTR("C:\\example.avi"));
pSource->SetMediaName(bstrFile);
SysFreeString(bstrFile);
pSource->SetMediaTimes(40000000, 140000000);
pTrack->SrcAdd(pSourceObj);
pSourceObj->Release();
pSource->Release();
pTrack->Release();
// タイムラインをプレビューする。
IRenderEngine *pRenderEngine = NULL;
CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IRenderEngine, (void**) &pRenderEngine);
PreviewTL(pTL, pRenderEngine);
// クリーン アップ。
pRenderEngine->ScrapIt();
pRenderEngine->Release();
pTL->Release();
CoUninitialize();
}