【问题标题】:How to display smooth video in FireMonkey (FMX, FM3)?如何在 FireMonkey (FMX, FM3) 中显示流畅的视频?
【发布时间】:2014-03-14 02:33:34
【问题描述】:

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

【问题讨论】:

  • 我知道这实际上是可能的,因为 TMediaPlayer 没有出现同样的问题..

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    无论程序执行什么其他操作,这都会为您提供常规帧。

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

    尽管我更进一步并使用覆盖画布,但我将它用于行进的蚂蚁选择,因此我可以独立绘制选择和底层画布画布,从而无需在选择更改时重新绘制主画布。这需要调用 API,但我猜你不需要它,除非你正在制作具有透明颜色的视频。

    【讨论】:

    • 谢谢,但这并不能解决问题。无论你使用 TImage 还是 Canvas 的 OnPaint,你仍然受到主线程的限制。
    • 在 windows 上,您可以获取设备上下文,然后使用 windows API 命令对其进行绘制,从而绕过 Firemonkey 绘制。例如 getdc(FmxHandleToHWND(form1.Handle)) 将为您获取 form1 的设备上下文。您将需要 fmx.platform.win 在使用语句中。不幸的是,DC 的 OSX 等效项仅在绘制方法中有效,所以我不知道有任何方法可以绕过 OSX 上的 firemonkey。
    • 使用 FM 的全部原因是为了加速 GPU 绘画,如果可能的话,绕过它会否定使用它的理由。
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 2013-08-08
    • 2012-01-14
    • 2014-09-26
    • 2018-01-18
    • 1970-01-01
    • 2021-04-11
    • 2015-09-28
    相关资源
    最近更新 更多