首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 呼叫 AVICAP32.DLL 控制攝影機擷取影像與錄影

     編輯:Delphi

AVICAP32.DLL 核心函數與常數定義

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)

三個按鈕分別實現儲存 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 提供更豐富的多媒體控制能力。若要實現視訊聊天,核心在於影像壓縮編碼、網路傳輸與遠端解碼顯示,雖原理直觀但工程實作具挑戰性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved