




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、談?wù)勈褂胿fw在windows下編程控制攝像頭這段時間閑來無事,看了看msdn的文檔,自己翻譯了一下。一是為了學(xué)習(xí),二是對空閑 時間的打發(fā)。所以也希望大家在拍磚的同時,尊重我的勞動,如要轉(zhuǎn)貼請注明轉(zhuǎn)至 孫濤 2005-8-6microsoft® video for windows® (vfw)提供的xi數(shù)以讓應(yīng)用程序去處理視頻數(shù)據(jù)。vfw 在16位windows的時候就被引入了。它的許多重要功能已經(jīng)被directx取代了。要獲得更 多的信息,你可以參考directx的文檔。下面講介紹vfw的視頻捕獲:3.視頻捕獲你可以使用windows的avicap類輕松地完成視頻捕獲。a
2、vicap提供給應(yīng)用程序一個簡單 的、基于消息的接口去訪問視頻設(shè)備和錄音設(shè)備,并且可以控制處理視頻流捕獲。3.1關(guān)于視頻捕獲avicap支持實是視頻流捕獲和實時單幀圖像捕獲。另外,avicap提供了對視頻源的控制(mci 媒體控制接口設(shè)備),因此使用者可以通過應(yīng)用程序控制一個視頻源開始和結(jié)束的位置,并 且可以加大對幀捕獲的控制。你使用avicap類可以完成如下的任務(wù):捕獲聲音和視頻,并將他們寫入到一個avi文件中。動態(tài)連接和斷開視頻和咅頻的輸入設(shè)備。使用覆蓋或預(yù)覽的方法去顯示當(dāng)前的視頻信號。指定一個文件用于捕獲,并且把這個捕獲文件的內(nèi)容拷貝給另一個文件。設(shè)定捕獲圖像速度(好多幀)。顯示對話框用
3、于控制視頻源和格式。創(chuàng)建、保存、加載調(diào)色板。捕獲并把圖像作為一個dib位圖保存。3丄1視頻捕獲:最簡單的方法視頻捕獲將數(shù)字化一個視頻流和音頻數(shù)據(jù),并且將他們保存在硬盤和其他存儲設(shè)備上。這里將描述如何在應(yīng)用程序屮簡單地應(yīng)用視頻捕獲,它通過三句代碼實現(xiàn)。它還介紹了如何 通過發(fā)送消息給視頻捕獲窗口來結(jié)束或中斷一個視頻會話。avicap捕獲窗口可以把捕獲的音視頻信息寫入一個avi文件中。你的應(yīng)用程序可以自由地 處理這個avi文件、管理緩存區(qū)的咅視頻數(shù)據(jù)、還可以在底層訪問咅視頻設(shè)備的驅(qū)動器。avicap為應(yīng)用程序提供了一個靈活的接口。你可以使用下而的代碼,在你的應(yīng)用程序中加 入視頻捕獲:hwndc =
4、capcreatecapturewindow (nmy own capture window",ws_child | ws_visible ,0,0,160,120, hwndparent, nid);sendmessage (hwndc, wm_cap_driver_conneci; 0 /* wlndex */,0l);sendmessage (hwndc, wm_cap_sequence, 0, 0l);宏接口同樣有用,你可以選擇是使用宏接口還是sendmessage函數(shù)來實現(xiàn)上面的功能,不 過宏接口可以讓你的代碼更加容易理解。下面就使用了宏接口。hwndc = capcrea
5、tecapturewindow (n my own capture window ",ws_child | ws_visible ,0,0,160,120, hwndparent, nid);capdriverconnect (hwndc, 0);/ 宏接口/宏接口capcapturesequenee ( hwndc);你的應(yīng)用程序創(chuàng)建avicap捕獲窗口,并和視頻設(shè)備建立連接后。你創(chuàng)建的這個捕獲窗口就 準(zhǔn)備捕獲數(shù)據(jù)了。這時,你"j以通過發(fā)送wm_cap_sequence消息(或capcapturesequence 宏)開始對數(shù)據(jù)進(jìn)行捕獲。wm_cap_sequence將使
6、用默認(rèn)設(shè)置,開始對視頻和音頻進(jìn)行捕獲,并把數(shù)據(jù)放在一個capture.avi的文件中,捕獲動作將一直持續(xù),除非有下面的事件發(fā)生:i用戶按了 esc鍵或者鼠標(biāo)的按鈕。i你的應(yīng)用程序停止或者退出了捕獲操作。i磁盤寫滿了。在應(yīng)用程序中,你可以通過發(fā)送wm_cap_stop命令(或capcapturestop)給捕獲窗口,讓它 停止向文件寫數(shù)據(jù)。你還可以通過發(fā)送wm_cap_abort命令(或capcaptureabort)給捕獲窗口,讓它屮斷捕獲操作。3.1.2捕獲基本設(shè)置通過對定義在captureparms結(jié)構(gòu)中的捕獲參數(shù)進(jìn)行修改,你可以完成:i改變捕獲的幀頻律(幀/秒);i指定用鍵盤或鼠標(biāo)去結(jié)束
7、一個捕獲會話;i為一個捕獲會話指定時間周期;捕獲的幀頻率捕獲的幀頻率表示在一個捕獲會話中,每秒要捕獲多少幀。你通過 wm_cap_get_sequence_setup 消息(capcapturegetsetup 宏)可以得到當(dāng)前捕獲的幀頻 率。當(dāng)前的幀頻率被保存在captureparms結(jié)構(gòu)的dwrequestmicrosecperframe成員中。 你可以對該值進(jìn)行修改,從而去改變幀頻率。該值為捕獲一幀要用的時間(單位是微秒 1/1000000 秒),修改后,你可以發(fā)送 wm_cap_set_sequence_setup 消息(或 capcapturesetsetup宏)給你 的捕獲 窗體,
8、來刷新captureparms結(jié) 構(gòu)。 dwrequestmicrosecpe汗rame 默認(rèn)值是 66667 微秒,表示每秒 15 幀。(1000000/15=66667)退出數(shù)據(jù)捕獲你可以讓用戶按這兒種方法退出一個捕獲會話,按鍵盤上的一個鍵或兒個組合鍵、或者按鼠 標(biāo)的左鍵或者是右鍵。如果用戶退出一個實時的捕獲會話,那么捕獲文件中的內(nèi)容將被系統(tǒng) 丟棄掉。如果用戶退出一個步幀(step-frame)捕獲的會話,捕獲文件將保存到退出吋刻前的所 有數(shù)據(jù)。你可以通過發(fā) wm_cap_get_sequence_setup 消息(或 capcapturegetsetup 宏)給捕獲 窗口,來獲得捕獲退出
9、的設(shè)置信息。當(dāng)前的退出按鈕設(shè)置保存在captureparms結(jié)構(gòu)的 vkeyabort成員中,為前的退出鼠標(biāo)設(shè)置保存在fabortleftmouse和fabortrightmouse成員 屮。你可以改變這兒個成員,實現(xiàn)對當(dāng)前值的修改。當(dāng)你修改完成后,你可以發(fā)送 wm_cap_set_sequence_setup 消息(或 capcapturesetsetup 宏)給你的捕獲窗體,來刷新 captureparms 結(jié)構(gòu)。vkeyabort默認(rèn)值是vk_escape。在重新指定其他按鍵前,你必須調(diào)用registerhotkey函數(shù)。 fabortleftmouse 和 fabortrightmou
10、se 是 true。時間限定 通過使用captureparms結(jié)構(gòu)的flimitenabled和wtimelimit成員,你可以去限定一個捕獲 操作的吋i'可周期。flimitenabled表示是否要對捕獲操作限定吋間,wtimelimit用于指定限 定吋間的最大值。你發(fā) wm_cap_get_sequence_setup 消息(capcapturegetsetup 宏)給捕獲窗口,就可以 得到flimitenabled和wtimelimit的值。flimitenabled為true表示要指定時間周期。 wtimelimit單位為秒。修改完成后,你可以發(fā)送wm_cap_set_sequ
11、ence_setup消息(或 capcapturesetsetup宏)給你的捕獲窗體,來刷新captureparms結(jié)構(gòu)。flimitenabled 默認(rèn)值為 false.3.1.3捕獲窗口捕獲窗體類似于一個標(biāo)準(zhǔn)控件(不如按鈕、列表框),它一般使用ws_child和ws_visible 窗口類型。.一創(chuàng)建一個avicap捕獲窗口使用capcreatecapturewindow函數(shù)可以創(chuàng)建一個avicap的捕獲窗口。這個函數(shù)返回 一個窗口句柄,這個句柄就是捕獲窗口的句柄,后面其他操作就是通過發(fā)送消息給該句柄來 實現(xiàn)。你可以在一個程序中創(chuàng)建多個捕獲窗口,并且每個窗口連接到不同的捕獲設(shè)備上。建立捕獲
12、窗口到捕獲設(shè)備的連接你可以動態(tài)地連接或斷開捕獲窗口與設(shè)備間的鏈接。通過使用wm_cap_drivr_connect消 息(或capdriverconnect宏),可以實現(xiàn)捕獲窗體與設(shè)備驅(qū)動間的連接。當(dāng)捕獲窗體和捕獲 設(shè)備驅(qū)動連接后,你就可以發(fā)送針對設(shè)備的消息給該窗體了。如果你的系統(tǒng)安裝了多個捕獲設(shè)備,你可以通過在發(fā)送wm_cap_driver_connect消息時, 設(shè)置wprarm參數(shù)(integer)o來指定捕獲窗口與那個具體的視頻捕獲設(shè)備相連接。wprarm參數(shù)是一個整數(shù),它表示一個系統(tǒng)已經(jīng)安裝的視頻捕獲設(shè)備列表的索引(注冊表中 或這system.ini drivers中的信息)。該列表
13、的索引從0開始。通過capgetdriverdescription函數(shù)可以獲得安裝的捕獲驅(qū)動程序的名稱和版本。你的 應(yīng)用程序可以使用這個函數(shù)列舉除安裝的所有捕獲設(shè)備,讓用戶可以選擇其中一個去與捕獲 窗口相聯(lián)。通過發(fā)送wm_cap_driver_get_name消息(capdrivergetname宏),可以獲得與指定窗體 連接的捕獲設(shè)備的名稱。通過發(fā)送wm_cap_driver_get_version消息(capdrivergetversion 宏),可以獲得與指定窗體連接的捕獲設(shè)備的版本。通過發(fā)送 wm_cap_driver_disconnect 消息(capdrivergetdisconn
14、ect 宏),對以斷開連接。 當(dāng)捕獲窗體銷毀后,任何連接的視頻捕獲設(shè)備都將自動斷開。父子窗體交付一些系統(tǒng)級的消息,比如 wm_palettechanged、wm_querynewpalette,只被發(fā) 送到頂層(top-level)和overlapped窗口。如果一個扌甫獲窗體是一個資窗體,那它的父窗口應(yīng) 該來轉(zhuǎn)寄這些消息。同樣地,假如父窗口尺寸改變了,它可能需要發(fā)送一個通知消息給捕獲窗口。相反, 如果捕獲視頻尺寸變化了,捕獲窗口可能需要發(fā)一個通知消息給父窗口。最簡單的管理方法 是讓捕獲窗口的尺寸等于捕獲視頻流的尺寸,隨時把改變的尺寸告訴給父窗口。捕獲窗體狀態(tài)通過發(fā)送wm_cap_get_st
15、atus消息(capgetstatus宏),可以獲得當(dāng)前捕獲窗口的狀態(tài)。 這個消息得到一個capstatus結(jié)構(gòu)體的拷貝,狀態(tài)信息就在這個結(jié)構(gòu)體的成員中。capstatus結(jié)構(gòu)體包含了圖形尺寸大小、滾動位置(scroll position)、是否覆蓋(overlay)或者 預(yù)覽(preview)等信息。因為在capstatus屮的信息是動態(tài)的,你的應(yīng)用程序應(yīng)該隨時去 刷新這個結(jié)構(gòu)體中的內(nèi)容。改變捕獲窗口的尺寸對實際的視頻流的尺寸沒有影響。3.1.4捕獲和音頻驅(qū)動器視頻捕獲可以做這兒個方而的工作:訪問視頻源、顯示選項、格式和壓縮選項。音頻捕獲 包括指定音頻格式和選擇壓縮方式。捕獲驅(qū)動性能通過發(fā)送
16、wm_cap_driver_get_caps消息(capdrivergetcaps宏),可以獲得當(dāng)前連接的捕 獲設(shè)備的性能。發(fā)送該消息后,會返回一個capdrivercaps結(jié)構(gòu)的對象。設(shè)備的性能信息, 就在這個對象中。視頻對話框(video dialog boxes)每個捕獲設(shè)備的驅(qū)動程序都可以為控制視頻信號和捕獲處理和視頻壓縮提供4個對話框。這 些對話框中的內(nèi)容都是視頻捕獲驅(qū)動程序定義的。視頻源對話框(video source dialog box)用于選擇視頻輸入通道和視頻圖像的動態(tài)參數(shù)。它可 以列舉出當(dāng)前連接視頻設(shè)備的信號類型(svhs和復(fù)合類型),并且可以通過該對話框去修改 圖像的色
17、調(diào)、亮度、飽和度。你可以通過使用wm_cap_dlg_videosource消息(或 capdigvideosource宏)來顯示和刷新這個窗口。視頻格式對話框(video format dialog box)用于選擇數(shù)字視頻的框架人小和視頻圖像的色深, 以及捕獲視頻圖像的壓縮格式。你可以通過使用wm_cap_dlg_videoformat消息(或 capdigvideoformat宏)來顯示和刷新這個窗口。視頻顯示對話框(video display dialog box)用于控制視頻外觀。在該對話框上進(jìn)行了修改只是 對視頻顯示起作用,對于實際的視頻數(shù)據(jù)是不會造成改變的。比如,可以改變顯示的顏
18、色, 飽和度等等,你可以通過使用wm_cap_dlg_videodisplay消息(或capdigvideodisplay 宏)來顯示和刷新這個窗口。視頻壓縮對話框(video compression dialog box)用于設(shè)置視頻壓縮的格式。通過使用wm_cap_dlg_videocompression 消息(或 capdigvideocompression 宏)來顯示和刷新這個 窗口。預(yù)覽和覆蓋模式(preview and overlay )一般,一個捕獲驅(qū)動提供兩種方式來觀看輸入的視頻流:預(yù)覽模式和覆蓋模式。如果捕獲驅(qū) 動可以提供上面兩種模式,那么用戶就可以選擇其中的模式來使用。預(yù)覽
19、模式從捕獲設(shè)備硬件傳輸數(shù)據(jù)幀到系統(tǒng)的內(nèi)存中,并且在捕獲窗口中使用gdi函數(shù)來顯 示這些數(shù)據(jù)幀。當(dāng)捕獲窗口的父窗體失去焦點的時候,在應(yīng)用程序的視頻預(yù)覽的數(shù)據(jù)將變慢, 如果父窗體獲的焦點后,將對預(yù)覽顯示進(jìn)行加速。因為預(yù)覽處理的這種處理方式將大大提高 整個系統(tǒng)的效率。這里用3個消息用于控制預(yù)覽操作。iwm_cap_set_preview消息(cappreview宏)可以打開或者關(guān)閉預(yù)覽模式。iwm_cap_set_previewrate消息(cappreviewrate宏河以設(shè)置預(yù)覽模式下圖像的幀速度。iwm_cap_set_scale消息(cappreviewscale宏)打開或者關(guān)閉預(yù)覽視頻的縮
20、放比例。當(dāng)預(yù)覽和縮放比例屬性都打開后,那么視頻將被縮放到和捕獲窗口尺寸一樣大。打開預(yù)覽模 式后,系統(tǒng)將白動關(guān)閉覆蓋模式。覆蓋模式,將不占用cpu的處理資源,直接在顯示器上顯示視頻內(nèi)容。所用的處理是有捕 獲設(shè)備硬件來完成。發(fā)送wm_cap_set_overlay消息(或capoverlay宏)給捕獲窗口,可以 打開覆蓋模式。打開覆蓋模式后,將自動關(guān)閉預(yù)覽格式。無論是預(yù)覽模式還是覆蓋模式,都可以通過發(fā)送wm_cap_setscroll消息(capsetscroollpos 宏),可以設(shè)置圖像的在整個視頻幀的滾動位置(scroll position)。視頻格式通過發(fā)送 wm_cap_get_vide
21、oformat 消息(capgetvideoformat 宏)給視頻捕獲窗口 可以得到一個結(jié)構(gòu),在這個結(jié)構(gòu)體中就包含了視頻的格式、大小。通過發(fā)送 wm_cap_set_videoformat 消息(capsetvideoformat 宏)給視頻捕獲窗 i i 可 以對視頻格式進(jìn)行修改設(shè)置。you can set the format of captured video data by sending the wm_cap_set_videoformat message (or the capsetvideoformat macro) to a capture window視頻捕獲設(shè)置captu
22、reparms數(shù)據(jù)結(jié)構(gòu)包括了視頻流的控制參數(shù)。它允許完成如下的任務(wù):i指定幀速度(frame rate)。i指定為視頻分配的緩存大小。i關(guān)閉或者打開音頻捕獲。i設(shè)定捕獲的時間間隔。i指定捕獲設(shè)備(mci設(shè)備、vcr或者彫碟)。i指定鍵盤或鼠標(biāo)去控制結(jié)束捕獲。i指定適用的視頻類型通過發(fā)送 wm_cap_get_seqence_setup 消息(capcapturegetsetup)捕獲窗體,可以獲得一 個captureparms數(shù)據(jù)結(jié)構(gòu)的對象,當(dāng)前視頻捕獲的設(shè)置信息就在這里面。你對以改寫captureparms對彖的成員,來實現(xiàn)對視頻捕獲信息的修改。修改后,發(fā)送 wm_cap_set_seque
23、nce_setup 消 息(capcapturesetsetup)給捕獲 窗體,并 把這個 captureparms對象發(fā)給捕獲窗體,就可以實現(xiàn)修改。音頻格式 通過發(fā)送 wm_cap_get_audioformat 消息(capgetaudioformat 和 capgetaudioformatsize 宏)給捕獲窗體,你就可以獲得當(dāng)前的咅頻數(shù)據(jù)格式或咅頻數(shù)據(jù)結(jié)構(gòu)的大小。默認(rèn)咅頻捕獲 格式是 mono, 8-bit, 11 khz pcmo當(dāng)你使用wm_cap_get_aud10format消息得到音頻格式后,通常會使用waveformatex 這個數(shù)據(jù)結(jié)構(gòu)。通過發(fā)送wm_cap_set_au
24、dioformat消息(capsetaudioformat宏)給捕獲窗體,你可以設(shè)置 音頻數(shù)據(jù)捕獲格式。當(dāng)設(shè)置這個音頻格式時,你可以通過一個指針指向一個 waveformat ,waveformatex,或者 pcmwaveformat 數(shù)據(jù)結(jié)構(gòu)。3.1.5捕獲文件和緩存區(qū)捕獲文件名avicap默認(rèn),把音視頻數(shù)據(jù)從捕獲窗口保存到當(dāng)前驅(qū)動得根目錄下,文件名稱為capture.avi o 發(fā)送 wm_cap_file_set_capture_file 消息(capfilesetcapturefile)給捕獲窗體,可以改變 保存的文件名。這個消息指定文件名;它不實際創(chuàng)建文件,分配空問,也不能打開文件
25、。通 過發(fā)送 wm_cap_file_get_capture_file 消息(capfilefgetcapturefile 宏)給捕獲窗口,就可 以得到當(dāng)前文件名。保存捕獲數(shù)據(jù)到一個新文件 如果用戶想保存捕獲數(shù)據(jù),把數(shù)據(jù)存到另外一個文件中??梢允褂脀m_cap_file_saveas 消息(capfilesaveas宏)。這個消息不能改變捕獲文件的名稱和內(nèi)容。你必須去指定新建的文 件名,因為捕獲文件將保留原來的文件名稱。為捕獲文件預(yù)分配磁盤空問在捕獲操作前,先在磁盤上為捕獲文件建一個指定大小的文件。預(yù)分配空間將減少數(shù)據(jù)保存 時的處理時間??梢酝ㄟ^wm_cap_file_allocate消息(c
26、apfilealloc宏)來預(yù)分配一個捕獲文 件。你要預(yù)分配足夠大的磁盤空間去保存預(yù)計最大的捕獲文件。預(yù)分配磁盤空間沒有限定捕獲文 件的大小。如果捕獲的數(shù)據(jù)大于了分配的空間,文件尺寸將自動變大。對一個捕獲文件進(jìn)行 重寫數(shù)據(jù),將對文件的已經(jīng)分配的磁盤空間進(jìn)行重寫。通過對捕獲文件進(jìn)行磁盤碎片整理可以提高捕獲性能。要對文件進(jìn)行碎片整理,可以使用一 個碎片整理工具來完成,比如disk defragmentero通過使用沒圧縮的磁盤來保存數(shù)據(jù),同樣可以提高性能。因為在捕獲期間壓縮數(shù)據(jù)將對磁盤 的吞吐量進(jìn)行限制。索引大小在每個avi文件中都會使用一個指定大小的索引去查找音視頻數(shù)據(jù)塊。在一個索引的 入口定位
27、了一個視頻幀或者一個波形聲音的緩存器。所以,這個索引的大小簡接地限定了一 個捕獲文件所能保存的幀的數(shù)量上限。通過發(fā)送 wm_cap_get_sequence_setup 消息(capcapturegetsetup 宏)給捕獲窗口就可以得 到當(dāng)前的索引大小。這個索引大小就保存在captureparms數(shù)據(jù)結(jié)構(gòu)對象的一個成員中(dwindexsize ) 0你可以在dwindexsize中指定一個新的索引大小,并通過發(fā)送消息 wm_cap_set_sequence_setup(capcapturesetsetup 宏)給捕獲窗口完成信息設(shè)置。索引默認(rèn) 大小34,952 (允許32k幀和想匹配的聲音
28、緩存器).音視頻塊的間隔尺'j (granularity)數(shù)據(jù)塊的間隔尺寸是一個avi文件的邏輯塊人小。它用于寫和讀音視頻數(shù)據(jù)塊。當(dāng)向磁盤寫 咅視頻數(shù)據(jù)吋,avicap將在每個數(shù)據(jù)塊中加入一個必須的填充塊(filler chunks (riff "junk" chunks)去填充滿該數(shù)據(jù)塊。你可以使用wm_cap_get_sequenc_setup消息(capcapturegetsetup)去獲得當(dāng)前的塊間 隔尺寸(granularity)o captureparms的wchunkgranularity成員保存的是當(dāng)前的塊間隔尺 寸信息。通過對該成員的改寫,并發(fā)送
29、wm_cap_get_sequenc_setup消息 (capcapturesetsetup),可以對其進(jìn)行修改。你設(shè)置該參數(shù)為零的話,那么塊間隔尺寸的值 就為磁盤的扇區(qū)大小。視頻緩存區(qū)這個緩存區(qū)將視頻數(shù)據(jù)放在內(nèi)存的堆中。緩存區(qū)的大小可以改變,并且它的大小是由captureparms的wnumvideorequested成員和系統(tǒng)可以的內(nèi)存大小來決定。你可以使用wm_cap_get_sequenc_setup消息(capcapturegetsetup)去獲得當(dāng)前的視頻 緩存區(qū)的大小。captureparms的wnumvideorequested成員保存的是當(dāng)前的緩存區(qū)尺寸。 通過對該成員的改寫
30、,并發(fā)送 wm_cap_get_sequenc_setup 消息(capcapturesetsetup), 可以對其進(jìn)行修改。音頻緩存區(qū)你對以使用卜面三種方法來控制捕獲的音頻數(shù)據(jù):在捕獲中包含音頻或者不包含音頻按要求指定音頻緩存區(qū)的大小request that audio buffers be a specific size.你可以使用wm_cap_get_sequenc_setup消息(capcapturegetsetup)去獲得當(dāng)前的咅頻 緩存區(qū)的設(shè)置。captureparms的fcaptureaudio指定在這次捕獲操作中是否包括對聲音的 捕獲。wnumaudiorequested保存肖
31、前耍求的音頻緩存區(qū)的大小。dwaudiobuffersize保存當(dāng) 前的音頻緩存區(qū)的大小。通過對該成員的改寫,并發(fā)送 wm_cap_get_sequenc_setup 消息(capcapturesetsetup), 可以對其進(jìn)行修改。fcaptureaudio 默認(rèn)值是 true。the default buffer size (the value of) can contain 0.5 seconds of audio data or 10k, whichever is greater.3.1.6捕獲變化除了對基于持續(xù)吋間間隔的流捕獲外,avicap還支持如下的捕獲:i手控制幀捕獲istil
32、l-image 捕獲i不使用磁盤存儲的捕獲i從一個 mci 設(shè)備的流捕獲(real-time and step-frame)手動幀捕獲如果你向指定捕獲視頻流中個別幀,你可以通過wm_cap_single_frame_open消息、 wm_cap_single_frame 消息、wm_cap_single_frmae_close 消息來控制幀序列(capcapturesingleframeopen、/capcapturesingleframe、capcapturesigleframeclose)o典型應(yīng)用是,這些消息用于向捕獲文件添加單獨(dú)的幀來創(chuàng)建一個動畫, wm cap single fram
33、e open 為手動捕獲操作打開一個文件,wm cap single frame 用于捕獲一個單獨(dú)的幀放在文件屮。wm_cap_single_frmae_close用于關(guān)閉這個捕獲文件。注:該操作支持音視頻同時捕獲。still-image 捕獲如果要捕獲一個單獨(dú)的幀作為一個靜態(tài)圖像,你可以使用wm_cap_grab_frame_nostop 或者 wm_cap_grab_frame 消息(capgrabframenostop 或capgrabframe宏)在一個幀緩存區(qū)中捕獲一個圖像。你可以通過使用下血的消息來抓獲 當(dāng)前顯示的圖形 wm_cap_grab_frame ,否則,使用 wm_cap
34、_grab_frame_nostopo一旦開始捕獲,你可以拷貝圖像給其他應(yīng)用程序。你可以從幀緩存區(qū)拷貝一個圖像到剪貼板 (使用wm_cap_edit_copy消息或capeditcopy宏)。你還可以使用如下的消息,將緩存區(qū) 的一張圖像拷貝到一個dib位圖中(wm_cap_file_savedib消息或capfilesavedib宏)。不使用磁盤存儲的捕獲使用 wm_cap_seuence_nofile 消息(capcapturesequencenofile 宏),可以不向磁盤文件寫 入數(shù)據(jù)。該消息僅在配合回調(diào)函數(shù)時有用,它允許你的應(yīng)用程序直接使用音視頻數(shù)據(jù)。例如, 在視頻會議中,應(yīng)用程序使用
35、該消息區(qū)獲得視頻流?;卣{(diào)函數(shù)將傳輸捕獲的圖像傳送給遠(yuǎn)程 的計算機(jī)。從mci設(shè)備進(jìn)行流捕獲mci設(shè)備加強(qiáng)了實吋捕獲和步進(jìn)幀(step-frame)捕獲的處理操作。你可以指定一個mci設(shè)備, 比如一張影碟或者一盤錄像帶(vcr)來充當(dāng)視頻源。通過發(fā)送消息并指定你要選定的mci 設(shè)備的名稱。消息:wm_cap_set_mci_device (capsetmcidevicename宏)。獲得當(dāng)前使用的 設(shè)備可以使用 wm_cap_get_mci_device (capgetmcidevicename)消息。在實吋捕獲中, the capture window synchronizes the capt
36、ure operation and compensates for delays associated with positioning the mci video source and initializing the resources (such as capture buffers) required for capturing data. the capture window expects a valid mci video device to be installed in the system for capturing data this way.控制mci設(shè)備的規(guī)格信息保存
37、在captrueparms數(shù)據(jù)結(jié)構(gòu)體的數(shù)據(jù)成員中。mci兼容的視 頻源包括錄像機(jī)(vcr)和光碟。如果fmcicontrol數(shù)據(jù)成員為true,捕獲窗口采用mci操作。 捕獲窗口使用dwmcistarttime和dwmcistoptime來獲得開始和結(jié)束位置(毫秒)。如果 fmcicontrol數(shù)據(jù)成員的值為false, dwmcistarttime和dwmcistoptime的值將被忽略不見。你可以使用media player去快速檢查mci設(shè)備是否正確地連接到了你的系統(tǒng)上,如果在視 頻顯示顯示了圖像,就表示這個視頻源正確連接到了捕獲硬件上。在步進(jìn)幀(step-frame)捕獲情況下,the
38、 capture window synchronizes the capture operation and compensates for the delays associated with positioning the mci video source and initializing the resources required for capturing data in addition, the capture window ensures that no frames are dropped; it steps through the video frames individu
39、ally, ensuring that the frame is captured and stored before capturing the next frame in the video stream步進(jìn)幀(step-frame)捕獲控制的規(guī)格信息保存在captrueparms數(shù)據(jù)結(jié)構(gòu)體的數(shù)據(jù)成員屮。 步進(jìn)幀(step-frame)捕獲除了使用視頻捕獲要用的數(shù)據(jù)成員外,還使用其他的數(shù)據(jù)成員: fstepmcidevice, fstepcaptureat2x, 和 wstepcaptureaverageframes。如果數(shù)據(jù)成員 fstepmcidevice的值為true,捕獲窗口采用步
40、進(jìn)幀(step-frameli獲。捕獲窗口將使用這兩 個參數(shù)來指定捕獲的開始和結(jié)束位置(dwmcistarttime和dwmcistoptime毫秒)。捕獲窗 口使用fstepcaptureat2x來決定捕獲硬件捕獲的視頻幀使用兩個普通的分辨率。使用 wstepcaptureaverageframes來指定捕獲時每幀圖像使用的時間大小。如杲在一個步進(jìn)幀(step-frame脯獲中,指定fstepcaptureat2x為true,那么捕獲碩件 將使用兩個指定的解析度來進(jìn)行捕獲(高和寬的解析度都是雙倍的)。它使用軟件,在指定的 解析度的基礎(chǔ)上改寫圖像的象素,讓其成為更高解析度的圖像。如杲硬件不支持
41、基于硬件的 批量處理,你也可以使用該選項。并且捕獲為rgb格式。注意:如果你的硬件步支持基丁硬件的批量處理(hardware-based decimation), it can capture samples at a higher rate than specified and use these additional samples to obtain color definitions that are more consistent with the original image. the additional samples are discarded after they are
42、used, and the hardware passes samples to the capture driver at the specified rate。如果指定了步進(jìn)幀捕獲,wstepcaptureaverageframes成員用丁指定捕獲一幀圖像要使用的 時間,它是一個采樣的標(biāo)準(zhǔn)時間。以后捕獲圖像捕獲平均時間都會基于這個時間。采用這種 機(jī)制,降會減少在一個圖像幀的隨機(jī)數(shù)字化噪音。這個數(shù)據(jù)成員的標(biāo)準(zhǔn)值是5。關(guān)于mci的信息可以查看msdn上的信息。3.1.7高級捕獲選項這節(jié)描述在一個捕獲操作中,你還可以進(jìn)行的其他選擇。i測量視頻質(zhì)量i用戶初始化捕獲i和調(diào)色板一起工作i在avi文件中
43、的嵌入信息塊用戶數(shù)據(jù)消息(messages)測量視頻質(zhì)量測量視頻質(zhì)量的一個方法是去限定在一個捕獲操作期間丟掉的捕獲圖像幀的數(shù)字。當(dāng)流捕獲 完成后,質(zhì)量二丟掉的幀/所有的幀。如果這個數(shù)(百分?jǐn)?shù))大于wpercentdropforerror的 值,avicap將發(fā)一個錯誤信息給錯誤回調(diào)函數(shù)。wpercentdropforerror是captureparms 數(shù)據(jù)結(jié)構(gòu)體的一個數(shù)據(jù)成員。通過 wm_cap_get_sequence_setup 消息(capcapturegetsetup 宏)可以得到當(dāng)前設(shè)定的 丟掉幀的限定值。同樣對wpercentdropforerror進(jìn)行修改,再把修改后的數(shù)據(jù)結(jié)構(gòu)
44、體發(fā)送給 捕獲窗體就可以完成對限定值的修改。wm_cap_get_sequence_setup消息 (capcapturesetsetup) , wpercentdropforerrorm 默認(rèn)值 10 (10%)。用戶初始化捕獲通過 wm_cap_get_sequence_setup 消息(capcapturegetsetup 宏)可以得到當(dāng)前用戶 初始化捕獲的狀態(tài)值。該值存放在fmakeuserhitoktocapture屮。在開始一個捕獲會話前, 設(shè)置該值為true,可以為用戶提供精確的控制。系統(tǒng)為所有的音視頻分配好數(shù)據(jù)緩存區(qū)后, avicap會顯示一個對話框。它讓用戶清除因為軟件初始化
45、導(dǎo)致的捕獲延遲。如果你的應(yīng)用 程序為視頻數(shù)據(jù)分配的數(shù)據(jù)緩存區(qū)很小,那么這個對話框可能就沒的必要了。該值的默認(rèn)值 是 false o和調(diào)色板一起工作最初,如果視頻捕獲格式需要一個調(diào)色板,那么捕獲窗口將使用捕獲驅(qū)動提供的調(diào)色 板來代替。這個調(diào)色板可能由灰度值,或者可選的彩色值組成。使用wm_cap_pal_paste 或考 wm_cap_pal_open 消息(cappalettepaste 或 cappaletteopen) nj以獲得一個現(xiàn)存的調(diào) 色板去替換默認(rèn)的調(diào)色板。你還可以創(chuàng)建一個自定義的調(diào)色板去替換默認(rèn)的調(diào)色板,你要使 用 wm_cap_pal_autocreate 或者 wm_cap
46、_pal_manualcreate 消息(cappaletteauto 或cappalettemanual )。當(dāng)你替換了調(diào)色板后,捕獲窗體和驅(qū)動程序?qū)⑹褂锰鎿Q后的調(diào)色板, 直到你創(chuàng)建或打開其他的調(diào)色板為止。wm_cap_pal_autocreate 或者 wm_cap_pal_manualcreate 消息將創(chuàng)建一個基于當(dāng)前 視頻輸入最優(yōu)化的調(diào)色板。這個自定義的調(diào)色板將為視頻提供一個最好的顏色逼真度,因為 這個調(diào)色板的顏色是基于這個視頻的。捕獲窗口創(chuàng)建一個采樣顏色的3維柱狀圖。它會減小 真實顏色和漸近色間的值。在發(fā)送wm_cap_pal_autocreate消息吋,你必須指定avicap采樣
47、的幀數(shù)以及調(diào)色板的顏 色尺寸。在指定幀數(shù)時,要保證幀數(shù)足夠大以保證所有的視頻顏色可以被采樣收集到。使用wm_cap_pal_manualcreate消息可以對當(dāng)前幀進(jìn)行采樣。通過該消息,進(jìn)行兒次 手動選擇幀釆樣操作,你可以創(chuàng)建白己的調(diào)色板,它包含了你想要的顏色信息。一個調(diào)色板可以包含256種顏色。如果你要合并調(diào)色板,或者在視頻隊列中同時在顯示其他 視頻或圖像。你可以去使用一個小的顏色集合,這樣不同圖像或視頻的顏色就可以共存了。使用 wm_cap_pal_save消息(cappalettesave ),可以保促一個新的調(diào)色板。通過 wm_cap_pal_open消息還可以得到當(dāng)前的調(diào)色板。你可以
48、在調(diào)色板處理前保存一個調(diào)色板, 或者為其他應(yīng)用程序使用去保存一個調(diào)色板。使用wm_cap_pal_paste可以把剪貼板中的調(diào)色板粘貼到捕獲窗口中。捕獲窗口通過這個 調(diào)色板到捕獲驅(qū)動。其他程序可以拷貝調(diào)色板到剪貼板中。你也可以把調(diào)色板粘貼到剪貼板 中。使用wm_cap_endit_copy消息(capeditcopy)e它將拷貝視頻緩存區(qū)(包括調(diào)色板)到 剪貼區(qū)。在avi文件中的嵌入信息塊你可以在一個avi文件屮插入信息塊,比如文本或者自定義的數(shù)據(jù)。通過使用下面的消息:wm_cap_file_set_infochunk(capfilesetlnfochunk)0 可以使用這個消息還可以清除掉一
49、個 avi文件中的信息塊。用八數(shù)據(jù)消息通過使用 wm_cap_get_user_data 和 wm_cap_set_user_data 消息對以關(guān)聯(lián)數(shù)據(jù) 到一個捕獲窗體。(capgetuserdata和capsetuserdata宏)。使用get消息可以得至!i一個 long數(shù)據(jù)值,可以通過_5吐_消息去設(shè)置該值°3.1.8 avicap回 調(diào)函數(shù)你的應(yīng)用程序可以為一個捕獲窗口注冊一些回調(diào)函數(shù),它們可以告訴你的應(yīng)用程序一 些變化。比如捕獲狀態(tài)發(fā)生變化了,或者有錯誤發(fā)生了,音視頻緩存區(qū)可使用了。下面的消 息設(shè)置回調(diào)函數(shù)。wm_cap_set_callback_capcontrolcap
50、setcallbackoncapcontrol 去在應(yīng)用程療 :屮指定回調(diào)函數(shù)用于控制捕獲的開始和結(jié)束。wm_cap_set_callback_errorcapsetcallbackonerror 広在應(yīng)用程序中指定回調(diào)函數(shù),當(dāng)出錯的時候就調(diào)用它。wm_cap_set_callback_framecapsetcallbackonframe 宏在應(yīng)用程序中指定冋調(diào)函數(shù),當(dāng)預(yù)覽圖像幀被捕獲了的時候就調(diào)用它。wm_cap_set_callback_statuscapsetcallbackonstatus 宏在應(yīng)用程序中指定回調(diào)函數(shù),當(dāng)狀態(tài)(status)改變的時候就調(diào)用它。wm_cap_set_ca
51、llback_videostreamcapsetcallbackonvideostream 宏在應(yīng)用程序中指定回調(diào)函數(shù),在流捕獲期間,當(dāng)一個新的視頻緩存區(qū)可用的吋候就調(diào)用它。wm_cap_set_callback_wavestreamcapsetcallbackonwavestream 宏在應(yīng)用程序屮指定回調(diào)函數(shù),在流捕獲期間,當(dāng)一個新的音頻緩存區(qū)可用的時候就調(diào)用它。wm_cap_set_callback_yieldcapsetcallbackonyield 宏在應(yīng)用程序屮指定冋調(diào)函數(shù),在流捕獲期間yielding (產(chǎn)生?)精確捕獲控制捕獲窗口對以提供捕獲回調(diào)函數(shù),這個回調(diào)函數(shù)可以對流捕獲的
52、開始和結(jié)束時刻進(jìn)行精確的 控制。在捕獲驅(qū)動程序(capture driver)完成所有緩存區(qū)分配和其他捕獲準(zhǔn)備后,捕獲驅(qū)動 程序就發(fā)送第一個消息給回調(diào)處理程序,把nstate參數(shù)設(shè)置為:controlcallback_preroll這個消息告訴應(yīng)用程序?qū)⒁_啟視頻源了。(這個回調(diào)函數(shù)指定nstate為它的第二個參數(shù)) 冋調(diào)函數(shù)將在開始時刻產(chǎn)生返冋值。返冋值為true那么將繼續(xù)捕獲。為false就中斷捕獲。 一旦捕獲開始,這個回調(diào)函數(shù)將頻繁的調(diào)用,把nstate設(shè)置為:controlcallback_capturing將允許應(yīng)用程序通過返冋false去結(jié)束捕獲。捕獲窗口使用錯誤通知消息去告訴你的
53、應(yīng)用程序,發(fā)生了 avicap錯誤,比如磁盤空 i'可已經(jīng)用完了,嘗試對一個只讀文件進(jìn)行寫操作,不能訪問碩件,掉幀太多。錯誤通知內(nèi)容 報價一個消息id和一個格式化的文本字符(用來顯示)。你的應(yīng)用程序可以通過使用這個消 息id去過濾錯誤通報,還可以讓該錯誤信息不顯示給用戶。消息id為0表示一個新操作正 在開始并且這個回調(diào)函數(shù)會清除掉所有的顯示的錯誤信息。幀(frame)a capture window uses frame callback notification messages to notify your application when a new video frame is
54、 available. the capture window enables these callback notifications only if the preview rate is non zero and streami ng capture is not in progress.狀態(tài)回調(diào)函數(shù)當(dāng)視頻捕獲向磁盤寫數(shù)據(jù),或者在其他較長的操作期間,捕獲窗口可以發(fā)送消息給狀態(tài)冋調(diào) 函數(shù)通知你正在處理該操作的應(yīng)用程序。狀態(tài)信息包插一個消息id和和一個格式化的文本 字符(用來顯示)。你的應(yīng)用程序可以通過使用消息id去過濾通報,還可以限制該信息是否 顯示給用戶。在捕獲操作期間,發(fā)給回調(diào)函數(shù)的第一
55、個消息總是id_cap_gegin,最后一個 總是id_cap_endo消息id為0表示,一個新操作正在進(jìn)行并且回調(diào)函數(shù)將清除當(dāng)前狀態(tài)。視頻流在流捕獲期間,應(yīng)用程序可以使用視頻流回調(diào)函數(shù)去處理一個捕獲的視頻幀。視頻窗 體只能在每次向磁盤寫數(shù)據(jù)幀前,調(diào)用視頻流回調(diào)函數(shù)。音頻流在流捕獲期i'可,應(yīng)用程序可以使用咅頻流回調(diào)函數(shù)去處理咅頻緩存區(qū)。視頻窗體只能在每次 向磁盤寫數(shù)據(jù)幀前,調(diào)用音頻流回調(diào)函數(shù)。yield回調(diào)函數(shù)應(yīng)用程序在流捕獲期間可以使用yield回調(diào)函數(shù)。(yield回調(diào)函數(shù)一般是由一個消息循環(huán)組 成,可以調(diào)用peekmessageztranslatemessagezdispatc
56、hmessage)o捕獲窗口在每次捕獲視頻幀 時至少調(diào)用一次yield回調(diào)函數(shù)。但是具體要調(diào)用多少次由幀率來決定。關(guān)閉回調(diào)函數(shù)你可以暫時或永久關(guān)閉所有的回調(diào)函數(shù)的功能,在發(fā)送消息設(shè)置回調(diào)函數(shù)的時候,用null 替換調(diào)回調(diào)函數(shù)就可以了。3.2使用視頻捕獲3.2.1創(chuàng)建捕獲窗體下面的例子通過使用capcreatecapturewindow函數(shù)來創(chuàng)建一個捕獲窗體hwndc = capcreatecapturewindow ((lpstr) "my capture window11,/如果是pop-up窗口的窗口名稱ws_child | ws_visible,/窗口類型0, 0, 160,
57、120,/窗口位置和尺寸(hwnd) hwn dpa re nt,(int) nid /* child id */);3.2.2連接到一個捕獲驅(qū)動器下面舉例,如何通過捕獲窗口的句柄hwndc連接到ms video驅(qū)動程序上,同時還演示了 如何斷開連接。使用capdriverdisconnect:fok = sendmessage (hwndc, wm_cap_driver_connect, 0, 0l);/或者使用宏連接:/ fok = capdriverconnect(hwndc, 0);/關(guān)閉連接capdriverdisconnect (hwndc);3.2.3列舉安裝的捕獲驅(qū)動程序使用capgetdriverdescription函數(shù)來獲得系統(tǒng)己經(jīng)安裝的所冇捕獲驅(qū)動程序的名稱和版本。char szdevicename80;char szdeviceversion80;for (wlndex = 0; windex < 10; wlndex+)if (capgetdriverdescription (windex, szdevicename,sizeof (szdevicename), szdeviceversion,sizeof (szdeviceversion)/加入名字到一個已經(jīng)安裝的設(shè)備列表中讓用戶選擇一個使用。3.2.4獲得捕獲驅(qū)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保安續(xù)簽合同范例
- 二手卷板機(jī)銷售合同范例
- 公司工作方案范本
- 農(nóng)房建造合同范例
- 鐵路職工安全教育
- 冷庫分包合同范例
- led產(chǎn)品購銷合同范例
- 個體合同范例
- 包人工合同范例
- 碼頭削坡挖土施工方案
- 三角形全等的判定(一)完整版
- 試驗室儀器設(shè)備自校規(guī)程
- 餐飲服務(wù)與管理實務(wù)(高職)全套教學(xué)課件
- 初中音樂教學(xué)中的曲式結(jié)構(gòu)與樂曲解析
- 公路施工部署與施工方案的制訂-公路施工部署
- 安全標(biāo)準(zhǔn)化示范班組建設(shè)匯報
- 一例乳腺癌術(shù)后并發(fā)淋巴水腫患者的個案護(hù)理
- 退行性骨關(guān)節(jié)病影像診斷
- DJI Mavic 3 Pro - 快速入門指南 (DJI RC) v1.0
- 初中道德與法治中考復(fù)習(xí)策略與方法
- 護(hù)眼燈投標(biāo)方案(技術(shù)標(biāo))
評論
0/150
提交評論