如何在FireMonkey(FMX,FM3)中显示流畅的视频?

时间:2014-02-14 16:19:35

标签: c++ multithreading video firemonkey firemonkey-fm3

有没有人想出如何在FireMonkey应用程序,HD或3D中显示流畅的视频(即一系列位图)?在VCL中,您可以从一个线程写入画布,这将完美地工作,但这在FMX中不起作用。更糟糕的是,显然唯一可靠的方法是使用TImage,这似乎是从主线程更新(打开菜单和视频暂时冻结)。我可以找到的所有EMB示例都可以从主线程写入TImage,或者使用Synchronize()。这些限制使得FMX无法用于体面的视频显示,因此我正在寻找黑客或可能绕过FMX。我使用XE5 / C ++但欢迎任何建议。目标操作系统是Windows 7+和OS X.谢谢!

2 个答案:

答案 0 :(得分:0)

如何在表单上放置TPaintbox来保存视频。在OnPaint方法中,您只需将下一帧绘制到paintbox画布。现在在表单上放置一个TTimer,将间隔设置为所需的帧速率。在计时器的OnTimer事件中,只需编写paintbox1.repaint

无论程序正在做什么,这都应该为您提供常规帧。

为了更加安全,您可以在OnTimer事件中增加帧编号。现在在paintbox paint方法中,您知道要绘制哪个框架。这意味着如果其他东西调用了paint方法和定时器,你就不会跳帧 - 你最终会重新绘制相同的帧,以便额外调用OnPaint。

我使用它来进行蚂蚁选择,虽然我更进一步使用覆盖的画布,所以我可以独立绘制选择和底层的绘图框画布,以消除选择更改时重绘主画布的需要。这需要调用API,但我猜你不需要它,除非你做的是透明色的视频。

答案 1 :(得分:0)

进一步的研究,包括与Itinerant developer的一些讨论,遗憾的是,由于并发限制,FM的设计使得所有GPU访问都通过主线程,因此绘画将始终受到限制。因此,我认为FM不适合我的需求,我正在重新评估我的选择。