一、使用VFW(vido for windows) architecture來處理和顯示影音資訊有兩項缺點:
(1) 音訊/視訊的同步化問題(audio/video synchronization) 。
(2) 不支援可變動長度的視框(no support variable-length frames)。
因此目前多數已經用DirectShow來處理相關的視訊資料;但是相對於使用DirectShow而言使用
VFW比較適合用於開發簡單和單純功能的視訊相關軟體。
二、在C#中使用VFW library(Avicap32.dll)必須先使用Dlllmport來Include Library,但是由於AVICap
Windows Class是以message-based為介面,因此多數的函式其實是巨集指令透過特定的命令來控
制和操作AVICap Window,本文使用的相關的函式只下列兩項其他的皆為巨集指令:
2-1、capCreateCaptureWindow (
[MarshalAS(UnmanagedType.LPStr)] string lpName,
uint dwStyle,
int x, int y,
int nWidth, int nHeight,
IntPtr hWnd,int nID
);
一 建立AVICap Window來顯示及控制相關的視訊資料,且必須為某視窗的子視窗才能建立成功。
此外該函式只單純建立視訊視窗尚未無連接任何視訊擷取裝置。
2-2、capGetDriverDescription (
uint wDriverIndex,
StringBuilder lpszName,
int cbName,
StringBuilder lpszVer,
nt cbVer
);
一 取得目前安裝於系統上有關於視訊裝置的驅動程式相關資料。
2-3、SendMessage(IntPtr hWnd,uint Msg,int wParam,int lParam);
一 在C#中要對AVICap Window傳送控制命令的方式主要使用Windows API中的傳送控制命令
至指定的視窗相關的參數可藉由wParam或lParam來傳遞。
2-4、DestoryWindow(IntPtr hWnd); 一 關閉指定視窗。
三、AVICap Window的相關控製命令如下:
3-01:public const ushort WM_CAP_START = 0x0400;
一 本身為無意義,主要用定義其他命令的相對值。
3-02:public const ushort WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
一 設定Callback函式到AVICap Window,每次接收到完整視框資料則會執行此Callback函式。
3-03:public const ushort WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
一 控制AVICap Window連接特定的視訊裝置,連接的對象為安裝於系統上的驅動程式,
而非針對視訊擷取裝置。
3-04:public const ushort WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
一 控制AVICap Window 中斷連接的視訊裝置。
3-05:public const ushort WM_CAP_DRIVER_GET_CAPS = WM_CAP_START + 14;
一 取得目前開啟裝置的驅動程式所提供的相關功能。
3.06:public const ushort WM_CAP_FILE_SET_CAPTURE_FILE = WM_CAP_START +20;
一 設定視訊擷取後儲存的檔案名稱,預設的檔案名稱為C:\Capture.avi
3.07:public const ushort WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
一 開啟視訊格式的控制視窗,依視訊擷取裝置的驅動程式而異。
3.08:public const ushort WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
一 開啟視訊來源的控制視窗,依視訊擷取裝置的驅動程式而異。
3.09:public const ushort WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START+ 43;
一 開啟視訊設定和調整的控制視窗,依視訊擷取裝置的驅動程式而異。
3-10:public const ushort WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START +46;
一 開啟視訊壓縮的控制視窗,依視訊擷取裝置的驅動程式而異。
3-11:public const ushort WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 50;
一 開啟或關閉預覽的功能,若關閉則AVICap Window只會顯示第一張視訊擷取圖。
3-12: public const ushort WM_CAP_SET_PREVIEW = WM_CAP_START + 52;
一 設定預覽的速率。
3.13: public const ushort WM_CAP_GET_STATUS = WM_CAP_START +54;
一 使用CAPSTATUS Structure來取得目前視訊視窗的狀態。
3-14: public const ushort WM_CAP_SEQUENCE = WM_CAP_START + 62;
一 通知AVICap Windows開始錄製視訊的內容並儲存成影像檔。
3-15: public const ushort WM_CAP_SET_SEQUENCE_SETUP = WM_CAP_START + 64;
一 使用CAPTUREPARMS Structure來設定錄製視訊的相關資訊。
其他相關的命令請參考Multimedia Messages
四、Video For Windows程式開發流程如下:
4-01、列舉目前安裝於系統上有關於視訊擷取裝置的驅動程式。
4-02、建立AVICap Window 。
4-03、指定連接視訊裝置的驅動程式。
4-04、取得目前視訊視窗的狀態。
4-05、設定視訊視窗於父視窗中的位置。
4-06、設定是否要預覽和預覽速率。
4-07、取得目前連接中驅動程式提供的功能。
4-07.1、視訊來源控制視窗
4-07.2、視訊格式控制視窗
4-07.3、視訊顯示控制視窗
4-07.4、視訊壓縮控制視窗
4-08、設定是否提供儲存視訊為圖檔的功能。
4-09、 設定是否提供錄製視訊為影像檔的功能。
Download: VideoForWindows.zip VideoForWindows.exe
Result: