有一个Stackoverflow线程指出Firemonkey必须通过主线程显示视频。我正在尝试使用DirectX相机捕捉一系列图像(目前在Win8.1中-其他操作系统可以等待)。所以我在Embarcadero示例代码中使用SampleBufferReady和SampleBufferSync方法(只是在表单上有一个图像),但是有足够的变化,我从来没有看到任何东西。我需要在TImageViewer中显示;将SampleBufferSync中的tbitmap指向该tbitmap很容易。但什么也看不出来。从过程的角度来看,我想要的伪代码是
setup whatever
camera.startcapture
repeat
repeat until framecaptured {what SampleBufferReady should do -- only fire when ready}
Imageviewer.repaint {inside SampleBufferReady?}
inc(mycounter) {inside SampleBufferReady?}
until (mycounter>mylimit) or (user interrupts video input)
camera
可以添加计时器来减慢速度。我不明白的是
- 我必须定义我自己的TEvent来发现相机捕获的图像,或者这甚至已经存在?我本以为SampleBufferReady会响应图像的到来,我可以处理该事件中的任何内容。
- 显示图像在其他东西而不是TImage,我需要关闭相机,画位图,然后打开相机吗?如果是这样,我是否需要让SampleBufferReady包含一个命令来关闭相机?天哪,这听起来很笨拙!
建议吗?
这里是一个完整的代码源,我测试的c++版本是相同的PASCAL在函数调用和机制方面,只有语法不同:从这里下载PASCAL版本。
的代码工作良好的android和桌面(我测试的c++版本)。所以下载,测试和确认我的PASCAL代码。