c++ - 如何在FireMonkey(FMX、FM3)中显示流畅的视频?

标签 c++ multithreading video firemonkey firemonkey-fm3

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

最佳答案

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

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

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

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

关于c++ - 如何在FireMonkey(FMX、FM3)中显示流畅的视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784315/

相关文章:

c++ - CMake 和 GTest 链接测试

c++ - Qt Creator 如何采集外部串口设备的实时数据?

c++ - 如何从另一个运行整个 CPP 文件?

php - 如何使用ffmpeg从任何地方传递视频

c++ - GDI::DeleteObject 是如何工作的

ruby - 启动和停止 Ruby 线程

Java线程被杀死

c# - 如何在执行功能期间制作应用程序加载屏幕

audio - 如何使用 mkvmerge 和外部时间码强制 A/V 同步?

video - 如何在 MP4 上叠加透明视频(mp4)?