原創(chuàng)|使用教程|編輯:郝浩|2013-09-06 14:32:15.000|閱讀 904 次
概述:在TVideoGrabber中,當(dāng)啟用了視頻捕捉器時(shí),可以在預(yù)覽、錄制以及回放中捕捉視頻幀。這個(gè)視頻捕捉器可以插入到預(yù)覽流、捕捉流或是兩者之間。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
在TVideoGrabber中,當(dāng)啟用了視頻捕捉器時(shí),可以在預(yù)覽、錄制以及回放中捕捉視頻幀。這個(gè)視頻捕捉器可以插入到預(yù)覽流、捕捉流或是兩者之間。同時(shí)這個(gè)幀可以捕捉到內(nèi)存位圖、BMP文件、JPEG文件、剪貼板(CF_BITMAP)。
一、直接復(fù)制來(lái)自OnFrameBitmap事件的當(dāng)前視頻幀的BITMAP HANDLE。
對(duì)于每個(gè)經(jīng)過視圖的視頻幀,會(huì)發(fā)生OnFrameBitmap事件,并允許直接捕捉位視圖字節(jié)。
這個(gè)方法需要更少的CPU,然而由于這個(gè)OnFrameBitmap事件是直接從一個(gè)線程調(diào)用,這個(gè)位圖handle以及位圖字節(jié)只是在事件發(fā)生的時(shí)候有效,所以你必須復(fù)制它們到另一個(gè)緩沖區(qū)。
這種方法的問題就在于它可能會(huì)減緩成像并造成一個(gè)不平穩(wěn)的預(yù)覽,由于你添加到事件中的處理時(shí)間是包含在幀間隔中的,所以如果處理2幀的時(shí)間比幀率更長(zhǎng),這個(gè)幀就會(huì)被丟棄。
所以,建議通過調(diào)用StartPreview進(jìn)行視圖預(yù)覽時(shí),如果在這種情況下,如果在錄制(這個(gè)可能會(huì)產(chǎn)生一個(gè)不平穩(wěn)的錄制)或是在回放期間(也可能會(huì)不平穩(wěn)),丟棄幀也不是那么重要。
二、直接捕捉當(dāng)前幀(或是之前幀)
調(diào)用GetLastFrameAsHBitmap (所有版本)或 GetLastFrameAsTBitmap (僅Delphi / C + + 生成器版本),根據(jù)你選擇的尺寸以及是否覆蓋來(lái)捕捉當(dāng)前幀(或是之前幀)幀。這種方法并不會(huì)減慢成像,同時(shí)也不會(huì)出現(xiàn)丟幀的現(xiàn)象。
三、當(dāng)前幀捕捉(或是在連拍模式下自動(dòng)捕捉接下來(lái)的幀)
通過使用CaptureFrameTo(或啟用突發(fā)模式)以及OnFrameCaptureCompleted的事件。這種方法也不會(huì)減慢成像,同時(shí)也不會(huì)出現(xiàn)丟幀的現(xiàn)象。
有或沒有覆蓋:
如果應(yīng)用程序執(zhí)行的圖形或文字重疊,默認(rèn)情況下,幀捕獲就會(huì)覆蓋。
啟用FrameCaptureWithoutOverlay的屬性,捕捉幀時(shí)就不會(huì)有覆蓋。
1、異步與同步幀捕獲
A、異步幀捕獲
調(diào)用CaptureFrameTo一幀接一幀的捕捉,這個(gè)函數(shù)就會(huì)發(fā)送“捕捉秩序”并立即退出。然后這個(gè)捕捉幀就會(huì)通過OnFrameCaptureCompleted事件返回。
突發(fā)模式自動(dòng)捕捉幀
突發(fā)模式允許自動(dòng)捕獲幀,模式可以通過啟用BurstMode屬性激活。
根據(jù)BurstType屬性,可捕捉幀到TBitmap、 BMP文件或是JPEG 文件。
如果BurstCount = 0,可以無(wú)限制的捕捉幀,否則當(dāng)幀的一個(gè)BurstCount數(shù)被捕捉到,幀捕捉就會(huì)停止。
如果BurstInterval > 0,幀的一個(gè)BurstInterval數(shù)就會(huì)在每個(gè)幀捕捉之間跳過。
通過啟用BurstMode,就會(huì)激活突發(fā)模式。
突發(fā)模式無(wú)效的方法:
——禁用BurstMode
——如果BurstCount > 0,幀的一個(gè)BurstCount數(shù)就被捕捉到了。
當(dāng)捕捉視頻幀到BMP和JPEG文件:
——當(dāng)調(diào)用CaptureFrameTo或CaptureFrameSyncTo時(shí),如果沒有文件名被調(diào)用,這個(gè)文件名就會(huì)自動(dòng)生成(1)
——在突發(fā)模式中,文件名總是自動(dòng)的生成(1)
(1)根據(jù)StoragePath,AutoFileName和AutoFilePrefix。
當(dāng)執(zhí)行幀疊加時(shí),捕捉未修改的幀
通過使用幀疊加功能,當(dāng)通過視頻幀繪制時(shí),在默認(rèn)的情況下,在幀已經(jīng)重疊之后這個(gè)幀捕捉就會(huì)發(fā)生。
在疊加之前,啟用FrameCaptureWithoutOverlay的屬性來(lái)捕捉為修改的幀。
異步幀捕獲的例子
在打開剪輯之前,需要在這里設(shè)置UseClock = false,達(dá)到最大的播放速度。
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
捕獲的幀的大小
默認(rèn)值
——默認(rèn)情況下,捕獲的幀的大小是當(dāng)前視頻幀的尺寸,也就是VideoWidth 和 VideoHeight 屬性返回的尺寸。
尺寸縮放
——通過指定一個(gè)FrameCaptureZoomSize的百分比實(shí)現(xiàn)捕捉幀的大小的縮放。默認(rèn)的值是100 (100%)。
自定義大小
——通過對(duì)FrameCaptureWidth和 FrameCaptureHeight指定值,可以拉伸幀的尺寸搭配到指定的寬度、 高度。對(duì)于這兩個(gè)屬性默認(rèn)的值是-1,也就是禁用。
B、同步幀捕獲
該函數(shù)在返回之前將會(huì)等待的幀捕捉完成。
調(diào)用CaptureFrameSyncTo,這個(gè)函數(shù)將會(huì)等待幀捕捉,并通過OnFrameCaptureCompleted返回幀,成功后通過這個(gè)函數(shù)返回true,酷似上述的異步CaptureFrameTo。
如何捕獲矩形視頻幀
在調(diào)用CaptureFrameTo或CaptureFrameSyncTo之前調(diào)用SetFrameCaptureBounds(左,上,右,下) ,來(lái)實(shí)現(xiàn)一個(gè)矩形捕捉。
如何伸展捕獲視頻幀
指定FrameCaptureWidth或FrameCaptureHeight的值,隨意的調(diào)整視頻幀。
如何縮放捕獲的視頻幀
指定FrameCaptureZoomSize的縮放比例,調(diào)整捕獲幀的尺寸。
上下以及左右?guī)蹲?/strong>
調(diào)用SetFrameCaptureBounds以及制定底部替代頂部,或是左側(cè)替代右側(cè)就可以實(shí)現(xiàn)這種方式的捕捉。
>>>TVideoGrabber 下載
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件