【问题标题】:DirectShow Connect() vs ConnectDirect()DirectShow Connect() 与 ConnectDirect()
【发布时间】:2015-10-04 12:14:51
【问题描述】:

我目前正在开发一个使用 DirectShow 的应用程序。 该应用程序应支持许多不同的网络摄像头,这些摄像头可能具有许多不同的输出引脚 ColorSpace 配置(RGB、YUV、I420 等)。

编码时,我将始终使用相同的编码过滤器和 mux + 文件写入器 - 但是我不知道如何将源过滤器上的输出引脚连接到编码过滤器上的输入引脚,因为它取决于源过滤器的输出 ColorSpace。

例子:

  1. Source1 (RGB24) -> 色彩空间转换器 -> RGB2YUV -> 编码器 -> 多路复用器 -> 文件编写器。
  2. Source2 (YUV) -> 编码器 -> Mux -> 文件编写器。
  3. Source3 (MJPG) -> MJPEG 解压器 -> 色彩空间转换器 -> RGB2YUV -> 编码器 -> Mux -> 文件写入器。

等等......这意味着在编码器之前可能会有很多不同的过滤器配置。 我现在的问题是,使用 Intelligent Connect() 而不是 ConnectDirect() 将 Source 过滤器连接到编码器过滤器是否完全可以? 还是我每次都必须检查源输出引脚的媒体类型,并根据源输出引脚的色彩空间(RGB、YUV..)手动构建图形?

有没有一种我可能不知道的简单方法 - 似乎有无数种可能性可以将源过滤器连接到编码器..

感谢您的帮助。

【问题讨论】:

    标签: winapi video directshow directshow.net


    【解决方案1】:

    使用Connect 和智能连接很好。基本上,这意味着您要求“以某种方式”和“尽可能最好的方式”连接引脚。

    但是,由于在许多情况下可能存在许多选项、不同的环境、硬件和配置,因此您希望以已知的可预测方式连接(尤其是在编码方面,而不是解码方面)。

    一个好的策略是将Connect(和ConnectDirect)连接到您知道并确定您完全需要它们的各个过滤器,然后将智能连接留给您对系统提供的过滤器链没问题的连接,尤其是当涉及到解码以及 Windows 应该在哪里为您选择可用的解码器时。

    此外,当智能连接出现问题时,您是Connect 还是ConnectDirect 几乎没有什么区别。无论哪种方式,过滤器都使用媒体类型连接,有时他们可能会在旅途中重新同意媒体类型。更重要的是您是连接到已知过滤器,还是让 Intelligent Connect 为您提供连接所需的过滤器。选择不正确的过滤器,或者根本没有注册错误的过滤器导致进程崩溃而不是连接管道,这往往是真正令人头疼的问题。

    【讨论】:

    • 如果我理解正确的话,Source -> Connect(Encoder); Encoder -> DirectConnect(Mux); Mux -> DirectConnect(FileWriter); 你会这样做吗?
    • 我会在您的图表中的任何地方手动添加过滤器,也许期望您在哪里执行颜色空间转换器和Connect 引脚。颜色空间转换器并不明显,我宁愿将它们排除在外(它们值得一个不同的问题,因为在您的场景中不清楚它们的用途)。
    • 感谢您的回复罗曼。我现在可以看到不需要颜色空间转换器(我相信他们是从 RGB 转换为 YUV)。我已经删除了它们并在我的编码器图中的任何地方都使用了ConnectDirect()。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2023-02-16
    • 2017-03-03
    • 2020-03-30
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多