分类: C/C++
2008-03-11 20:42:40
void CDesTestDlg::OnStart() { // 创建空时间线. IAMTimeline *pTL = NULL; CoInitialize(NULL); CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, IID_IAMTimeline, (void**)&pTL); // GROUP: Add a video group to the timeline. IAMTimelineGroup *pGroup = NULL; IAMTimelineObj *pGroupObj = NULL; pTL->CreateEmptyNode(&pGroupObj, TIMELINE_MAJOR_TYPE_GROUP); pGroupObj->QueryInterface(IID_IAMTimelineGroup, (void **)&pGroup); // Set the group media type. This example sets the type to "video" and // lets DES pick the default settings. For a more detailed example, // see "Setting the Group Media Type." AM_MEDIA_TYPE mtGroup; ZeroMemory(&mtGroup, sizeof(AM_MEDIA_TYPE)); mtGroup.majortype = MEDIATYPE_Video; pGroup->SetMediaType(&mtGroup); pTL->AddGroup(pGroupObj); pGroupObj->Release(); // TRACK: Add two track to the group. IAMTimelineObj *pTrackObj1,*pTrackObj2; IAMTimelineTrack *pTrack1,*pTrack2; IAMTimelineComp *pComp1 = NULL;//,*pComp2 = NULL; pTL->CreateEmptyNode(&pTrackObj1, TIMELINE_MAJOR_TYPE_TRACK); pGroup->QueryInterface(IID_IAMTimelineComp, (void **)&pComp1); pComp1->VTrackInsBefore(pTrackObj1, -1); pTrackObj1->QueryInterface(IID_IAMTimelineTrack, (void **)&pTrack1); pTL->CreateEmptyNode(&pTrackObj2, TIMELINE_MAJOR_TYPE_TRACK); pGroup->QueryInterface(IID_IAMTimelineComp, (void **)&pComp1); pComp1->VTrackInsBefore(pTrackObj2, -1); pTrackObj2->QueryInterface(IID_IAMTimelineTrack, (void **)&pTrack2); pTrackObj1->Release(); pTrackObj2->Release(); pComp1->Release(); pGroup->Release(); // SOURCE: Add two source to the track. IAMTimelineSrc *pSource1 = NULL,*pSource2 = NULL; IAMTimelineObj *pSourceObj1,*pSourceObj2; pTL->CreateEmptyNode(&pSourceObj1, TIMELINE_MAJOR_TYPE_SOURCE); pSourceObj1->QueryInterface(IID_IAMTimelineSrc, (void **)&pSource1); pTL->CreateEmptyNode(&pSourceObj2, TIMELINE_MAJOR_TYPE_SOURCE); pSourceObj2->QueryInterface(IID_IAMTimelineSrc, (void **)&pSource2); // Set the times and the file name. pSourceObj1->SetStartStop(0, 100000000); pSourceObj2->SetStartStop(50000000, 100000000); BSTR bstrFile1 = SysAllocString(OLESTR("news.WMV")); BSTR bstrFile2 = SysAllocString(OLESTR("vos.wmv")); pSource1->SetMediaName(bstrFile1); pSource2->SetMediaName(bstrFile2); SysFreeString(bstrFile1); SysFreeString(bstrFile2); //设置基于媒体本身的开始和结束时间 pSource1->SetMediaTimes(00000000, 100000000); pSource2->SetMediaTimes(50000000, 100000000); pTrack1->SrcAdd(pSourceObj1); pTrack2->SrcAdd(pSourceObj2); pSourceObj1->Release(); pSourceObj2->Release(); pSource1->Release(); pSource2->Release(); pTrack1->Release(); pTrack2->Release(); // Create the transition object. IAMTimelineObj *pTransObj = NULL; HRESULT hr = pTL->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION); // Set the subobject. hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg); // SMPTE Wipe // Set the start and stop times. hr = pTransObj->SetStartStop(50000000, 100000000); // Insert the transition object into the timeline. IAMTimelineTransable *pTransable = NULL; hr = pTrack2->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable); hr = pTransable->TransAdd(pTransObj); IPropertySetter *pProp; // Property setter hr = CoCreateInstance(CLSID_PropertySetter, NULL, CLSCTX_INPROC_SERVER, IID_IPropertySetter, (void**) &pProp); // Error checking is omitted for clarity... DEXTER_PARAM param; DEXTER_VALUE *pValue = (DEXTER_VALUE*)CoTaskMemAlloc(sizeof(DEXTER_VALUE)); // Initialize the parameter. param.Name = SysAllocString(L"MaskNum"); param.dispID = 0; param.nValues = 1; // Initialize the value. pValue->v.vt = VT_BSTR; pValue->v.bstrVal =SysAllocString(L"129"); //六角星 pValue->rt = 0; pValue->dwInterp = DEXTERF_JUMP; pProp->AddProp(param, pValue); // Free allocated resources. SysFreeString(param.Name); VariantClear(&(pValue->v)); CoTaskMemFree(pValue); // Set the property on the transition. pTransObj->SetPropertySetter(pProp); pProp->Release(); pTransable->Release(); pTransObj->Release(); // Preview the timeline. IRenderEngine *pRenderEngine = NULL; CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER, IID_IRenderEngine, (void**) &pRenderEngine); PreviewTL(pTL, pRenderEngine); // Clean up. pRenderEngine->ScrapIt(); pRenderEngine->Release(); pTL->Release(); CoUninitialize(); } // 预览时间线. void PreviewTL(IAMTimeline *pTL, IRenderEngine *pRender) { IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL; // Build the graph. pRender->SetTimelineObject(pTL); pRender->ConnectFrontEnd( ); pRender->RenderOutputPins( ); // Run the graph. 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(); // Clean up. pEvent->Release(); pControl->Release(); pGraph->Release(); }最后,希望认识一些对MPEG-4感兴趣的同仁,互相学习和交流。