2014-01-20 28 views
0
object vdeosource; 
DsDevice device1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)[1]; 
Guid baseIdentifier = typeof(IBaseFilter).GUID; 
device1.Mon.BindToObject(null, null, ref baseIdentifier, out vdeosource); 
IBaseFilter sourceFilter = vdeosource as IBaseFilter; 
graphBuilder.AddFilter(sourceFilter, "Source"); 

hr = captureGraphBuilder.SetFiltergraph(this.graphBuilder); 
DsError.ThrowExceptionForHR(hr); 

mpeg2Demux = (IBaseFilter)new MPEG2Demultiplexer(); 

object cross; 
captureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, sourceFilter, typeof(IAMCrossbar).GUID, out cross); 
IAMCrossbar crossbar2 = cross as IAMCrossbar; 
int inputpincount, outputpincount; 
crossbar2.get_PinCounts(out outputpincount, out inputpincount); 
crossbar2.Route(0, 0); 

實時視頻如果我試圖在這一點上呈現視頻,我得到一些延遲5秒的照片從連接作爲輸入我的採集卡我的演奏視頻。我的採集卡輸出是mpeg2。無法從採集卡

IBaseFilter demuxFilter = (IBaseFilter)new MPEG2Demultiplexer(); 
graphBuilder.AddFilter(demuxFilter, "Mpeg-2 Demultiplexor"); 

IPin sourceFilterOutputPin = DsFindPin.ByDirection(sourceFilter, PinDirection.Output, 0); 
IPin demuxFilterPinIn = DsFindPin.ByDirection(demuxFilter, PinDirection.Input, 0); 

hr = graphBuilder.Connect(sourceFilterOutputPin, demuxFilterPinIn); 
DsError.ThrowExceptionForHR(hr); 

IBaseFilter defaultRenderer = (IBaseFilter)new VideoRendererDefault(); 
hr = graphBuilder.AddFilter(defaultRenderer, "Default Renderer"); 
DsError.ThrowExceptionForHR(hr); 

hr = captureGraphBuilder.RenderStream(null, MediaType.Video, sourceFilter, null, defaultRenderer); 
DsError.ThrowExceptionForHR(hr); 

在這一點上,我得到它說沒有中間過濾器組合的錯誤... 所有我想知道的是我是否使用MPEG2解複用器對還是錯?

回答

1

在渲染流之前,您不需要將源連接到demux。這可能會令渲染操作混淆不清。

在渲染操作期間,DirectShow將嘗試在嘗試其他已註冊的過濾器之前使用圖中已經存在的過濾器,以便您可以在不連接它們的情況下將首選過濾器添加到圖形中。

您可能還缺少適當的mpeg2解碼或色彩空間轉換濾鏡。您是否使用圖形編輯工具(例如Windows SDK中的Graph Studio Next或GraphEdit)模擬了這些?

+0

嗨,最後我想通了。我使用了crossbar和StreamConfig,最後我得到了一個視頻輸入。 但現在我無法將其捕獲到avi文件。我的代碼與我的攝像頭是正確的,但使用我的捕捉卡,我得到一個64KB的文件。 –

+0

建議您嘗試在Graph Studio Next中構建此圖並將結果作爲下一步發佈。 – persiflage