【问题标题】:Video Compression Does not work for a live Capture视频压缩不适用于实时捕获
【发布时间】:2013-07-20 05:19:20
【问题描述】:

以下是我的过滤器图。我正在尝试在过滤器图中插入“ffdshow 视频编码器”编码器,但我无法这样做。

以下是我在生成 filtergraph 后尝试连接 Compressor 的代码:

public void setFileName(string pFileName)
    {
        int hr;
        IBaseFilter _infinitePinTeeFilter = null;
        graph.FindFilterByName("Infinite Pin Tee Filter", out _infinitePinTeeFilter); 

        mediaControl.Stop();
        hr = captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, pFileName, out mux, out sink);
        checkHR(hr, "Can't set SetOutputFile");
        hr = captureGraphBuilder.RenderStream(null, MediaType.Video, _infinitePinTeeFilter, _videoCompressor, mux);
        checkHR(hr, "Can't Render Output File");
        mediaControl.Run();
    }

任何帮助将不胜感激...谢谢。

【问题讨论】:

    标签: c# video directshow directshow.net


    【解决方案1】:

    ICaptureGraphBuilder::SetOutputFileName 不是用于设置图形的 API 的好选择。对于简单的图表,它可以很好地完成这项工作,但是因为它会在没有很好的描述和错误实际发生的阶段将错误转发给您,因此每次您很难理解出了什么问题。

    问题可能是由于视频压缩器输出的媒体类型上缺少帧速率信息,但作为您在屏幕截图上的构建阶段,您甚至还没有此媒体类型可用,您无法进行故障排除并获取此信息。

    改用IGraphBuilder::AddFilterIGraphBuilder::ConnectIFileSinkiFilter::SetFileName 来可靠地配置管道。

    【讨论】:

    • 非常感谢。如果能提供一些代码参考,那就太好了。此外,我是否可以在同一个图表中进行视频流、采样和文件保存(带压缩)?
    • 您正在构建的拓扑可以完成并且可以工作(特别是在捕获+预览+抓取+录制方面)。 AVI Mux 可能对媒体类型有自己的要求,视频压缩器也有自己的要求。当您执行批量操作SetOutputFileName/RenderStream 以完成图表时,您看不到它失败的地方。当您逐步添加内容时,您可以看到这一点。
    • 谢谢你!你总是帮忙!!
    猜你喜欢
    • 2020-04-10
    • 2018-08-30
    • 2018-11-27
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多