Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中使用Directshow.Net同时进行视频流和录制?_C#_Directshow.net - Fatal编程技术网

在c#中使用Directshow.Net同时进行视频流和录制?

在c#中使用Directshow.Net同时进行视频流和录制?,c#,directshow.net,C#,Directshow.net,我想使用Directshow.Net通过网络摄像头录制视频。我可以使用ASFWriter录制视频,但在录制的同时,我想将视频流到局域网中的PC上。我尝试了这个 我运行的项目,我开发的录像这是代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te

我想使用Directshow.Net通过网络摄像头录制视频。我可以使用ASFWriter录制视频,但在录制的同时,我想将视频流到局域网中的PC上。我尝试了这个

我运行的项目,我开发的录像这是代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DirectShowLib;
using DirectShowLib.DMO;
using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;
using System.IO;

namespace Cam_Recording_V1_directshow.net_
{
public partial class Form1 : Form
{
    string captureDeviceName = string.Empty;
    IFilterGraph2 Graph = null;
    IMediaControl m_mediaCtrl = null;
    public List<DsDevice> AvailableVideoInputDevices { get; private set; }
    IAMVideoProcAmp vpa;
    [DllImport("olepro32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    private static extern int OleCreatePropertyFrame(IntPtr hwndOwner, int x, int y,
        string lpszCaption, int cObjects,
        [In, MarshalAs(UnmanagedType.Interface)] ref object ppUnk,
        int cPages, IntPtr pPageClsID, int lcid, int dwReserved, IntPtr pvReserved);
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        IBaseFilter capFilter = null;
        IBaseFilter asfWriter = null;
        IFileSinkFilter pTmpSink = null;
        ICaptureGraphBuilder2 captureGraph = null;
        object o;

        //
        //Get list of video devices
        //
        AvailableVideoInputDevices = new List<DsDevice>();
        DsDevice[] videoInputDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
        AvailableVideoInputDevices.AddRange(videoInputDevices);
        if (AvailableVideoInputDevices.Count > 0)
        {
            //
            //init capture graph
            //
            Graph = (IFilterGraph2)new FilterGraph();
            captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();

            //
            //sets filter object from graph
            //
            captureGraph.SetFiltergraph(Graph);
            //
            //which device will use graph setting
            //
            Graph.AddSourceFilterForMoniker(AvailableVideoInputDevices.First().Mon, null, AvailableVideoInputDevices.First().Name, out capFilter);
            captureDeviceName = AvailableVideoInputDevices.First().Name;
            #region WMV
            //
            //sets output file name,and file type
            //
            captureGraph.SetOutputFileName(MediaSubType.Asf, /*DateTime.Now.Ticks.ToString()  +".wmv"*/ "test.wmv", out asfWriter, out pTmpSink);
            //
            //configure which video setting is used by graph
            //                
            IConfigAsfWriter lConfig = asfWriter as IConfigAsfWriter;
            Guid cat = new Guid("8C45B4C7-4AEB-4f78-A5EC-88420B9DADEF");
            lConfig.ConfigureFilterUsingProfileGuid(cat);
            #endregion                      
            captureGraph.RenderStream(PinCategory.Preview, MediaType.Video, capFilter, null, null);

            captureGraph.RenderStream(PinCategory.Capture, MediaType.Video, capFilter, null, asfWriter);
            m_mediaCtrl = Graph as IMediaControl;
            m_mediaCtrl.Run();
        }
        else
        {
            MessageBox.Show("Video Capture Device Not Found!!");
            button1.Visible = false;
        }
    }
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用DirectShowLib;
使用DirectShowLib.DMO;
使用System.Runtime.InteropServices;
使用System.Drawing.Drawing2D;
使用System.IO;
名称空间Cam_Recording_V1_directshow.net_
{
公共部分类Form1:Form
{
string captureDeviceName=string.Empty;
IFilterGraph2图形=空;
IMediaControl m_mediaCtrl=null;
public List AvailableVideoInputDevices{get;private set;}
视讯放大器vpa;
[DllImport(“olepro32.dll”,CharSet=CharSet.Unicode,ExactSpelling=true)]
私有静态外部内部OleCreatePropertyFrame(IntPtr hwndOwner、intx、inty、,
字符串lpszCaption,int cObjects,
[In,marshallas(UnmanagedType.Interface)]ref object ppUnk,
int cPages、IntPtr pPageClsID、int lcid、int DWREFERED、IntPtr PVREFERED);
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
IBaseFilter capFilter=null;
IBaseFilter asfWriter=null;
IFileSinkFilter pTmpSink=null;
ICaptureGraphBuilder2 captureGraph=null;
对象o;
//
//获取视频设备列表
//
AvailableVideoInputDevices=新列表();
DsDevice[]videoInputDevices=DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
AvailableVideoInputDevices.AddRange(视频输入设备);
如果(AvailableVideoInputDevices.Count>0)
{
//
//初始捕获图
//
Graph=(IFilterGraph2)新的FilterGraph();
captureGraph=(ICaptureGraphBuilder2)新CaptureGraphBuilder2();
//
//从图形中设置过滤器对象
//
captureGraph.SetFiltergraph(图形);
//
//哪个设备将使用图形设置
//
Graph.addSourceFilterPerformoniker(AvailableVideoInputDevices.First().Mon,null,AvailableVideoInputDevices.First().Name,out-capFilter);
captureDeviceName=AvailableVideoInputDevices.First().Name;
#区域WMV
//
//设置输出文件名和文件类型
//
captureGraph.SetOutputFileName(MediaSubType.Asf,/*DateTime.Now.Ticks.ToString()+“.wmv”*/“test.wmv”,out asfWriter,out pTmpSink);
//
//配置图形使用的视频设置
//                
IConfigAsfWriter lConfig=作为IConfigAsfWriter的asfWriter;
Guid cat=新Guid(“8C45B4C7-4AEB-4f78-A5EC-88420B9DADEF”);
lConfig.ConfigureFilterUsingProfileGuid(cat);
#端区
RenderStream(PinCategory.Preview,MediaType.Video,capFilter,null,null);
RenderStream(PinCategory.Capture,MediaType.Video,capFilter,null,asfWriter);
m_mediaCtrl=作为IMediaControl的图形;
m_mediaCtrl.Run();
}
其他的
{
MessageBox.Show(“未找到视频捕获设备!!”;
按钮1.可见=假;
}
}
这将开始视频录制..在我从“Release”文件夹运行project exe之后,它将出现类似“media run failed”的错误

现在我的问题是,可以同时录制和直播吗?


如果是,那么请指导我完成此操作。同时请指导我的操作。这也

我认为您应该手动构建此图。此图应该与下面的图类似。您可以使用GraphidT测试此图。这也有助于获取Guid和PinNames

VideoSource -> SmartTee -> StreamingFilter
                        -> CaptureFilter
DirectShowLib提供构建图形所需的所有函数

您可以像在示例中一样创建筛选器。可以直接创建SmartTee筛选器

您应该使用graph.connect()方法连接筛选器。使用此方法,您可以使用SmartTee筛选器生成以下图形。SmartTee筛选器应该在您的系统上可用,并提供两个输出插脚,一个用于捕获,一个用于预览。您应该使用preview插脚进行流式处理,使用capture插脚进行捕获筛选器

您可以使用以下功能获取连接方法所需的Pin:

    public IPin GetPin(IBaseFilter filter, string pinname)
    {
        IEnumPins epins;
        int hr = filter.EnumPins(out epins);
        if(hr < 0)
            return null;
        IntPtr fetched = Marshal.AllocCoTaskMem(4);
        IPin[] pins = new IPin[1];
        epins.Reset();
        while (epins.Next(1, pins, fetched) == 0)
        {
            PinInfo pinfo;
            pins[0].QueryPinInfo(out pinfo);
            bool found = (pinfo.name == pinname);
            DsUtils.FreePinInfo(pinfo);
            if (found)
                return pins[0];
        }
        return null;
    }
public IPin-GetPin(IBaseFilter-filter,string-pinname)
{
伊努宾斯皮恩斯;
int hr=过滤器.枚举管脚(输出管脚);
如果(hr<0)
返回null;
IntPtr fetched=Marshal.alloctaskmem(4);
IPin[]引脚=新IPin[1];
epins.Reset();
while(epins.Next(1,pins,fetched)=0)
{
PinInfo-pinfo;
引脚[0]。QueryPinfo(输出引脚信息);
bool found=(pinfo.name==pinname);
DsUtils.FreePinInfo(pinfo);
如果(找到)
返回销[0];
}
返回null;
}

最后,你必须启动图表,一切都会顺利进行。重要的是在每次方法调用后检查hr代码以进行错误处理。

感谢Maria的回复。我会尝试一下。你实现过吗?@KristjanKica是的,正如回答中所说,我已经使用流式过滤器手动创建了图表