1

使用的技术:

  • .NET 3.5
  • C#/WPF
  • 视觉工作室 2010 SP1
  • 直显网
  • DES(DirectShow 编辑服务)
  • P/调用

=======

申请总结:

我在 C#/WPF 中开发了一个简单的视频编辑器,它带有一个自定义 WPF 时间线控件,该控件通过 DirectShow.NET 连接到 DES,并且很大程度上基于 DirectShow.NET 中包含的 DESCombine.cs 示例。该应用程序的用户可以将视频和图像添加到时间线,并选择一首歌曲在后台播放。

最终目标是将时间线内容(ds 图形内容)呈现为基于 wmv 的文件。这基本上是通过选择一个 prx 配置文件并启动正确构建的图表来完成的。

所有输入视频在添加到时间线/directshow 图表之前都转换为 wmv8,因此不需要特殊的第三方 directshow 过滤器来连接引脚。

=======

问题和疑问:

有时但并非总是,Directshow 在最终视频文件的渲染过程中会卡住。也不例外,cpu 使用率只是下降到 0 并且没有任何反应。由于我通过 DirectShow.NET 访问 DirectShow 并且我不知道幕后发生了什么,因此很难调试。虽然我确实启用了非托管调试,但没有抛出异常,我不知道出了什么问题。

我可以说随着图表越来越多,这个问题会更频繁地发生。例如,渲染包含 50 个视频和图像的时间线比仅渲染几个图像和视频更有可能导致此问题。

我该怎么做才能准确找出问题所在,以及为什么在没有抛出异常或错误指示时会发生这种情况?

=======

我试过的:

为图形设置一个日志文件(使用 IGraphBuilder::SetLogFile)。

此日志确实表明某些引脚无法连接,但在渲染完成和失败时,日志看起来完全相同。

IntPtr hfile = CreateFile("c:\\dslog2.txt", GENERIC_WRITE, 0, IntPtr.Zero,     OPEN_EXISTING, 0, IntPtr.Zero);
m_pGraph.SetLogFile(hfile);

当我检测到它已被占用时,使用 IMediaControl 暂停并运行图表。这没有任何作用。

m_pControl.Pause();
Thread.Sleep(2000);
m_pControl.Run();

=======

在此先感谢您,非常感谢您的帮助。

4

1 回答 1

0

如果您有一个包含许多来源的时间线,则很有可能会从 DES 中收到“Out-Of-Memory”错误。或者 DES 只是破坏,因为 DES 是 DirectShow 的一个非常有问题的部分。听起来您没有使用动态模式?动态模式会自动重新连接 DES-Filter 并移除未使用的源,因此内存消耗不会那么大。

于 2012-11-15T20:59:18.060 回答