<br/>HRESULT hr; IBaseFilter *pSrcFilter=NULL; IBaseFilter *pASFWriter = NULL; // WM ASF File filter IFileSinkFilter2 *pSink = NULL; // File sink object IWMWriterAdvanced2 *pWMWA2 = NULL; IServiceProvider *pProvider; IConfigAsfWriter *mpWriterConfig = NULL; // Get DirectShow interfaces hr = GetInterfaces(); if (FAILED(hr)) { Msg(TEXT("Failed to get video interfaces! hr=0x%x"), hr); return hr; } hr = CoCreateInstance (CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **) &pASFWriter); hr = g_pGraph->AddFilter (pASFWriter, L"ASF Writer"); if (FAILED(hr)) { Msg(TEXT("Failed to CLSID_WMAsfWriter AddFilter! hr=0x%x"), hr); return hr; } if (FAILED(hr)) { Msg(TEXT("Failed to CLSID_WMAsfWriter! hr=0x%x"), hr); return hr; } hr = pASFWriter->QueryInterface(IID_IConfigAsfWriter, (void**)&mpWriterConfig); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } IWMProfileManager *profileManager; IWMStreamConfig * pWMStreamConfig; hr = WMCreateProfileManager(&profileManager); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } IWMProfile *pProfile; hr = profileManager->CreateEmptyProfile(WMT_VER_9_0, &pProfile); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } hr = pProfile->CreateNewStream(WMMEDIATYPE_Video, &pWMStreamConfig); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } IWMVideoMediaProps *pProps; hr = pWMStreamConfig->QueryInterface(IID_IWMVideoMediaProps,(void**)&pProps); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } pProps->SetQuality(100); VIDEOINFOHEADER VideoInfoHeader; VideoInfoHeader.dwBitRate = 1000000000000000; VideoInfoHeader.dwBitErrorRate =1; VideoInfoHeader.AvgTimePerFrame = (REFERENCE_TIME) (1 * 1000 * 10000 /10000000000000); RECT rcDst2; SetRect(&rcDst2, 0, 0, 240, 200); SetRect(&VideoInfoHeader.rcSource, 0, 0,640,480); VideoInfoHeader.rcTarget = rcDst2; VideoInfoHeader.bmiHeader.biWidth = rcDst2.right; VideoInfoHeader.bmiHeader.biHeight = rcDst2.bottom; VideoInfoHeader.bmiHeader.biSizeImage = 0; VideoInfoHeader.bmiHeader.biSize = sizeof(VideoInfoHeader.bmiHeader); VideoInfoHeader.bmiHeader.biXPelsPerMeter = 0; VideoInfoHeader.bmiHeader.biYPelsPerMeter = 0; VideoInfoHeader.bmiHeader.biClrImportant = 0; VideoInfoHeader.bmiHeader.biClrUsed = 0; VideoInfoHeader.bmiHeader.biPlanes = 1; VideoInfoHeader.bmiHeader.biCompression = 0x56595559; WM_MEDIA_TYPE *pType = new WM_MEDIA_TYPE(); pType->majortype =WMMEDIATYPE_Video; pType->subtype = WMMEDIASUBTYPE_WMV3; pType->bFixedSizeSamples = FALSE; pType->bTemporalCompression = TRUE; pType->lSampleSize = 0; pType->formattype = WMFORMAT_VideoInfo; pType->pUnk = NULL; pType->cbFormat = sizeof(VIDEOINFOHEADER); pType->pbFormat = (BYTE*) &VideoInfoHeader; pProps->SetMediaType(pType); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } hr = mpWriterConfig->ConfigureFilterUsingProfile(pProfile); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } //hr = mpWriterConfig->ConfigureFilterUsingProfileGuid(WMProfile_V40_250Video); if (FAILED(hr)) { Msg(TEXT("Failed to ConfigureFilterUsingProfileGuid ! hr=0x%x"), hr); return hr; } hr = pASFWriter->QueryInterface(IID_IServiceProvider, (void**)&pProvider); if (SUCCEEDED(hr)) { hr = pProvider->QueryService(IID_IWMWriterAdvanced2, IID_IWMWriterAdvanced2, (void**)&pWMWA2); } if (FAILED(hr = pWMWA2->SetLiveSource(TRUE))) { printf ("mpWriter2->SetLiveSource FAILED/n"); return hr; } IWMWriterFileSink* m_pFileSink; hr = WMCreateWriterFileSink( &m_pFileSink ); if ( FAILED( hr ) ) { _tprintf( _T( "Could not create Writer File Sink (hr=0x%08x)./n" ), hr ); return hr; } m_pFileSink->Open (L"test.asf"); if ( FAILED( hr ) ) { _tprintf( _T( "Could not create Writer File Sink (hr=0x%08x)./n" ), hr ); return hr; } pWMWA2->AddSink(m_pFileSink); if ( FAILED( hr ) ) { _tprintf( _T( "Could not create Writer File Sink (hr=0x%08x)./n" ), hr ); return hr; } // remove default sink... added back later dynamically if (FAILED(hr = pWMWA2->RemoveSink(0))) { printf (" mpWriter2->RemoveSink FAILED/n"); return hr; } pProvider->Release(); IWMWriterNetworkSink *mpNetSink = NULL; if (FAILED(hr = WMCreateWriterNetworkSink(&mpNetSink))) { printf ("WMCreateWriterNetworkSink FAILED/n"); return hr; } DWORD dwPort = 1234; if (FAILED(hr = mpNetSink->Open(&dwPort))) { printf ("Port open FAILED/n"); return hr; } WCHAR url[256]; DWORD url_len = 256; hr = mpNetSink->GetHostURL(url, &url_len); if (FAILED(pWMWA2->AddSink(mpNetSink))) { printf ("mpWriter2->AddSink FAILED/n"); return hr; } // Attach the filter graph to the capture graph hr = g_pCapture->SetFiltergraph(g_pGraph); if (FAILED(hr)) { Msg(TEXT("Failed to set capture filter graph! hr=0x%x"), hr); return hr; } // Use the system device enumerator and class enumerator to find // a video capture/preview device, such as a desktop USB video camera. hr = FindCaptureDevice(&pSrcFilter); if (FAILED(hr)) { // Don't display a message because FindCaptureDevice will handle it return hr; } // Add Capture filter to our graph. hr = g_pGraph->AddFilter(pSrcFilter, L"Video Capture"); if (FAILED(hr)) { Msg(TEXT("Couldn't add the capture filter to the graph! hr=0x%x/r/n/r/n") TEXT("If you have a working video capture device, please make sure/r/n") TEXT("that it is connected and is not being used by another application./r/n/r/n") TEXT("The sample will now close."), hr); pSrcFilter->Release(); return hr; } // Render the preview pin on the video capture filter // Use this instead of g_pGraph->RenderFile hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrcFilter, NULL, NULL); hr = g_pCapture->RenderStream (&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSrcFilter, NULL, pASFWriter); if (FAILED(hr)) { Msg(TEXT("Couldn't render the video capture stream. hr=0x%x/r/n") TEXT("The capture device may already be in use by another application./r/n/r/n") TEXT("The sample will now close."), hr); pSrcFilter->Release(); return hr; } // Now that the filter has been added to the graph and we have // rendered its stream, we can release this reference to the filter. pSrcFilter->Release(); // Set video window style and position hr = SetupVideoWindow(); if (FAILED(hr)) { Msg(TEXT("Couldn't initialize video window! hr=0x%x"), hr); return hr; } #ifdef REGISTER_FILTERGRAPH // Add our graph to the running object table, which will allow // the GraphEdit application to "spy" on our graph hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister); if (FAILED(hr)) { Msg(TEXT("Failed to register filter graph with ROT! hr=0x%x"), hr); g_dwGraphRegister = 0; } #endif // Start previewing video data hr = g_pMC->Run(); if (FAILED(hr)) { Msg(TEXT("Couldn't run the graph! hr=0x%x"), hr); return hr; } // Remember current state g_psCurrent = Running; return S_OK;