我正在與另一個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的東西?還是包裝?任何想法將不勝感激。
謝謝, 乾杯。
有沒有人有使用Color Converter DMO的經驗? – bl4kh4k
我注意到一些例子使用渲染流而不是直接連接到圖。這會有所作爲嗎? – bl4kh4k