2011-10-27 33 views
1

我正在與另一個directshow圖形,似乎無法繞我遇到的問題我的頭。當我在GraphEdit中扣合在一起的圖形有云:播放與顏色轉換器DMO扭曲跳過

filesource - >解複用 - >解碼器 - >顏色轉換DMO - >外部渲染

這完美的作品和播放是驚人的!

但是在代碼中(並且圖形沒有錯誤地完美地構建)...它不會做我想要的...而是它播放文件,但是播放非常像黑色,看起來像跳過ontop前一幀的幀不會刪除前一幀。

繼承人我的代碼:

private static void BuildGraph(IGraphBuilder pGraph, string source) 
{ 
    int hr = 0; 

    // Graph builder. 
    pBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); 
    hr = pBuilder.SetFiltergraph(pGraph); 
    CheckHR(hr, "Can't SetFiltergraph."); 

    // Add File Source (Async.). 
    pFileSourceAsync = (IBaseFilter)new AsyncReader(); 
    hr = pGraph.AddFilter(pFileSourceAsync, "File Source (Async.)"); 
    CheckHR(hr, "Can't add File Source (Async.) to graph."); 

    // Set source filename. 
    pFileSourceAsync_src = pFileSourceAsync as IFileSourceFilter; 

    if (pFileSourceAsync_src == null) 
    { 
     CheckHR(unchecked((int)0x80004002), "Can't get IFileSourceFilter."); 
    } 

    hr = pFileSourceAsync_src.Load(source, null); 
    CheckHR(hr, "Can't load file."); 

    // Add MPEG4 Demultiplexor. 
    pMPEG4Demultiplexor = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_MPEG4Demultiplexor)); 
    hr = pGraph.AddFilter(pMPEG4Demultiplexor, "MPEG4 Demultiplexor"); 
    CheckHR(hr, "Can't add MPEG4 Demultiplexor to graph."); 

    // Add Microsoft DTV-DVD Video Decoder. 
    pMicrosoftDTVDVDVideoDecoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_MicrosoftDTVDVDVideoDecoder)); 
    hr = pGraph.AddFilter(pMicrosoftDTVDVDVideoDecoder, "Microsoft DTV-DVD Video Decoder"); 
    CheckHR(hr, "Can't add Microsoft DTV-DVD Video Decoder to graph."); 

    // Add Color Converter DMO. 
    dmoFilter = (IBaseFilter)new DMOWrapperFilter(); 
    dmoWrapper = (IDMOWrapperFilter)dmoFilter; 
    hr = dmoWrapper.Init(CLSID_ColorConverterDMO, DMOCategory.VideoEffect); 
    CheckHR(hr, "Can't initialize Color Converter DMO."); 
    hr = pGraph.AddFilter(dmoFilter, "DMO Filter"); 
    CheckHR(hr, "Can't add Color Converter DMO to graph."); 


    //IMediaParams dmoParams = dmoFilter as IMediaParams; 
    //MPData srcLeft = new MPData(); 
    //MPData srcTop = new MPData(); 
    //MPData destLeft = new MPData(); 
    //MPData destTop = new MPData(); 
    //MPData width = new MPData(); 
    //MPData height = new MPData(); 
    //srcLeft.vFloat = 0; 
    //srcTop.vFloat = 0; 
    //destLeft.vFloat = 0; 
    //destTop.vFloat = 0; 
    //width.vFloat = 1280; 
    //height.vFloat = 720; 
    //dmoParams.SetParam(0, srcLeft); 
    //dmoParams.SetParam(1, srcTop); 
    //dmoParams.SetParam(2, destLeft); 
    //dmoParams.SetParam(3, destTop); 
    //dmoParams.SetParam(4, width); 
    //dmoParams.SetParam(5, height); 


    // Add Smart Tee. 
    pSmartTee = (IBaseFilter)new SmartTee(); 
    hr = pGraph.AddFilter(pSmartTee, "Smart Tee"); 
    CheckHR(hr, "Can't add Smart Tee to graph."); 

    // Add Decklink Video Render. 
    pDecklinkVideoRender = CreateFilterByName(@"Decklink Video Render", CLSID_ExternalRenderers); 
    hr = pGraph.AddFilter(pDecklinkVideoRender, "Decklink Video Render"); 
    CheckHR(hr, "Can't add Decklink Video Render to graph."); 

    // Add AVI Decompressor. 
    pAVIDecompressor = (IBaseFilter)new AVIDec(); 
    hr = pGraph.AddFilter(pAVIDecompressor, "AVI Decompressor"); 
    CheckHR(hr, "Can't add AVI Decompressor to graph."); 

    // Add Color Space Converter. 
    pColorSpaceConverter = (IBaseFilter)new Colour(); 
    hr = pGraph.AddFilter(pColorSpaceConverter, "Color Space Converter"); 
    CheckHR(hr, "Can't add Color Space Converter to graph."); 

    // Add Null Renderer. 
    pNullRenderer = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_NullRenderer)); 
    hr = pGraph.AddFilter(pNullRenderer, "Null Renderer"); 
    CheckHR(hr, "Can't add Null Renderer to graph."); 

    // Connect File Source (Async.) and MPEG4 Demultiplexor. 
    hr = pGraph.ConnectDirect(GetPin(pFileSourceAsync, "Output"), GetPin(pMPEG4Demultiplexor, "Input"), null); 
    CheckHR(hr, "Can't connect File Source (Async.) and MPEG4 Demultiplexor."); 

    // Connect MPEG4 Demultiplexor and Microsoft DTV-DVD Video Decoder. 
    hr = pGraph.ConnectDirect(GetPin(pMPEG4Demultiplexor, "Video 1"), GetPin(pMicrosoftDTVDVDVideoDecoder, "Video Input"), null); 
    CheckHR(hr, "Can't connect MPEG4 Demultiplexor and Microsoft DTV-DVD Video Decoder."); 

    // Connect Microsoft DTV-DVD Video Decoder and Color Converter DMO. 
    hr = pGraph.ConnectDirect(GetPin(pMicrosoftDTVDVDVideoDecoder, "Video Output 1"), GetPin(dmoFilter, "in0"), null); 
    CheckHR(hr, "Can't connect Microsoft DTV-DVD Video Decoder and Color Converter DMO."); 

    // Connect Color Converter DMO and Smart Tee Filter. 
    hr = pGraph.ConnectDirect(GetPin(dmoFilter, "out0"), GetPin(pSmartTee, "Input"), null); 
    CheckHR(hr, "Can't connect Color Converter DMO and Smart Tee Filter."); 

    // Connect Smart Tee Filter and Decklink Video Render. 
    hr = pGraph.ConnectDirect(GetPin(pSmartTee, "Capture"), GetPin(pDecklinkVideoRender, "In"), null); 
    CheckHR(hr, "Can't connect Smart Tee Filter and Decklink Video Render."); 

    // Add SampleGrabber. 
    pSampleGrabber = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_SampleGrabber)); 
    hr = pGraph.AddFilter(pSampleGrabber, "SampleGrabber"); 
    CheckHR(hr, "Can't add SampleGrabber to graph."); 
    (pSampleGrabber as ISampleGrabber).SetBufferSamples(true); 
    (pSampleGrabber as ISampleGrabber).SetOneShot(false); 

    // Connect Smart Tee and SampleGrabber. 
    hr = pGraph.ConnectDirect(GetPin(pSmartTee, "Preview"), GetPin(pSampleGrabber, "Input"), null); 
    CheckHR(hr, "Can't connect Smart Tee and SampleGrabber."); 

    // Connect SampleGrabber and AVIDecompressor. 
    hr = pGraph.ConnectDirect(GetPin(pSampleGrabber, "Output"), GetPin(pAVIDecompressor, "XForm In"), null); 
    CheckHR(hr, "Can't connect SampleGrabber and AVIDecompressor."); 

    // Connect AVIDecompressor and Color Space Converter. 
    hr = pGraph.ConnectDirect(GetPin(pAVIDecompressor, "XForm Out"), GetPin(pColorSpaceConverter, "Input"), null); 
    CheckHR(hr, "Can't connect Color Space Converter and SampleGrabber."); 

    // Connect Color Space Converter and Null Renderer. 
    hr = pGraph.ConnectDirect(GetPin(pColorSpaceConverter, "XForm Out"), GetPin(pNullRenderer, "In"), null); 
    CheckHR(hr, "Can't connect Color Space Converter and Null Renderer."); 

    // Set SampleGrabber Media Type. 
    AMMediaType pSampleGrabber_pmt = new AMMediaType(); 
    pSampleGrabber_pmt.majorType = MediaType.Video; 
    pSampleGrabber_pmt.subType = MediaSubType.RGB32; 
    pSampleGrabber_pmt.formatType = FormatType.VideoInfo; 
    VideoInfoHeader pSampleGrabber_format = new VideoInfoHeader(); 
    pSampleGrabber_pmt.formatPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(pSampleGrabber_format)); 
    Marshal.StructureToPtr(pSampleGrabber_format, pSampleGrabber_pmt.formatPtr, false); 
    hr = ((ISampleGrabber)pSampleGrabber).SetMediaType(pSampleGrabber_pmt); 
    DsUtils.FreeAMMediaType(pSampleGrabber_pmt); 
    CheckHR(hr, "Can't set media type to sample grabber."); 
} 

你會看到,我有更多的代碼,如掛鉤智能發球和樣品採集(這是不是原因,因爲我已經對此評論到:在檢查結果並沒有改變之前,最終我想從視頻流中獲取靜止圖像......所以我準備好後就可以使用它)。

我認爲這個問題與顏色轉換器dmo有關,但我並不完全確定...... graphedit中的確切圖表運行時沒有任何問題,但是代碼模式給我帶來了可怕的回放。也許這是我忘記做顏色轉換器dmo的東西?還是包裝?任何想法將不勝感激。

謝謝, 乾杯。

+0

有沒有人有使用Color Converter DMO的經驗? – bl4kh4k

+0

我注意到一些例子使用渲染流而不是直接連接到圖。這會有所作爲嗎? – bl4kh4k

回答

1

我沒有關於Color Converter DMO的詳細信息,但是來自其他Vista + DMO的經驗 - 它們不適用於DirectShow。是的,他們仍然是DMO,採用IMediaObject接口,DMO Wrapper Filter也存在,但小問題破壞了集成。

如果它不能直接使用,那麼很可能您必須將DMO放入您自己的包裝過濾器中。這肯定會奏效,而且 - 好消息 - 這並不複雜。

老的DMOs在DirectShow中使用的是包裝過濾器,因此它們一直在工作,這就是爲什麼DMO Wrapper Filter首先可用。