详解如何用TVideoGrabber捕捉视频帧
操作方法
- 01
在TVideoGrabber中,当启用了视频捕捉器时,可以在预览、录制以及回放中捕捉视频帧。这个视频捕捉器可以插入到预览流、捕捉流或是两者之间。同时这个帧可以捕捉到内存位图、BMP文件、JPEG文件、剪贴板(CF_BITMAP)。 一、直接复制来自OnFrameBitmap事件的当前视频帧的BITMAP HANDLE。 对于每个经过视图的视频帧,会发生OnFrameBitmap事件,并允许直接捕捉位视图字节。 这个方法需要更少的CPU,然而由于这个OnFrameBitmap事件是直接从一个线程调用,这个位图handle以及位图字节只是在事件发生的时候有效,所以你必须复制它们到另一个缓冲区。 这种方法的问题就在于它可能会减缓成像并造成一个不平稳的预览,由于你添加到事件中的处理时间是包含在帧间隔中的,所以如果处理2帧的时间比帧率更长,这个帧就会被丢弃。 所以,建议通过调用StartPreview进行视图预览时,如果在这种情况下,如果在录制(这个可能会产生一个不平稳的录制)或是在回放期间(也可能会不平稳),丢弃帧也不是那么重要。 二、直接捕捉当前帧(或是之前帧) 调用GetLastFrameAsHBitmap (所有版本)或 GetLastFrameAsTBitmap (仅Delphi / C + + 生成器版本),根据你选择的尺寸以及是否覆盖来捕捉当前帧(或是之前帧)帧。这种方法并不会减慢成像,同时也不会出现丢帧的现象。 三、当前帧捕捉(或是在连拍模式下自动捕捉接下来的帧) 通过使用CaptureFrameTo(或启用突发模式)以及OnFrameCaptureCompleted的事件。这种方法也不会减慢成像,同时也不会出现丢帧的现象。 有或没有覆盖: 如果应用程序执行的图形或文字重叠,默认情况下,帧捕获就会覆盖。 启用FrameCaptureWithoutOverlay的属性,捕捉帧时就不会有覆盖。 1、异步与同步帧捕获 A、异步帧捕获 调用CaptureFrameTo一帧接一帧的捕捉,这个函数就会发送“捕捉秩序”并立即退出。然后这个捕捉帧就会通过OnFrameCaptureCompleted事件返回。 突发模式自动捕捉帧 突发模式允许自动捕获帧,模式可以通过启用BurstMode属性激活。 根据BurstType属性,可捕捉帧到TBitmap、 BMP文件或是JPEG 文件。 如果BurstCount = 0,可以无限制的捕捉帧,否则当帧的一个BurstCount数被捕捉到,帧捕捉就会停止。 如果BurstInterval > 0,帧的一个BurstInterval数就会在每个帧捕捉之间跳过。 通过启用BurstMode,就会激活突发模式。 突发模式无效的方法: ——禁用BurstMode ——如果BurstCount > 0,帧的一个BurstCount数就被捕捉到了。 当捕捉视频帧到BMP和JPEG文件: ——当调用CaptureFrameTo或CaptureFrameSyncTo时,如果没有文件名被调用,这个文件名就会自动生成(1) ——在突发模式中,文件名总是自动的生成(1) (1)根据StoragePath,AutoFileName和AutoFilePrefix。 当执行帧叠加时,捕捉未修改的帧 通过使用帧叠加功能,当通过视频帧绘制时,在默认的情况下,在帧已经重叠之后这个帧捕捉就会发生。 在叠加之前,启用FrameCaptureWithoutOverlay的属性来捕捉为修改的帧。 异步帧捕获的例子 在打开剪辑之前,需要在这里设置UseClock = false,达到最大的播放速度。 VideoGrabber.BurstMode =true VideoGrabber.BurstCount = 5 VideoGrabber.BurstInterval = 10 VideoGrabber.BurstType = fc_BmpFile VideoGrabber.PlayerFileName ="... the file name of my video clip..." VideoGrabber.UseClock =false VideoGrabber.OpenPlayer 捕获的帧的大小 默认值 ——默认情况下,捕获的帧的大小是当前视频帧的尺寸,也就是VideoWidth 和 VideoHeight 属性返回的尺寸。 尺寸缩放 ——通过指定一个FrameCaptureZoomSize的百分比实现捕捉帧的大小的缩放。默认的值是100 (100%)。 自定义大小 ——通过对FrameCaptureWidth和 FrameCaptureHeight指定值,可以拉伸帧的尺寸搭配到指定的宽度、 高度。对于这两个属性默认的值是-1,也就是禁用。 B、同步帧捕获 该函数在返回之前将会等待的帧捕捉完成。 调用CaptureFrameSyncTo,这个函数将会等待帧捕捉,并通过OnFrameCaptureCompleted返回帧,成功后通过这个函数返回true,酷似上述的异步CaptureFrameTo。 如何捕获矩形视频帧 在调用CaptureFrameTo或CaptureFrameSyncTo之前调用SetFrameCaptureBounds(左,上,右,下) ,来实现一个矩形捕捉。 如何伸展捕获视频帧 指定FrameCaptureWidth或FrameCaptureHeight的值,随意的调整视频帧。 如何缩放捕获的视频帧 指定FrameCaptureZoomSize的缩放比例,调整捕获帧的尺寸。 上下以及左右帧捕捉 调用SetFrameCaptureBounds以及制定底部替代顶部,或是左侧替代右侧就可以实现这种方式的捕捉。