本文整理汇总了C#中IFilterGraph2.AddSourceFilterForMoniker方法的典型用法代码示例。如果您正苦于以下问题:C# IFilterGraph2.AddSourceFilterForMoniker方法的具体用法?C# IFilterGraph2.AddSourceFilterForMoniker怎么用?C# IFilterGraph2.AddSourceFilterForMoniker使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IFilterGraph2
的用法示例。
在下文中一共展示了IFilterGraph2.AddSourceFilterForMoniker方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: SetupGraph
/// <summary> build the capture graph for grabber. </summary>
private void SetupGraph(DsDevice dev, int iFrameRate, int iWidth, int iHeight, string FileName)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter baseGrabFlt = null;
IBaseFilter capFilter = null;
IBaseFilter muxFilter = null;
IFileSinkFilter fileWriterFilter = null;
ICaptureGraphBuilder2 capGraph = null;
// Get the graphbuilder object
m_FilterGraph = new FilterGraph() as IFilterGraph2;
m_mediaCtrl = m_FilterGraph as IMediaControl;
#if DEBUG
m_rot = new DsROTEntry(m_FilterGraph);
#endif
try
{
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
// Get the SampleGrabber interface
sampGrabber = (ISampleGrabber) new SampleGrabber();
// Start building the graph
hr = capGraph.SetFiltergraph( m_FilterGraph );
DsError.ThrowExceptionForHR( hr );
// Add the video device
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
DsError.ThrowExceptionForHR( hr );
baseGrabFlt = (IBaseFilter) sampGrabber;
ConfigureSampleGrabber(sampGrabber);
// Add the frame grabber to the graph
hr = m_FilterGraph.AddFilter( baseGrabFlt, "Ds.NET Grabber" );
DsError.ThrowExceptionForHR( hr );
// If any of the default config items are set
if (iFrameRate + iHeight + iWidth > 0)
{
SetConfigParms(capGraph, capFilter, iFrameRate, iWidth, iHeight);
}
// Create a filter for the output avi file
hr = capGraph.SetOutputFileName(MediaSubType.Avi, FileName, out muxFilter, out fileWriterFilter);
DsError.ThrowExceptionForHR( hr );
// Connect everything together
hr = capGraph.RenderStream( PinCategory.Capture, MediaType.Video, capFilter, baseGrabFlt, muxFilter);
DsError.ThrowExceptionForHR( hr );
// Now that sizes are fixed, store the sizes
SaveSizeInfo(sampGrabber);
}
finally
{
if (fileWriterFilter != null)
{
Marshal.ReleaseComObject(fileWriterFilter);
fileWriterFilter = null;
}
if (muxFilter != null)
{
Marshal.ReleaseComObject(muxFilter);
muxFilter = null;
}
if (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (sampGrabber != null)
{
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
}
}
示例2: BuildGraph
private void BuildGraph(Control hControl)
{
int hr;
DsDevice [] devs;
IBaseFilter ibfSource = null;
IBaseFilter dmoFilter = null;
IBaseFilter ibfRender = null;
IDMOWrapperFilter dmoWrapperFilter = null;
ICaptureGraphBuilder2 icgb = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
graphBuilder = (IFilterGraph2) new FilterGraph();
#if DEBUG
m_rot = new DsROTEntry(graphBuilder);
#endif
hr = icgb.SetFiltergraph(graphBuilder);
DsError.ThrowExceptionForHR(hr);
devs = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
if (devs.Length < 1)
{
throw new Exception("This sample requires a capture device. If you don't " +
"have a capture device, change the BuildGraph routine to use AddSourceFilter " +
"and use a file.");
}
// Add a source filter
hr = graphBuilder.AddSourceFilterForMoniker(devs[0].Mon, null, "Video Input Device", out ibfSource);
DsError.ThrowExceptionForHR(hr);
// Add a DMO Wrapper Filter
dmoFilter = (IBaseFilter) new DMOWrapperFilter();
dmoWrapperFilter = (IDMOWrapperFilter) dmoFilter;
// Since I know the guid of the DMO I am looking for, I *could* do this.
//hr = dmoWrapperFilter.Init(new Guid("{7EF28FD7-E88F-45bb-9CDD-8A62956F2D75}"), DMOCatergory.VideoEffect);
//DMOError.ThrowExceptionForHR(hr);
// But it is more useful to show how to scan for the DMO
Guid g = FindGuid("DmoFlip", DMOCategory.VideoEffect);
hr = dmoWrapperFilter.Init(g, DMOCategory.VideoEffect);
DMOError.ThrowExceptionForHR(hr);
SetDMOParams(dmoFilter);
// Add it to the Graph
hr = graphBuilder.AddFilter(dmoFilter, "DMO Filter");
DsError.ThrowExceptionForHR(hr);
ibfRender = (IBaseFilter)new VideoRenderer();
hr = graphBuilder.AddFilter(ibfRender, "renderer");
DsError.ThrowExceptionForHR(hr);
hr = icgb.RenderStream(null, null, ibfSource, dmoFilter, ibfRender);
DsError.ThrowExceptionForHR(hr);
ConfigVideo(graphBuilder as IVideoWindow, hControl);
Marshal.ReleaseComObject(ibfSource);
Marshal.ReleaseComObject(ibfRender);
}
示例3: SetupGraph
/// <summary> build the capture graph for grabber. </summary>
private void SetupGraph(DsDevice dev, int iFrameRate, int iWidth, int iHeight)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;
// Get the graphbuilder object
m_FilterGraph = (IFilterGraph2) new FilterGraph();
m_mediaCtrl = m_FilterGraph as IMediaControl;
try
{
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
// Get the SampleGrabber interface
sampGrabber = (ISampleGrabber) new SampleGrabber();
// Start building the graph
hr = capGraph.SetFiltergraph( m_FilterGraph );
DsError.ThrowExceptionForHR( hr );
// Add the video device
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, "Video input", out capFilter);
DsError.ThrowExceptionForHR( hr );
IBaseFilter baseGrabFlt = (IBaseFilter) sampGrabber;
ConfigureSampleGrabber(sampGrabber);
// Add the frame grabber to the graph
hr = m_FilterGraph.AddFilter( baseGrabFlt, "Ds.NET Grabber" );
DsError.ThrowExceptionForHR( hr );
// If any of the default config items are set
if (iFrameRate + iHeight + iWidth > 0)
{
SetConfigParms(capGraph, capFilter, iFrameRate, iWidth, iHeight);
}
hr = capGraph.RenderStream( PinCategory.Capture, MediaType.Video, capFilter, null, baseGrabFlt );
DsError.ThrowExceptionForHR( hr );
SaveSizeInfo(sampGrabber);
}
finally
{
if (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (sampGrabber != null)
{
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
if (capGraph != null)
{
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}
示例4: handleInternalNetworkProviderFilter
private void handleInternalNetworkProviderFilter(DsDevice[] devices, IFilterGraph2 graphBuilder,
Guid networkProviderClsId, DsROTEntry rotEntry)
{
IDvbNetworkProvider interfaceNetworkProvider;
TuningType tuningTypes;
for (int i = 0; i < devices.Length; i++)
{
bool isCablePreferred = false;
string name = devices[i].Name ?? "unknown";
name = name.ToLowerInvariant();
Log.Log.WriteFile("Found card:{0}", name);
//silicondust work-around for dvb type detection issue. generic provider would always use dvb-t
if (name.Contains("silicondust hdhomerun tuner"))
{
isCablePreferred = CheckHDHomerunCablePrefered(name);
Log.Log.WriteFile("silicondust hdhomerun detected - prefer cable mode: {0}", isCablePreferred);
}
IBaseFilter tmp;
graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, name, out tmp);
//Use the Microsoft Network Provider method first but only if available
IBaseFilter networkDVB = FilterGraphTools.AddFilterFromClsid(graphBuilder, networkProviderClsId,
"MediaPortal Network Provider");
interfaceNetworkProvider = (IDvbNetworkProvider)networkDVB;
string hash = GetHash(devices[i].DevicePath);
interfaceNetworkProvider.ConfigureLogging(GetFileName(devices[i].DevicePath), hash, LogLevelOption.Debug);
if (ConnectFilter(graphBuilder, networkDVB, tmp))
{
Log.Log.WriteFile("Detected DVB card:{0}- Hash: {1}", name, hash);
interfaceNetworkProvider.GetAvailableTuningTypes(out tuningTypes);
Log.Log.WriteFile("TuningTypes: " + tuningTypes);
// determine the DVB card supported GUIDs here!
if ((tuningTypes & TuningType.DvbT) != 0 && !isCablePreferred)
{
Log.Log.WriteFile("Detected DVB-T* card:{0}", name);
TvCardDVBT dvbtCard = new TvCardDVBT(_epgEvents, devices[i]);
_cards.Add(dvbtCard);
}
if ((tuningTypes & TuningType.DvbS) != 0 && !isCablePreferred)
{
Log.Log.WriteFile("Detected DVB-S* card:{0}", name);
TvCardDVBS dvbsCard = new TvCardDVBS(_epgEvents, devices[i]);
_cards.Add(dvbsCard);
}
if ((tuningTypes & TuningType.DvbC) != 0)
{
Log.Log.WriteFile("Detected DVB-C* card:{0}", name);
TvCardDVBC dvbcCard = new TvCardDVBC(_epgEvents, devices[i]);
_cards.Add(dvbcCard);
}
if ((tuningTypes & TuningType.Atsc) != 0 && !isCablePreferred)
{
Log.Log.WriteFile("Detected ATSC* card:{0}", name);
TvCardATSC dvbsCard = new TvCardATSC(_epgEvents, devices[i]);
_cards.Add(dvbsCard);
}
}
graphBuilder.RemoveFilter(tmp);
Release.ComObject("tmp filter", tmp);
graphBuilder.RemoveFilter(networkDVB);
Release.ComObject("ms provider", networkDVB);
}
FilterGraphTools.RemoveAllFilters(graphBuilder);
rotEntry.Dispose();
Release.ComObject("graph builder", graphBuilder);
}
示例5: SetupGraph
/// <summary> build the capture graph for grabber. </summary>
private void SetupGraph(DsDevice dev, int iSampleRate, int iChannels)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;
IBaseFilter baseGrabFlt = null;
IBaseFilter nullrenderer = null;
IMediaFilter mediaFilt = m_FilterGraph as IMediaFilter;
// Get the graphbuilder object
m_FilterGraph = (IFilterGraph2)new FilterGraph();
m_mediaCtrl = m_FilterGraph as IMediaControl;
try {
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
// Get the SampleGrabber interface
sampGrabber = (ISampleGrabber)new SampleGrabber();
// Start building the graph
hr = capGraph.SetFiltergraph(m_FilterGraph);
DsError.ThrowExceptionForHR(hr);
// Add the audio device
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, "Audio input", out capFilter);
DsError.ThrowExceptionForHR(hr);
// If any of the default config items are set
if (iSampleRate + iChannels > 0) {
SetConfigParms(capGraph, capFilter, iSampleRate, iChannels);
}
// Get the SampleGrabber interface
sampGrabber = new SampleGrabber() as ISampleGrabber;
baseGrabFlt = sampGrabber as IBaseFilter;
ConfigureSampleGrabber(sampGrabber);
// Add the frame grabber to the graph
hr = m_FilterGraph.AddFilter(baseGrabFlt, "Ds.NET Grabber");
DsError.ThrowExceptionForHR(hr);
// ---------------------------------
// Connect the file filter to the sample grabber
// Hopefully this will be the audio pin, we could check by reading it's mediatype
IPin iPinOut = DsFindPin.ByDirection(capFilter, PinDirection.Output, 0);
// Get the input pin from the sample grabber
IPin iPinIn = DsFindPin.ByDirection(baseGrabFlt, PinDirection.Input, 0);
hr = m_FilterGraph.Connect(iPinOut, iPinIn);
DsError.ThrowExceptionForHR(hr);
// Add the null renderer to the graph
nullrenderer = new NullRenderer() as IBaseFilter;
hr = m_FilterGraph.AddFilter(nullrenderer, "Null renderer");
DsError.ThrowExceptionForHR(hr);
// ---------------------------------
// Connect the sample grabber to the null renderer
iPinOut = DsFindPin.ByDirection(baseGrabFlt, PinDirection.Output, 0);
iPinIn = DsFindPin.ByDirection(nullrenderer, PinDirection.Input, 0);
hr = m_FilterGraph.Connect(iPinOut, iPinIn);
DsError.ThrowExceptionForHR(hr);
// Read and cache the resulting settings
SaveSizeInfo(sampGrabber);
} finally {
if (capFilter != null) {
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (sampGrabber != null) {
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
if (capGraph != null) {
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}
示例6: SetupGraph
/// <summary> build the capture graph for grabber. </summary>
private void SetupGraph(DsDevice dev, int iWidth, int iHeight, short iBPP, Control hControl)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
IPin pCaptureOut = null;
IPin pSampleIn = null;
IPin pRenderIn = null;
// Get the graphbuilder object
m_FilterGraph = new FilterGraph() as IFilterGraph2;
try
{
#if DEBUG
m_rot = new DsROTEntry(m_FilterGraph);
#endif
// add the video input device
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
DsError.ThrowExceptionForHR(hr);
// Find the still pin
m_pinStill = DsFindPin.ByCategory(capFilter, PinCategory.Still, 0);
// Didn't find one. Is there a preview pin?
if (m_pinStill == null)
{
m_pinStill = DsFindPin.ByCategory(capFilter, PinCategory.Preview, 0);
}
// Still haven't found one. Need to put a splitter in so we have
// one stream to capture the bitmap from, and one to display. Ok, we
// don't *have* to do it that way, but we are going to anyway.
if (m_pinStill == null)
{
IPin pRaw = null;
IPin pSmart = null;
// There is no still pin
m_VidControl = null;
// Add a splitter
IBaseFilter iSmartTee = (IBaseFilter)new SmartTee();
try
{
hr = m_FilterGraph.AddFilter(iSmartTee, "SmartTee");
DsError.ThrowExceptionForHR(hr);
// Find the find the capture pin from the video device and the
// input pin for the splitter, and connnect them
pRaw = DsFindPin.ByCategory(capFilter, PinCategory.Capture, 0);
pSmart = DsFindPin.ByDirection(iSmartTee, PinDirection.Input, 0);
hr = m_FilterGraph.Connect(pRaw, pSmart);
DsError.ThrowExceptionForHR(hr);
// Now set the capture and still pins (from the splitter)
m_pinStill = DsFindPin.ByName(iSmartTee, "Preview");
pCaptureOut = DsFindPin.ByName(iSmartTee, "Capture");
// If any of the default config items are set, perform the config
// on the actual video device (rather than the splitter)
if (iHeight + iWidth + iBPP > 0)
{
SetConfigParms(pRaw, iWidth, iHeight, iBPP);
}
}
finally
{
if (pRaw != null)
{
Marshal.ReleaseComObject(pRaw);
}
if (pRaw != pSmart)
{
Marshal.ReleaseComObject(pSmart);
}
if (pRaw != iSmartTee)
{
Marshal.ReleaseComObject(iSmartTee);
}
}
}
else
{
// Get a control pointer (used in Click())
m_VidControl = capFilter as IAMVideoControl;
pCaptureOut = DsFindPin.ByCategory(capFilter, PinCategory.Capture, 0);
// If any of the default config items are set
if (iHeight + iWidth + iBPP > 0)
{
SetConfigParms(m_pinStill, iWidth, iHeight, iBPP);
}
}
//.........这里部分代码省略.........
示例7: AddVideoCompressor
/// <summary>
/// Adds the video compressor.
/// </summary>
/// <param name="_graphBuilder">GraphBuilder</param>
/// <returns></returns>
private bool AddVideoCompressor(IFilterGraph2 _graphBuilder)
{
Log.Log.WriteFile("analog: AddVideoCompressor");
DsDevice[] devices1 = DsDevice.GetDevicesOfCat(FilterCategory.VideoCompressorCategory);
DsDevice[] devices2 = DsDevice.GetDevicesOfCat(FilterCategory.LegacyAmFilterCategory);
IList<SoftwareEncoder> videoEncoders = _layer.GetSofwareEncodersVideo();
DsDevice[] videoDevices = new DsDevice[videoEncoders.Count];
for (int x = 0; x < videoEncoders.Count; ++x)
{
videoDevices[x] = null;
}
for (int i = 0; i < devices1.Length; i++)
{
for (int x = 0; x < videoEncoders.Count; ++x)
{
if (videoEncoders[x].Name == devices1[i].Name)
{
videoDevices[x] = devices1[i];
break;
}
}
}
for (int i = 0; i < devices2.Length; i++)
{
for (int x = 0; x < videoEncoders.Count; ++x)
{
if (videoEncoders[x].Name == devices2[i].Name)
{
videoDevices[x] = devices2[i];
break;
}
}
}
//for each compressor
Log.Log.WriteFile("analog: AddVideoCompressor found:{0} compressor", videoDevices.Length);
for (int i = 0; i < videoDevices.Length; i++)
{
IBaseFilter tmp;
if (videoDevices[i] == null || !EncodersInUse.Instance.Add(videoDevices[i], videoEncoders[i]))
{
continue;
}
Log.Log.WriteFile("analog: try compressor:{0}", videoDevices[i].Name);
int hr;
try
{
//add compressor filter to graph
hr = _graphBuilder.AddSourceFilterForMoniker(videoDevices[i].Mon, null, videoDevices[i].Name, out tmp);
}
catch (Exception)
{
Log.Log.WriteFile("analog: cannot add compressor to graph");
EncodersInUse.Instance.Remove(videoDevices[i]);
continue;
}
if (hr != 0)
{
//failed to add filter to graph, continue with the next one
if (tmp != null)
{
_graphBuilder.RemoveFilter(tmp);
Release.ComObject("videocompressor", tmp);
}
EncodersInUse.Instance.Remove(videoDevices[i]);
continue;
}
if (tmp == null)
{
EncodersInUse.Instance.Remove(videoDevices[i]);
continue;
}
// check if this compressor filter has an mpeg audio output pin
Log.Log.WriteFile("analog: connect video pin->video compressor");
IPin pinVideo = DsFindPin.ByDirection(tmp, PinDirection.Input, 0);
// we found a nice compressor, lets try to connect the analog video pin to the compressor
hr = _graphBuilder.Connect(_pinAnalogVideo, pinVideo);
if (hr != 0)
{
Log.Log.WriteFile("analog: failed to connect video pin->video compressor");
//unable to connec the pin, remove it and continue with next compressor
_graphBuilder.RemoveFilter(tmp);
Release.ComObject("videocompressor", tmp);
EncodersInUse.Instance.Remove(videoDevices[i]);
continue;
}
//succeeded.
_videoCompressorDevice = videoDevices[i];
_filterVideoCompressor = tmp;
return true;
}
return false;
}
示例8: AddAudioDecoderFilters
protected void AddAudioDecoderFilters(IFilterGraph2 graphBuilder)
{
int hr = 0;
if (this.AudioDecoderDevice != null)
hr = graphBuilder.AddSourceFilterForMoniker(this.AudioDecoderDevice.Mon, null, this.AudioDecoderDevice.Name, out this.audioDecoderFilter);
DsError.ThrowExceptionForHR(hr);
}
示例9: AddTvMultiPlexer
/// <summary>
/// Adds the multiplexer filter to the graph.
/// several posibilities
/// 1. no tv multiplexer needed
/// 2. tv multiplexer filter which is connected to a single encoder filter
/// 3. tv multiplexer filter which is connected to two encoder filter (audio/video)
/// 4. tv multiplexer filter which is connected to the capture filter
/// at the end this method the graph looks like this:
///
/// option 2: single encoder filter
/// [ ]----->[ ] [ ]
/// [ capture filter ] [ encoder filter ]----->[ multiplexer ]
/// [ ]----->[ ] [ ]
///
///
/// option 3: dual encoder filters
/// [ ]----->[ video ]
/// [ capture filter ] [ encoder filter ]------>[ ]
/// [ ] [ ] [ ]
/// [ ] [ multiplexer ]
/// [ ]----->[ audio ]------>[ ]
/// [ encoder filter ]
/// [ ]
///
/// option 4: no encoder filter
/// [ ]----->[ ]
/// [ capture filter ] [ multiplexer ]
/// [ ]----->[ ]
/// </summary>
/// <param name="matchPinNames">if set to <c>true</c> the pin names of the multiplexer filter should match the pin names of the encoder filter.</param>
/// <param name="_graphBuilder">GraphBuilder</param>
/// <param name="_tuner">Tuner</param>
/// <param name="_tvAudio">TvAudio</param>
/// <param name="_crossbar">Crossbar</param>
/// <param name="_capture">Capture</param>
/// <returns>true if encoder filters are added, otherwise false</returns>
private bool AddTvMultiPlexer(bool matchPinNames, IFilterGraph2 _graphBuilder, Tuner _tuner, TvAudio _tvAudio,
Crossbar _crossbar, Capture _capture)
{
//Log.Log.WriteFile("analog: AddTvMultiPlexer");
DsDevice[] devicesHW;
DsDevice[] devicesSW;
DsDevice[] devices;
//get a list of all multiplexers available on this system
try
{
devicesHW = DsDevice.GetDevicesOfCat(FilterCategory.WDMStreamingMultiplexerDevices);
devicesHW = DeviceSorter.Sort(devicesHW, _tuner.TunerName, _tvAudio.TvAudioName, _crossbar.CrossBarName,
_capture.VideoCaptureName, _capture.AudioCaptureName, _videoEncoderDevice,
_audioEncoderDevice, _multiplexerDevice);
// also add the SoftWare Multiplexers in case no compatible HardWare multiplexer is found (NVTV cards)
devicesSW = _tuner.IsNvidiaCard()
? DsDevice.GetDevicesOfCat(FilterCategory.MediaMultiplexerCategory)
: new DsDevice[0];
devices = new DsDevice[devicesHW.Length + devicesSW.Length];
int nr = 0;
for (int i = 0; i < devicesHW.Length; ++i)
devices[nr++] = devicesHW[i];
for (int i = 0; i < devicesSW.Length; ++i)
devices[nr++] = devicesSW[i];
}
catch (Exception ex)
{
Log.Log.WriteFile("analog: AddTvMultiPlexer no multiplexer devices found (Exception) " + ex.Message);
return false;
}
if (devices.Length == 0)
{
Log.Log.WriteFile("analog: AddTvMultiPlexer no multiplexer devices found");
return false;
}
//for each multiplexer
for (int i = 0; i < devices.Length; i++)
{
IBaseFilter tmp;
Log.Log.WriteFile("analog: AddTvMultiPlexer try:{0} {1}", devices[i].Name, i);
// if multiplexer is in use, we can skip it
if (DevicesInUse.Instance.IsUsed(devices[i]))
continue;
int hr;
try
{
//add multiplexer to graph
hr = _graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, devices[i].Name, out tmp);
}
catch (Exception)
{
Log.Log.WriteFile("analog: cannot add filter to graph");
continue;
}
if (hr != 0)
{
//failed to add it to graph, continue with the next multiplexer
if (tmp != null)
{
_graphBuilder.RemoveFilter(tmp);
Release.ComObject("multiplexer filter", tmp);
}
continue;
//.........这里部分代码省略.........
示例10: AddTvEncoderFilter
/// <summary>
/// Adds one or 2 encoder filters to the graph
/// several posibilities
/// 1. no encoder filter needed
/// 2. single encoder filter with seperate audio/video inputs and 1 (mpeg-2) output
/// 3. single encoder filter with a mpeg2 program stream input (I2S)
/// 4. two encoder filters. one for audio and one for video
///
/// At the end of this method the graph looks like:
///
/// option 2: one encoder filter, with 2 inputs
/// [ ]----->[ ]
/// [ capture filter ] [ encoder filter ]
/// [ ]----->[ ]
///
///
/// option 3: one encoder filter, with 1 input
/// [ ] [ ]
/// [ capture filter ]----->[ encoder filter ]
/// [ ] [ ]
///
///
/// option 4: 2 encoder filters one for audio and one for video
/// [ ]----->[ video ]
/// [ capture filter ] [ encoder filter ]
/// [ ] [ ]
/// [ ]
/// [ ]----->[ audio ]
/// [ encoder filter ]
/// [ ]
///
/// </summary>
/// <param name="matchPinNames">if set to <c>true</c> the pin names of the encoder filter should match the pin names of the capture filter.</param>
/// <param name="mpeg2ProgramFilter">if set to <c>true</c> than only encoders with an mpeg2 program output pins are accepted</param>
/// <param name="_graphBuilder">GraphBuilder</param>
/// <param name="_tuner">Tuner</param>
/// <param name="_tvAudio">TvAudio</param>
/// <param name="_crossbar">Crossbar</param>
/// <param name="_capture">Capture</param>
/// <returns>true if encoder filters are added, otherwise false</returns>
private bool AddTvEncoderFilter(bool matchPinNames, bool mpeg2ProgramFilter, IFilterGraph2 _graphBuilder,
Tuner _tuner, TvAudio _tvAudio, Crossbar _crossbar, Capture _capture)
{
Log.Log.WriteFile("analog: AddTvEncoderFilter - MatchPinNames: {0} - MPEG2ProgramFilter: {1}", matchPinNames,
mpeg2ProgramFilter);
bool finished = false;
DsDevice[] devices;
// first get all encoder filters available on this system
try
{
devices = DsDevice.GetDevicesOfCat(FilterCategory.WDMStreamingEncoderDevices);
devices = DeviceSorter.Sort(devices, _tuner.TunerName, _tvAudio.TvAudioName, _crossbar.CrossBarName,
_capture.VideoCaptureName, _capture.AudioCaptureName, _videoEncoderDevice,
_audioEncoderDevice, _multiplexerDevice);
}
catch (Exception)
{
Log.Log.WriteFile("analog: AddTvEncoderFilter no encoder devices found (Exception)");
return false;
}
if (devices == null)
{
Log.Log.WriteFile("analog: AddTvEncoderFilter no encoder devices found (devices == null)");
return false;
}
if (devices.Length == 0)
{
Log.Log.WriteFile("analog: AddTvEncoderFilter no encoder devices found");
return false;
}
//for each encoder
Log.Log.WriteFile("analog: AddTvEncoderFilter found:{0} encoders", devices.Length);
for (int i = 0; i < devices.Length; i++)
{
IBaseFilter tmp;
//if encoder is in use, we can skip it
if (DevicesInUse.Instance.IsUsed(devices[i]))
{
Log.Log.WriteFile("analog: skip :{0} (inuse)", devices[i].Name);
continue;
}
Log.Log.WriteFile("analog: try encoder:{0} {1}", devices[i].Name, i);
int hr;
try
{
//add encoder filter to graph
hr = _graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, devices[i].Name, out tmp);
}
catch (Exception)
{
Log.Log.WriteFile("analog: cannot add filter {0} to graph", devices[i].Name);
continue;
}
if (hr != 0)
{
//failed to add filter to graph, continue with the next one
if (tmp != null)
{
_graphBuilder.RemoveFilter(tmp);
Release.ComObject("TvEncoderFilter", tmp);
//.........这里部分代码省略.........
示例11: Initialize
/// <summary>
/// Initializes the devices and prepares for capture
/// </summary>
public void Initialize()
{
_filterGraph = new FilterGraph() as IFilterGraph2;
_mediaCtrl = _filterGraph as IMediaControl;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;
int status;
try
{
capGraph = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
sampGrabber = new SampleGrabber() as ISampleGrabber;
status = capGraph.SetFiltergraph(_filterGraph);
DsError.ThrowExceptionForHR(status);
//Adds the video device
status = _filterGraph.AddSourceFilterForMoniker(_device.DsDevice.Mon, null, "Video input", out capFilter);
DsError.ThrowExceptionForHR(status);
IBaseFilter baseGrabFilter = sampGrabber as IBaseFilter;
ConfigureSampleGrabber(sampGrabber);
// Add the frame grabber to the graph
status = _filterGraph.AddFilter(baseGrabFilter, ".net grabber");
DsError.ThrowExceptionForHR(status);
//TODO: Set Framerate, height and width here
status = capGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, baseGrabFilter);
DsError.ThrowExceptionForHR(status);
SaveSizeInfo(sampGrabber);
_bitmapMemory = Marshal.AllocCoTaskMem(_stride * _videoHeight);
}
finally
{
if (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (sampGrabber != null)
{
Marshal.ReleaseComObject(sampGrabber);
sampGrabber = null;
}
if (capGraph != null)
{
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}
示例12: CreateFilterInstance
/// <summary>
/// Creates the tuner filter instance
/// </summary>
/// <param name="graph">The stored graph</param>
/// <param name="graphBuilder">The graphbuilder</param>
/// <returns>true, if the graph building was successful</returns>
public bool CreateFilterInstance(Graph graph, IFilterGraph2 graphBuilder)
{
Log.Log.WriteFile("analog: AddTvTunerFilter {0}", _tunerDevice.Name);
if (DevicesInUse.Instance.IsUsed(_tunerDevice))
return false;
IBaseFilter tmp;
int hr;
try
{
hr = graphBuilder.AddSourceFilterForMoniker(_tunerDevice.Mon, null, _tunerDevice.Name, out tmp);
}
catch (Exception)
{
Log.Log.WriteFile("analog: cannot add filter to graph");
return false;
}
if (hr != 0)
{
Log.Log.Error("analog: AddTvTunerFilter failed:0x{0:X}", hr);
throw new TvException("Unable to add tvtuner to graph");
}
_filterTvTuner = tmp;
DevicesInUse.Instance.Add(_tunerDevice);
_tuner = _filterTvTuner as IAMTVTuner;
if (string.IsNullOrEmpty(graph.Tuner.Name) || !_tunerDevice.Name.Equals(
graph.Tuner.Name))
{
Log.Log.WriteFile("analog: Detecting capabilities of the tuner");
graph.Tuner.Name = _tunerDevice.Name;
int index;
_audioPin = FilterGraphTools.FindMediaPin(_filterTvTuner, MediaType.AnalogAudio, MediaSubType.Null,
PinDirection.Output, out index);
graph.Tuner.AudioPin = index;
return CheckCapabilities(graph);
}
Log.Log.WriteFile("analog: Using stored capabilities of the tuner");
_audioPin = DsFindPin.ByDirection(_filterTvTuner, PinDirection.Output, graph.Tuner.AudioPin);
_supportsFMRadio = (graph.Tuner.RadioMode & RadioMode.FM) != 0;
_supportsAMRadio = (graph.Tuner.RadioMode & RadioMode.AM) != 0;
return true;
}
示例13: InitCaptureGraph
/// <summary>
///
/// </summary>
private void InitCaptureGraph()
{
mGraphBuilder = (IFilterGraph2)new FilterGraph();
mMediaControl = (IMediaControl)mGraphBuilder;
ISampleGrabber sampleGrabber = null;
IBaseFilter captureFilter = null;
ICaptureGraphBuilder2 captureGraph = null;
try
{
captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
sampleGrabber = (ISampleGrabber)new SampleGrabber();
int hr = captureGraph.SetFiltergraph(mGraphBuilder);
DsError.ThrowExceptionForHR(hr);
hr = mGraphBuilder.AddSourceFilterForMoniker(mDevice.Mon, null, "Video input", out captureFilter);
DsError.ThrowExceptionForHR(hr);
IBaseFilter baseGrabberFilter = (IBaseFilter)sampleGrabber;
ConfigureSampleGrabber(sampleGrabber);
hr = mGraphBuilder.AddFilter(baseGrabberFilter, "Ds.NET Grabber");
DsError.ThrowExceptionForHR(hr);
if (mFrameRate + mHeight + mWidth > 0)
{
InitConfigParams(captureGraph, captureFilter);
}
hr = captureGraph.RenderStream(PinCategory.Capture, MediaType.Video, captureFilter, null, baseGrabberFilter);
DsError.ThrowExceptionForHR(hr);
SaveSizeInfo(sampleGrabber);
}
finally
{
if (captureFilter != null)
{
Marshal.ReleaseComObject(captureFilter);
captureFilter = null;
}
if (sampleGrabber != null)
{
Marshal.ReleaseComObject(sampleGrabber);
sampleGrabber = null;
}
if (captureGraph != null)
{
Marshal.ReleaseComObject(captureGraph);
captureGraph = null;
}
}
}
示例14: Caps
/// <summary>
/// Returns the <see cref="CameraInfo"/> for the given <see cref="DsDevice"/>.
/// </summary>
/// <param name="dev">A <see cref="DsDevice"/> to parse name and capabilities for.</param>
/// <returns>The <see cref="CameraInfo"/> for the given device.</returns>
private CameraInfo Caps(DsDevice dev)
{
var camerainfo = new CameraInfo();
try
{
// Get the graphbuilder object
m_graphBuilder = (IFilterGraph2) new FilterGraph();
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
// Add the video device
int hr = m_graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, "Video input", out capFilter);
//DsError.ThrowExceptionForHR(hr);
if (hr != 0)
{
return null;
}
hr = capGraph.SetFiltergraph(m_graphBuilder);
DsError.ThrowExceptionForHR(hr);
hr = m_graphBuilder.AddFilter(capFilter, "Ds.NET Video Capture Device");
DsError.ThrowExceptionForHR(hr);
object o = null;
DsGuid cat = PinCategory.Capture;
DsGuid type = MediaType.Interleaved;
DsGuid iid = typeof (IAMStreamConfig).GUID;
// Check if Video capture filter is in use
hr = capGraph.RenderStream(cat, MediaType.Video, capFilter, null, null);
if (hr != 0)
{
return null;
}
//hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Interleaved, capFilter, typeof(IAMStreamConfig).GUID, out o);
//if (hr != 0)
//{
hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter,
typeof (IAMStreamConfig).GUID, out o);
DsError.ThrowExceptionForHR(hr);
//}
var videoStreamConfig = o as IAMStreamConfig;
int iCount = 0;
int iSize = 0;
try
{
if (videoStreamConfig != null) videoStreamConfig.GetNumberOfCapabilities(out iCount, out iSize);
}
catch (Exception ex)
{
//ErrorLogger.ProcessException(ex, false);
return null;
}
pscc = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof (VideoStreamConfigCaps)));
camerainfo.Name = dev.Name;
camerainfo.DirectshowDevice = dev;
for (int i = 0; i < iCount; i++)
{
VideoStreamConfigCaps scc;
try
{
AMMediaType curMedType;
if (videoStreamConfig != null) hr = videoStreamConfig.GetStreamCaps(i, out curMedType, pscc);
Marshal.ThrowExceptionForHR(hr);
scc = (VideoStreamConfigCaps) Marshal.PtrToStructure(pscc, typeof (VideoStreamConfigCaps));
var CSF = new CamSizeFPS();
CSF.FPS = (int) (10000000/scc.MinFrameInterval);
CSF.Height = scc.InputSize.Height;
CSF.Width = scc.InputSize.Width;
if (!InSizeFpsList(camerainfo.SupportedSizesAndFPS, CSF))
if (ParametersOK(CSF))
camerainfo.SupportedSizesAndFPS.Add(CSF);
}
catch (Exception ex)
{
//ErrorLogger.ProcessException(ex, false);
}
}
}
finally
{
//.........这里部分代码省略.........
示例15: SetupGraph
/// <summary> build the capture graph. </summary>
private void SetupGraph(DsDevice dev, string szOutputFileName)
{
int hr;
IBaseFilter capFilter = null;
IBaseFilter asfWriter = null;
ICaptureGraphBuilder2 capGraph = null;
// Get the graphbuilder object
m_FilterGraph = (IFilterGraph2)new FilterGraph();
#if DEBUG
m_rot = new DsROTEntry( m_FilterGraph );
#endif
try
{
// Get the ICaptureGraphBuilder2
capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
// Start building the graph
hr = capGraph.SetFiltergraph( m_FilterGraph );
Marshal.ThrowExceptionForHR( hr );
// Add the capture device to the graph
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
Marshal.ThrowExceptionForHR( hr );
asfWriter = ConfigAsf(capGraph, szOutputFileName);
hr = capGraph.RenderStream(null, null, capFilter, null, asfWriter);
Marshal.ThrowExceptionForHR( hr );
m_mediaCtrl = m_FilterGraph as IMediaControl;
}
finally
{
if (capFilter != null)
{
Marshal.ReleaseComObject(capFilter);
capFilter = null;
}
if (asfWriter != null)
{
Marshal.ReleaseComObject(asfWriter);
asfWriter = null;
}
if (capGraph != null)
{
Marshal.ReleaseComObject(capGraph);
capGraph = null;
}
}
}