要使用DirectShow调用摄像头录像,首先需要安装DirectShow库,并在C#项目中引用该库。\n以下是一个简单的示例代码,演示如何使用DirectShow调用摄像头录像:\n\ncsharp\nusing System;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\nusing DirectShowLib;\n\nnamespace CameraRecording\n{\n public partial class MainForm : Form\n {\n private IFilterGraph2 filterGraph;\n private ICaptureGraphBuilder2 captureGraphBuilder;\n private IBaseFilter videoCaptureFilter;\n private IBaseFilter aviMuxFilter;\n private IBaseFilter fileWriterFilter;\n private IAMStreamConfig videoStreamConfig;\n\n public MainForm()\n {\n InitializeComponent();\n }\n\n private void MainForm_Load(object sender, EventArgs e)\n {\n try\n {\n // 创建Filter Graph对象\n filterGraph = (IFilterGraph2)new FilterGraph();\n\n // 创建Capture Graph Builder对象\n captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();\n\n // 将Filter Graph和Capture Graph Builder关联起来\n captureGraphBuilder.SetFiltergraph(filterGraph);\n\n // 创建Video Capture Filter对象\n videoCaptureFilter = CreateVideoCaptureFilter();\n\n // 创建AVI Mux Filter对象\n aviMuxFilter = (IBaseFilter)new AVIMux();\n\n // 创建File Writer Filter对象\n fileWriterFilter = CreateFileWriterFilter();\n\n // 添加Filter到Filter Graph中\n filterGraph.AddFilter(videoCaptureFilter, "Video Capture");\n filterGraph.AddFilter(aviMuxFilter, "AVI Mux");\n filterGraph.AddFilter(fileWriterFilter, "File Writer");\n\n // 连接Filter\n captureGraphBuilder.RenderStream(null, MediaType.Video, videoCaptureFilter, null, aviMuxFilter);\n captureGraphBuilder.RenderStream(null, MediaType.Audio, videoCaptureFilter, null, aviMuxFilter);\n captureGraphBuilder.RenderStream(null, MediaType.Video, aviMuxFilter, null, fileWriterFilter);\n\n // 配置视频输出格式\n videoStreamConfig = GetVideoStreamConfig();\n ConfigureVideoOutput();\n\n // 开始录像\n captureGraphBuilder.ControlStream(VSFilterCategory.VideoInputDevice, CLSID_VideoInputDeviceCategory, videoCaptureFilter, null, null, 0, 0);\n }\n catch (Exception ex)\n {\n MessageBox.Show("Error: " + ex.Message);\n }\n }\n\n private IBaseFilter CreateVideoCaptureFilter()\n {\n // 获取视频输入设备\n var videoInputDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);\n\n if (videoInputDevices.Length == 0)\n {\n throw new Exception("No video input devices found.");\n }\n\n // 创建视频输入设备Filter\n var videoCaptureFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(videoInputDevices[0].ClassID));\n\n return videoCaptureFilter;\n }\n\n private IBaseFilter CreateFileWriterFilter()\n {\n // 创建File Writer Filter\n var fileWriterFilter = (IBaseFilter)new FileWriter();\n\n // 设置录像文件名\n var fileSink = (IFileSinkFilter)fileWriterFilter;\n fileSink.SetFileName(@"C:\path\to\output.avi", null);\n\n return fileWriterFilter;\n }\n\n private IAMStreamConfig GetVideoStreamConfig()\n {\n // 获取视频输出流配置\n var mediaControl = (IMediaControl)filterGraph;\n var mediaSeeking = (IMediaSeeking)filterGraph;\n\n mediaControl.Pause();\n mediaSeeking.SetTimeFormat(TimeFormat.Frame);\n\n var videoStream = DsFindPin.ByCategory(videoCaptureFilter, PinCategory.Capture, 0);\n var videoStreamConfig = (IAMStreamConfig)videoStream;\n\n return videoStreamConfig;\n }\n\n private void ConfigureVideoOutput()\n {\n // 设置视频输出格式\n int count, size;\n videoStreamConfig.GetNumberOfCapabilities(out count, out size);\n\n var videoInfoHeaderPtr = Marshal.AllocCoTaskMem(size);\n\n for (int i = 0; i < count; i++)\n {\n AMMediaType mediaType;\n videoStreamConfig.GetStreamCaps(i, out mediaType, videoInfoHeaderPtr);\n\n var videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(videoInfoHeaderPtr, typeof(VideoInfoHeader));\n\n // 设置帧率\n videoInfoHeader.AvgTimePerFrame = 400000; // 25 fps\n\n Marshal.StructureToPtr(videoInfoHeader, videoInfoHeaderPtr, false);\n videoStreamConfig.SetFormat(mediaType);\n }\n\n Marshal.FreeCoTaskMem(videoInfoHeaderPtr);\n }\n\n private void MainForm_FormClosing(object sender, FormClosingEventArgs e)\n {\n // 停止录像\n captureGraphBuilder.ControlStream(VSFilterCategory.VideoInputDevice, CLSID_VideoInputDeviceCategory, videoCaptureFilter, null, null, 0, 1);\n\n // 释放资源\n Marshal.ReleaseComObject(videoStreamConfig);\n Marshal.ReleaseComObject(fileWriterFilter);\n Marshal.ReleaseComObject(aviMuxFilter);\n Marshal.ReleaseComObject(videoCaptureFilter);\n Marshal.ReleaseComObject(captureGraphBuilder);\n Marshal.ReleaseComObject(filterGraph);\n }\n }\n}\n\n\n在上述代码中,MainForm_Load方法是窗体加载时触发的事件,用于初始化DirectShow相关对象、连接Filter、配置视频输出格式,并开始录像。MainForm_FormClosing方法是窗体关闭时触发的事件,用于停止录像并释放资源。\n\n请注意,上述示例仅提供了基本的录像功能,如果需要更多高级功能,例如设置分辨率、选择摄像头等,可能需要进一步探索DirectShow的API文档和示例代码。\n

C# DirectShow 摄像头录像教程:详细步骤和代码示例

原文地址: https://www.cveoy.top/t/topic/qqDe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录