1

我正在使用 C#.net 中的 DirectshowLib2005.dll 从网络摄像头录制视频。我有这个代码来 startVideoRecoding,如下所示。

try
        {
            IBaseFilter capFilter = null;
            IBaseFilter asfWriter = null;
            IFileSinkFilter pTmpSink = null;
            ICaptureGraphBuilder2 captureGraph = null;
            GetVideoDevice();
            if (availableVideoInputDevices.Count > 0)
            {
                //
                //init capture graph
                //
                graphBuilder = (IFilterGraph2)new FilterGraph();
                captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
                //
                //sets filter object from graph
                //
                captureGraph.SetFiltergraph(graphBuilder);
                //
                //which device will use graph setting
                //
                graphBuilder.AddSourceFilterForMoniker(AvailableVideoInputDevices.First().Mon, null, AvailableVideoInputDevices.First().Name, out capFilter);
                captureDeviceName = AvailableVideoInputDevices.First().Name;
                //
                //check saving path is exsist or not;if not then create
                //
                if (!Directory.Exists(ConstantHelper.RootDirectoryName + "\\Assets\\Video\\"))
                {
                    Directory.CreateDirectory(ConstantHelper.RootDirectoryName + "\\Assets\\Video\\");
                }
                #region WMV                   
                //
                //sets output file name,and file type
                //
                captureGraph.SetOutputFileName(MediaSubType.Asf, ConstantHelper.RootDirectoryName + "\\Assets\\Video\\" + videoFilename + ".wmv", out asfWriter, out pTmpSink);                    
                //
                //configure which video setting is used by graph
                //                
                IConfigAsfWriter lConfig = asfWriter as IConfigAsfWriter;
                Guid asfFilter = new Guid("8C45B4C7-4AEB-4f78-A5EC-88420B9DADEF");
                lConfig.ConfigureFilterUsingProfileGuid(asfFilter);
                #endregion
                //
                //render the stram to output file using graph setting
                //
                captureGraph.RenderStream(null, null, capFilter, null, asfWriter);
                m_mediaCtrl = graphBuilder as IMediaControl;
                m_mediaCtrl.Run();
                isVideoRecordingStarted = true;
                VideoStarted(m_mediaCtrl, null);
            }
            else
            {
                isVideoRecordingStarted = false;
            }
        }
        catch (Exception Ex)
        {               
           ErrorLogging.WriteErrorLog(Ex);
        }

如果你观察这行代码

//
                //configure which video setting is used by graph
                //                
                IConfigAsfWriter lConfig = asfWriter as IConfigAsfWriter;
                Guid asfFilter = new Guid("8C45B4C7-4AEB-4f78-A5EC-88420B9DADEF");
                lConfig.ConfigureFilterUsingProfileGuid(asfFilter);

它将应用该 GUID 上描述的视频设置,我从位于“C:\windows\WMSysPr9.prx”的文件中获取此 GUID。

所以我的问题是如何使用格式、分辨率和所有内容创建我自己的视频设置?

如何使用网络摄像头以黑白模式或灰度模式录制视频?

4

1 回答 1

1

所以我的问题是如何使用格式、分辨率和所有内容创建我自己的视频设置?

不推荐使用基于 GUID 的配置文件,但您仍然可以使用它们。您可以使用和朋友在代码中构建自定义配置文件WMCreateProfileManager(您从空配置文件开始,并自行决定添加视频和/或音频流)。这是 C++ API,我想WindowsMedia.NET是您已经在使用的 DirectShowLib 的姊妹项目,它为您提供了与 .NET 代码的接口。

Windows SDKWMGenProfile示例展示了如何手动构建配置文件,并为您提供了一个工具来交互式地构建它并保存到.PRX您可以在应用程序中使用的文件中。

$(WindowsSDK)\Samples\multimedia\windowsmediaformat\wmgenprofile

在此处输入图像描述

如何使用网络摄像头以黑白模式或灰度模式录制视频?

相机给你一张照片,然后它通过管道通过某些处理进行记录。使其灰度化的能力并不是与生俱来的。

您可能需要考虑两件事。首先,如果相机能够在捕获时剥离颜色信息,您可以利用这一点。检查一下 - 如果它的设置有饱和度滑块,那么你只需把它输入最小值位置,相机就会给你灰度。

在代码中,您IAMVideoProcAmp为此使用接口。

另一个选项,包括如果相机缺少提到的功能,是应用后处理过滤器或转换为灰度的效果。没有这方面的原液,否则有几种方法可以达到效果:

  • 使用去除颜色的第三方过滤器
  • 从 DirectShow 管道导出,使用Color Control Transform DSP(从 Win Vista 开始可用)或 GDI 函数转换代码中的数据
  • 在流管道中使用 Sample Grabber 并直接更新图像位
于 2012-05-31T06:55:46.317 回答