Windows 多媒體架構提供 AVICAP32.DLL 供應用程式存取視訊擷取裝置。Delphi 透過外部函數宣告即可呼叫其 API,核心函數 capCreateCaptureWindowA 建立擷取視窗,配合一系列 WM_CAP_* 訊息常數控制裝置連線、預覽、擷取與錄影:
const
WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_SAVEDIB = WM_CAP_START + 25; // 儲存 BMP
WM_CAP_GRAB_FRAME = WM_CAP_START + 60; // 擷取單幀
WM_CAP_SEQUENCE = WM_CAP_START + 62; // 開始錄影
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20; // 設定 AVI 檔案
WM_CAP_SET_PREVIEW = WM_CAP_START + 50; // 啟用預覽
WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52; // 設定預覽幀率
WM_CAP_SET_SCALE = WM_CAP_START + 53; // 縮放畫面
WM_CAP_SET_OVERLAY = WM_CAP_START + 51; // 覆蓋模式
function capCreateCaptureWindowA(lpszWindowName: PChar; dwStyle: Longint;
x, y, nWidth, nHeight: Integer; ParentWin: HWND; nId: Integer): HWND;
stdcall external 'AVICAP32.DLL';
在表單放置 TPanel 作為預覽區域,按鈕控制啟動/停止。全域變數 hWndC: THandle 保存擷取視窗控制代碼。啟動流程:建立子視窗、設定回呼、連線驅動程式、啟用縮放/預覽/覆蓋模式:
procedure TForm1.Button1Click(Sender: TObject); // 開始按鈕
begin
hWndC := capCreateCaptureWindowA('My Capture Window',
WS_CHILD or WS_VISIBLE, Panel1.Left, Panel1.Top,
Panel1.Width, Panel1.Height, Form1.Handle, 0);
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); // 連線驅動程式
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); // 啟用縮放
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); // 設定幀率 ~15fps
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); // 覆蓋模式
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); // 啟用預覽
end;
end;
procedure TForm1.Button2Click(Sender: TObject); // 停止按鈕
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
end;
end;
三個按鈕分別實現儲存 BMP、開始/停止 AVI 錄影:
procedure TForm1.Button3Click(Sender: TObject); // 儲存 BMP
begin
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_SAVEDIB, 0, Longint(PChar('c:\test.bmp')));
end;
procedure TForm1.Button4Click(Sender: TObject); // 開始錄影
begin
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, Longint(PChar('c:\test.avi')));
SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
end;
end;
procedure TForm1.Button5Click(Sender: TObject); // 停止錄影
begin
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_STOP, 0, 0);
end;
完整單元程式碼包含表單建立、按鈕事件、關閉時釋放資源。若電腦無實體攝影機,可使用 SoftCam 等虛擬攝影機軟體模擬裝置進行測試(切勿用於欺騙通訊軟體)。進階開發可考慮 DSPack 元件套件,基於 DirectShow/DirectX 提供更豐富的多媒體控制能力。若要實現視訊聊天,核心在於影像壓縮編碼、網路傳輸與遠端解碼顯示,雖原理直觀但工程實作具挑戰性。