# DX9_UVC

USB 摄像头预览与录制工具 (Delphi / DirectShow)

## 概述

DX9_UVC 是一个基于 Delphi 和 DirectShow 的 Windows 应用程序，用于枚举、预览和录制 USB 摄像头（UVC 设备）。支持多种视频格式选择和实时画面预览。

## 功能

- 枚举所有 USB 摄像头设备
- 列出每个设备支持的视频格式（分辨率、帧率）
- 在 TPanel 上实时预览摄像头画面
- 支持录制视频到文件
- 支持截图（snap BMP）
- 支持通过 JSON 文件保存/加载摄像头参数（Save JSON / Load JSON）
- 自动保存窗口位置和设备配置到 INI 文件
- IPC 外部控制 — 通过命名管道暴露 JSON 指令接口，允许第三方程序远程控制摄像头
- 鼠标滚轮缩放 — 在预览画面上滚动鼠标滚轮缩放（0.1×–10×），保持光标位置不变
- 左键平移 — 左键拖拽平移已缩放的画面
- 中键重置 — 点击鼠标中键将缩放重置为 100%
- 镜像翻转 — 支持水平/垂直镜像
- 画面旋转 — 支持 0°/90°/180°/270° 旋转
- 混合渲染模式 — 无变换时使用 DirectShow 硬件渲染（零 CPU 开销），变换启用时自动切入软件渲染（~30fps）
- 暂停画面 — 点击 Pause 按钮冻结/恢复预览画面
- Ctrl+S 快速截图 — 按下 Ctrl+S 保存当前帧，Ctrl+C 复制到剪贴板
- 设备热插拔检测 — 状态栏实时显示 Running / Stoped / Paused；拔除摄像头自动检测并停止预览，插回自动恢复
- IPC 按名称选择摄像头 — `select_webcam` 支持 `webcam_name` 字段进行子串匹配
- 热插拔自动恢复 — 摄像头拔除后状态栏显示 `Stoped`，插回后自动恢复预览
- 暂停/恢复 — Pause 按钮冻结画面（DirectShow Pause），再次点击恢复
- Ctrl+S / Ctrl+C — 快速保存截图（Ctrl+S）和复制到剪贴板（Ctrl+C）

## 项目结构

文件 | 说明
--- | ---
`DX9_UVC.dpr` | 主入口
`Unit1.pas` / `Unit1.dfm` | 主窗体（TForm1），UI + IPC 命令处理
`untUSBCamera.pas` | DirectShow 摄像头枚举、预览、录制核心
`MahUSB.pas` | USB 设备热插拔检测
`Unit_IPC_Server.pas` | 命名管道 IPC 服务端线程
`DX9_UVC_IPC_Client.dpr` | IPC 客户端 GUI 程序
`Unit_IPC_Client.pas` | IPC 客户端通信库（TIPCSender）
`Unit_IPC_Client_Demo.pas/.dfm` | 客户端演示窗体
`IPC_Console_Client.dpr` | IPC 命令行客户端
`IPC_Client_Example.pas` | IPC 客户端代码示例片段
`DX9_UVC.ini` | 设备配置持久化（自动生成）

## IPC 外部控制

DX9_UVC 启动后会在后台创建一个命名管道 `\\.\pipe\DX9_UVC_IPC`，外部程序可通过该管道发送 JSON 指令控制摄像头。

### 支持的 IPC 指令

指令 | 说明
--- | ---
`ping` | 健康检查，返回 `"pong"`
`list_webcams` | 列出所有可用摄像头
`select_webcam` | 按 `index` 选择摄像头
`list_formats` | 列出当前摄像头的视频格式
`select_format` | 按 `index` 选择格式并开始预览
`start_preview` | 开始视频预览
`stop_preview` | 停止视频预览
`get_status` | 获取预览状态、分辨率、缩放比例
`list_params` | 列出所有摄像头参数（名称、值、范围、步进）
`set_param` | 设置参数（`name`/`value`/`auto`）
`reset_params` | 将所有参数恢复为默认值
`save_json` | 保存当前设置为 JSON 文件
`load_json` | 从 JSON 文件加载设置
`save_snapshot` | 截图保存到文件
`copy_snapshot` | 截图复制到剪贴板

### 使用示例

命令行客户端：

    IPC_Console_Client ping
    IPC_Console_Client list-webcams
    IPC_Console_Client select-webcam 0
    IPC_Console_Client set-param Brightness 128
    IPC_Console_Client set-param Exposure 0 1            # auto=true
    IPC_Console_Client save-json settings.json
    IPC_Console_Client json '{"command":"load_json","file":"settings.json"}'

原始 JSON 请求（通过任何命名管道客户端发送）：

    {"command":"ping"}
    {"command":"select_webcam","index":0}
    {"command":"set_param","name":"Exposure","value":-5,"auto":false}
    {"command":"save_json","file":"mysettings.json"}
    {"command":"load_json","file":"mysettings.json"}

程序化调用（Delphi）：

    uses Unit_IPC_Client;

    var
      IPC: TIPCSender;
      Res: TJSONObject;
    begin
      IPC := TIPCSender.Create('DX9_UVC_IPC');
      try
        // 预设参数
        IPC.SendSimpleCmd('start_preview').Free;
        QuickSetParam('Brightness', 128, False);
        QuickSetParam('Exposure', 0, True);
        IPC.SendSimpleCmd('stop_preview').Free;
      finally
        IPC.Free;
      end;
    end;

### IPC 客户端工具

- DX9_UVC_IPC_Client.exe — GUI 客户端，提供一键操作所有指令、快速参数调节面板和完整演示流程按钮
- IPC_Console_Client.exe — 命令行客户端，适合脚本自动化

## 编译要求

- Delphi 12 / RAD Studio 37.0 (Athens)
- 依赖第三方组件包（参见 .dproj 中的 DCC_UsePackage）：
  - JEDI Code Library (JCL)
  - JEDI Visual Component Library (JVCL)
  - Mitov LabPacks (OpenWire, VideoLab, AudioLab, SignalLab)
  - VirtualTreeView, VirtualShellTools
  - SmartCoreAI, SVGIconImageList, DCPCrypt
  - 以及其他 Delphi 内置包

> 提示：编译前请确保已安装上述组件包，或在 IDE 中移除不需要的包引用。

## 编译

### RAD Studio IDE

1. 打开 `DX9_UVC.dproj`
2. 选择目标平台 `Win32`
3. 选择配置 `Debug` 或 `Release`
4. 按 `Ctrl + F9` 编译

### 命令行 (MSBuild)

    call "C:\Program Files (x86)\Embarcadero\Studio\37.0\bin\rsvars.bat"
    msbuild DX9_UVC.dproj /t:Build /p:Config=Release

输出路径：`.\Win32\Release\DX9_UVC.exe`

## 配置

程序自动读取/写入同目录下的 `DX9_UVC.ini`：

    [WebCam]
    WebCam_index=0
    WebCam_format_index=1

    [Placement]
    Top=100
    Left=100
    Width=1024
    Height=768

    [设备名称]
    Name=Logitech BRIO
    format Index=1

## 使用

1. 启动程序，左侧列表自动枚举 USB 摄像头
2. 点击摄像头名称，右侧列出支持的视频格式
3. 双击视频格式开始预览
4. 滚动滚轮缩放画面，左键拖拽平移，中键重置 1:1
5. 在右侧勾选 Mirror H / Mirror V 或选择 Rotation 角度
6. 点击 Video Preview 按钮切换预览启停
7. 状态栏显示当前分辨率与缩放比例

## 備註

維持 32bit，原因：

DirectShow 濾鏡生態系仍以 32bit 為主 — 許多 USB 相機廠商（尤其是較老型號）只提供 32bit 驅動，升 64bit 後可能直接無法辨識裝置，而這正是本程式的核心功能。
轉換不是單純改 Platform 選項 — 需要完整回歸測試所有功能：裝置列舉、預覽、抓幀、截圖、IPC 命令、參數控制。
實際效益有限 — 你目前處理的是 1920×1080 或更低解析度的 UVC 畫面，單幀 buffer 只有 ~6MB，連 2GB 的 1% 都不到。64bit 的大記憶體優勢在這裡完全用不上。

## 许可

内部项目。