我正在使用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 ..
所以我的问题是如何使用格式,分辨率和所有内容创建我自己的视频设置?
如何使用网络摄像头以黑白模式或灰度模式录制视频?
答案 0 :(得分:1)
所以我的问题是如何使用格式,分辨率和所有内容创建我自己的视频设置?
不推荐使用基于GUID的配置文件,但您仍可以使用它们。您可以使用WMCreateProfileManager
和朋友在代码中构建自定义配置文件(您可以自定义空配置文件并添加视频和/或音频流)。这是C ++ API,我认为WindowsMedia.NET是您已经使用的DirectShowLib的姊妹项目,为您提供了.NET代码的接口。
Windows SDK WMGenProfile
sample都显示了如何手动构建配置文件,并为您提供了一个交互式构建配置文件的工具,并保存到您可以在应用程序中使用的.PRX
文件中。
$(WindowsSDK)\样品\多媒体\ windowsmediaformat \ wmgenprofile
如何使用网络摄像头以黑白模式或灰度模式录制视频?
相机为您提供了一张照片,然后通过管道直到通过某些处理进行录制。使其成为灰度的能力不是固有的。
您可能想要考虑两件事。首先,如果相机能够在捕获时剥离颜色信息,您可以利用它。检查一下 - 如果它的设置有饱和度滑块,那么你只需将它输入最小值位置,相机就会给你灰度。
在代码中,您使用IAMVideoProcAmp
接口。
另一个选项,包括相机是否缺少上述功能,是应用后处理滤镜或转换为灰度的效果。没有库存解决方案,否则有几种方法可以达到这个效果:
Color Control Transform DSP
(可从Win Vista开始)或GDI函数转换代码中的数据