如何将视频数据输入 DirectShow 过滤器以 compress/encode 并保存到文件?

How to feed video data into a DirectShow filter to compress/encode and save to file?

首先,这是我要完成的工作: 我们想为我们的商业应用程序添加生成视频文件以可视化数据的功能。它应该以合理压缩的格式保存。编码 library/codecs 获得许可很重要,这样我们就可以不受限制地使用和销售我们的软件。客户可以轻松播放媒体格式也很重要,即可以通过 Windows Media Player 播放而无需安装编解码器包。

我正在尝试在 C++ 中使用 DirectShow,方法是创建一个带有生成视频的输出引脚的源过滤器。我密切关注名为 Bouncing Ball 和 Push Source 的 DirectShow 示例。在 GraphEdit 中,我可以成功连接到视频渲染器并观看视频播放。我还设法连接到 AVI Mux,然后连接到文件编写器以编写未压缩的 AVI 文件。唯一的问题是巨大的文件大小。但是,我无法以压缩格式保存视频。 Ball 和 Push Source 示例也会出现此问题。

我可以将输出引脚连接到 WM ASF Writer,但是当我点击播放时我得到 "This graph can't play. Unspecified error (Return code: 0x80004005)." 我什至不知道如何连接到 WMVideo9 编码器 DMO ("These filters cannot agree on a connection")。我可以成功保存到 mjpeg,但压缩不是很大。

如果我在 GraphEdit 中做错了什么或者我的源过滤器代码是否需要修改,请告诉我。或者,如果有另一个(非 DirectShow)选项适合我,我愿意接受建议。谢谢

您没有提供详细信息来帮助您修改过滤器,但是 Ball 示例生成可以写入文件的输出。

您选择的 WM ASF Writer 过滤器没问题 - 它是常用过滤器,或多或少易于处理。但是有一个警告:您需要先在过滤器上 select 仅视频配置文件,然后连接视频输入。 WM ASF Writer 不会 运行 使用未连接的输入引脚,并且在默认状态下它还有一个音频输入。当然这也可以通过编程方式完成。

图表可以这么简单,也可以运行生成一个可以播放的文件