还有另一种方法可以在directshow中保存视频

时间:2011-05-18 21:54:41

标签: c# directshow directshow.net

我正在使用DirectShow.Net,我正在从网络摄像头捕获视频并将其保存到AVI文件中。 AVI文件可能会变大,我想以不同的格式保存它。我正在使用ICaptureGraphBuilder2 :: SetOutputFileName(MediaSubType.type,name,out,out)。 ICaptureGraphBuilder只允许我使用.AVI或.ASF的MediaSubType来保存文件。如果我尝试更改它尝试保存的类型,它将崩溃:

            graphBuilder = (IGraphBuilder) new FilterGraph();

        //Create the Capture Graph Builder

        ICaptureGraphBuilder2 captureGraphBuilder = null;
        captureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

        //Create the media control for controlling the graph
        mediaControl = (IMediaControl) this.graphBuilder;

        // Attach the filter graph to the capture graph
        int hr = captureGraphBuilder.SetFiltergraph(this.graphBuilder);
        DsError.ThrowExceptionForHR(hr);

        //Add the Video input device to the graph
        hr = graphBuilder.AddFilter(theDevice, "source filter");
        DsError.ThrowExceptionForHR(hr);


        //Add the Video compressor filter to the graph
        hr = graphBuilder.AddFilter(theCompressor, "compressor filter");
        DsError.ThrowExceptionForHR(hr);

        //Create the file writer part of the graph. SetOutputFileName does this for us, and returns the mux and sink
        IBaseFilter mux;
        IFileSinkFilter sink;
        hr = captureGraphBuilder.SetOutputFileName(MediaSubType.MPEG1Video, textBox1.Text, out mux, out sink);
        captureGraphBuilder.SetOutputFileName

        DsError.ThrowExceptionForHR(hr);


        //Render any preview pin of the device
        hr = captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, theDevice, null, null);
        DsError.ThrowExceptionForHR(hr);

有没有办法保存到AVI或ASF以外的任何东西而不会有太多麻烦?

2 个答案:

答案 0 :(得分:4)

问题很可能不是AVI容器格式,而是您用来压缩视频的编解码器。

你需要添加一个不同的视频压缩过滤器(可能是MPEG4或AVC),无论你得到什么,它都可能提供你可以而且应该使用的MP4多路复用器,而不是你现在使用的avi mux。

答案 1 :(得分:0)

您是否看过EmguCV(www.emgu.com,它是open cv的.net包装器。这里有许多可能有帮助的类。