c# - 在线程中创建 DirectShow 图形

标签 c# c++ video directshow directshow.net

我有一个图表,需要很长时间才能创建和准备(5-10 秒)。为了避免卡住,我决定在线程中创建图表,但发生了一些奇怪的事情。当我运行我的图表后,同时进行调试;当我在线程中时,我可以在窗口中看到视频。但是当线程结束时,视频就会消失。我在全局范围内定义了有关我的图表的所有内容。在单独的线程中创建图表有什么问题?

谢谢

最佳答案

可以在副线程中创建图形,这是一个可行的场景。然而,仅这条信息不足以可靠地解释症状。当你有视频时,你应该有视频渲染器过滤器,特别是。在窗口模式下运行。如果它在此后台线程上创建一个窗口,则该窗口期望该线程处于事件状态,甚至期望您在此线程上传递窗口消息。这意味着,您无法在运行图表后立即退出。

由于窗口,包括过滤器可能根据自己的需要创建的可能内部窗口,因此在 STA 线程上创建过滤器图更安全。这可以是您在其上创建图形的侧 STA 线程,您可以使其保持事件状态,直到您销毁该图形,同时在其上运行消息循环。请注意,有一个适合此场景的 Fitler Graph Manager 版本:

CLSID_FilterGraphNoThread creates the Filter Graph Manager on the application's thread. If you use this CLSID, the thread that calls CoCreateInstance must have a message loop that dispatches messages; otherwise, deadlocks can occur. Also, before the application thread exits, it must release the Filter Graph Manager and all graph objects (such as filters, pins, reference clocks, and so forth).

关于c# - 在线程中创建 DirectShow 图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318769/

相关文章:

c# - 带有 Web 套接字的 SignalR

c# - 如何在 WPF 中单击菜单项时在父窗口下打开子窗口?

Java 客户端通过 TCP 连接与 C++ 服务器通信

c++ - 如何在 qt 4.6.3 中取消触摸事件?

jquery - vimeo 视频加载后自动播放()

C# lambda 表达式问题 - 如何使用以下 SQL 中的 Lambda 语句连接 2 个表?

c# - 在运行时将对象转换为字符串数组

c++ - 这个结构是什么意思 : bool operator == (const a& other) const;?

ios - 如何使用 resizeAspectFill 在 watchOS 上播放视频?

html - 如何正确显示和居中对齐我的响应式 YouTube 视频?