📄 u_avicap.pas
字号:
unit U_AviCap;
interface
uses
Windows, MMSystem, Messages;
const
// ------------------------------------------------------------------
// Window Messages WM_CAP... which can be sent to an AVICAP window
// ------------------------------------------------------------------
// Defines start of the message range
WM_CAP_START = WM_USER;
WM_CAP_GET_CAPSTREAMPTR = (WM_CAP_START + 1);
WM_CAP_SET_CALLBACK_ERROR = (WM_CAP_START + 2);
WM_CAP_SET_CALLBACK_STATUS = (WM_CAP_START + 3);
WM_CAP_SET_CALLBACK_YIELD = (WM_CAP_START + 4);
WM_CAP_SET_CALLBACK_FRAME = (WM_CAP_START + 5);
WM_CAP_SET_CALLBACK_VIDEOSTREAM = (WM_CAP_START + 6);
WM_CAP_SET_CALLBACK_WAVESTREAM = (WM_CAP_START + 7);
WM_CAP_GET_USER_DATA = (WM_CAP_START + 8);
WM_CAP_SET_USER_DATA = (WM_CAP_START + 9);
WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10);
WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11);
WM_CAP_DRIVER_GET_NAME = (WM_CAP_START + 12);
WM_CAP_DRIVER_GET_VERSION = (WM_CAP_START + 13);
WM_CAP_DRIVER_GET_CAPS = (WM_CAP_START + 14);
WM_CAP_FILE_SET_CAPTURE_FILE = (WM_CAP_START + 20);
WM_CAP_FILE_GET_CAPTURE_FILE = (WM_CAP_START + 21);
WM_CAP_FILE_ALLOCATE = (WM_CAP_START + 22);
WM_CAP_FILE_SAVEAS = (WM_CAP_START + 23);
WM_CAP_FILE_SET_INFOCHUNK = (WM_CAP_START + 24);
WM_CAP_FILE_SAVEDIB = (WM_CAP_START + 25);
WM_CAP_EDIT_COPY = (WM_CAP_START + 30);
WM_CAP_SET_AUDIOFORMAT = (WM_CAP_START + 35);
WM_CAP_GET_AUDIOFORMAT = (WM_CAP_START + 36);
WM_CAP_DLG_VIDEOFORMAT = (WM_CAP_START + 41);
WM_CAP_DLG_VIDEOSOURCE = (WM_CAP_START + 42);
WM_CAP_DLG_VIDEODISPLAY = (WM_CAP_START + 43);
WM_CAP_GET_VIDEOFORMAT = (WM_CAP_START + 44);
WM_CAP_SET_VIDEOFORMAT = (WM_CAP_START + 45);
WM_CAP_DLG_VIDEOCOMPRESSION = (WM_CAP_START + 46);
WM_CAP_SET_PREVIEW = (WM_CAP_START + 50);
WM_CAP_SET_OVERLAY = (WM_CAP_START + 51);
WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52);
WM_CAP_SET_SCALE = (WM_CAP_START + 53);
WM_CAP_GET_STATUS = (WM_CAP_START + 54);
WM_CAP_SET_SCROLL = (WM_CAP_START + 55);
WM_CAP_GRAB_FRAME = (WM_CAP_START + 60);
WM_CAP_GRAB_FRAME_NOSTOP = (WM_CAP_START + 61);
WM_CAP_SEQUENCE = (WM_CAP_START + 62);
WM_CAP_SEQUENCE_NOFILE = (WM_CAP_START + 63);
WM_CAP_SET_SEQUENCE_SETUP = (WM_CAP_START + 64);
WM_CAP_GET_SEQUENCE_SETUP = (WM_CAP_START + 65);
WM_CAP_SET_MCI_DEVICE = (WM_CAP_START + 66);
WM_CAP_GET_MCI_DEVICE = (WM_CAP_START + 67);
WM_CAP_STOP = (WM_CAP_START + 68);
WM_CAP_ABORT = (WM_CAP_START + 69);
WM_CAP_SINGLE_FRAME_OPEN = (WM_CAP_START + 70);
WM_CAP_SINGLE_FRAME_CLOSE = (WM_CAP_START + 71);
WM_CAP_SINGLE_FRAME = (WM_CAP_START + 72);
WM_CAP_PAL_OPEN = (WM_CAP_START + 80);
WM_CAP_PAL_SAVE = (WM_CAP_START + 81);
WM_CAP_PAL_PASTE = (WM_CAP_START + 82);
WM_CAP_PAL_AUTOCREATE = (WM_CAP_START + 83);
WM_CAP_PAL_MANUALCREATE = (WM_CAP_START + 84);
// Following added post VFW 1.1
WM_CAP_SET_CALLBACK_CAPCONTROL = (WM_CAP_START + 85);
// Defines end of the message range
WM_CAP_END = WM_CAP_SET_CALLBACK_CAPCONTROL;
// ------------------------------------------------------------------
// Message crackers for above
// ------------------------------------------------------------------
function capSetCallbackOnError(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnStatus(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnYield(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnFrame(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnVideoStream(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnWaveStream(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetCallbackOnCapControl(hwnd: THandle; fpProc: LongInt): LongInt;
function capSetUserData(hwnd: THandle; lUser: LongInt): LongInt;
function capGetUserData(hwnd: THandle): LongInt;
function capDriverConnect(hwnd: THandle; I: Word): LongInt;
function capDriverDisconnect(hwnd: THandle): LongInt;
function capDriverGetName(hwnd: THandle; szName: LongInt; wSize: Word): LongInt;
function capDriverGetVersion(hwnd: THandle; szVer: LongInt; wSize: Word): LongInt;
function capDriverGetCaps(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capFileSetCaptureFile(hwnd: THandle; szName: LongInt): LongInt;
function capFileGetCaptureFile(hwnd: THandle; szName: LongInt; wSize: Word): LongInt;
function capFileAlloc(hwnd: THandle; dwSize: LongInt): LongInt;
function capFileSaveAs(hwnd: THandle; szName: LongInt): LongInt;
function capFileSetInfoChunk(hwnd: THandle; lpInfoChunk: LongInt): LongInt;
function capFileSaveDIB(hwnd: THandle; szName: LongInt): LongInt;
function capEditCopy(hwnd: THandle): LongInt;
function capSetAudioFormat(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capGetAudioFormat(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capGetAudioFormatSize(hwnd: THandle): LongInt;
function capDlgVideoFormat(hwnd: THandle): LongInt;
function capDlgVideoSource(hwnd: THandle): LongInt;
function capDlgVideoDisplay(hwnd: THandle): LongInt;
function capDlgVideoCompression(hwnd: THandle): LongInt;
function capGetVideoFormat(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capGetVideoFormatSize(hwnd: THandle): LongInt;
function capSetVideoFormat(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capPreview(hwnd: THandle; f: Word): LongInt;
function capPreviewRate(hwnd: THandle; wMS: Word): LongInt;
function capOverlay(hwnd: THandle; f: Word): LongInt;
function capPreviewScale(hwnd: THandle; f: Word): LongInt;
function capGetStatus(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capSetScrollPos(hwnd: THandle; lpP: LongInt): LongInt;
function capGrabFrame(hwnd: THandle): LongInt;
function capGrabFrameNoStop(hwnd: THandle): LongInt;
function capCaptureSequence(hwnd: THandle): LongInt;
function capCaptureSequenceNoFile(hwnd: THandle): LongInt;
function capCaptureStop(hwnd: THandle): LongInt;
function capCaptureAbort(hwnd: THandle): LongInt;
function capCaptureSingleFrameOpen(hwnd: THandle): LongInt;
function capCaptureSingleFrameClose(hwnd: THandle): LongInt;
function capCaptureSingleFrame(hwnd: THandle): LongInt;
function capCaptureGetSetup(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capCaptureSetSetup(hwnd: THandle; s: LongInt; wSize: Word): LongInt;
function capSetMCIDeviceName(hwnd: THandle; szName: LongInt): LongInt;
function capGetMCIDeviceName(hwnd: THandle; szName: LongInt; wSize: Word): LongInt;
function capPaletteOpen(hwnd: THandle; szName: LongInt): LongInt;
function capPaletteSave(hwnd: THandle; szName: LongInt): LongInt;
function capPalettePaste(hwnd: THandle): LongInt;
function capPaletteAuto(hwnd: THandle; iFrames: Word; iColors: LongInt): LongInt;
function capPaletteManual(hwnd: THandle; fGrab: Word; iColors: LongInt): LongInt;
// ------------------------------------------------------------------
// Structures
// ------------------------------------------------------------------
type
PCapDriverCaps = ^TCapDriverCaps;
TCapDriverCaps = record
wDeviceIndex: WORD; // Driver index in system.ini
fHasOverlay: BOOL; // Can device overlay?
fHasDlgVideoSource: BOOL; // Has Video source dlg?
fHasDlgVideoFormat: BOOL; // Has Format dlg?
fHasDlgVideoDisplay: BOOL; // Has External out dlg?
fCaptureInitialized: BOOL; // Driver ready to capture?
fDriverSuppliesPalettes: BOOL; // Can driver make palettes?
hVideoIn: THANDLE; // Driver In channel
hVideoOut: THANDLE; // Driver Out channel
hVideoExtIn: THANDLE; // Driver Ext In channel
hVideoExtOut: THANDLE; // Driver Ext Out channel
end;
PCapStatus = ^TCapStatus;
TCapStatus = packed record
uiImageWidth: UINT; // Width of the image
uiImageHeight: UINT; // Height of the image
fLiveWindow: BOOL; // Now Previewing video?
fOverlayWindow: BOOL; // Now Overlaying video?
fScale: BOOL; // Scale image to client?
ptScroll: TPOINT; // Scroll position
fUsingDefaultPalette: BOOL; // Using default driver palette?
fAudioHardware: BOOL; // Audio hardware present?
fCapFileExists: BOOL; // Does capture file exist?
dwCurrentVideoFrame: DWORD; // # of video frames cap'td
dwCurrentVideoFramesDropped: DWORD; // # of video frames dropped
dwCurrentWaveSamples: DWORD; // # of wave samples cap'td
dwCurrentTimeElapsedMS: DWORD; // Elapsed capture duration
hPalCurrent: HPALETTE; // Current palette in use
fCapturingNow: BOOL; // Capture in progress?
dwReturn: DWORD; // Error value after any operation
wNumVideoAllocated: WORD; // Actual number of video buffers
wNumAudioAllocated: WORD; // Actual number of audio buffers
end;
PCaptureParms = ^TCaptureParms;
TCaptureParms = record // Default values in parenthesis
dwRequestMicroSecPerFrame: DWORD; // Requested capture rate
fMakeUserHitOKToCapture: BOOL; // Show "Hit OK to cap" dlg?
wPercentDropForError: WORD; // Give error msg if > (10%)
fYield: BOOL; // Capture via background task?
dwIndexSize: DWORD; // Max index size in frames (32K)
wChunkGranularity: WORD; // Junk chunk granularity (2K)
fUsingDOSMemory: BOOL; // Use DOS buffers?
wNumVideoRequested: WORD; // # video buffers, If 0, autocalc
fCaptureAudio: BOOL; // Capture audio?
wNumAudioRequested: WORD; // # audio buffers, If 0, autocalc
vKeyAbort: WORD; // Virtual key causing abort
fAbortLeftMouse: BOOL; // Abort on left mouse?
fAbortRightMouse: BOOL; // Abort on right mouse?
fLimitEnabled: BOOL; // Use wTimeLimit?
wTimeLimit: WORD; // Seconds to capture
fMCIControl: BOOL; // Use MCI video source?
fStepMCIDevice: BOOL; // Step MCI device?
dwMCIStartTime: DWORD; // Time to start in MS
dwMCIStopTime: DWORD; // Time to stop in MS
fStepCaptureAt2x: BOOL; // Perform spatial averaging 2x
wStepCaptureAverageFrames: WORD; // Temporal average n Frames
dwAudioBufferSize: DWORD; // Size of audio bufs (0 = default)
fDisableWriteCache: BOOL; // Attempt to disable write cache
AVStreamMaster: WORD; // Indicates whether the audio stream
// controls the clock when writing an AVI file.
end;
PCapInfoChunk = ^TCapInfoChunk;
TCapInfoChunk = record
fccInfoID: FOURCC; // Chunk ID, "ICOP" for copyright
lpData: LongInt; // pointer to data
cbData: LongInt; // size of lpData
end;
// ------------------------------------------------------------------
// Callback Definitions
// ------------------------------------------------------------------
type
TCAPSTATUSCALLBACK = function(hWnd: HWND; nID: Integer; lpsz: LongInt): LongInt; stdcall;
TCAPYIELDCALLBACK = function(hWnd: HWND): LongInt; stdcall;
TCAPERRORCALLBACK = function(hWnd: HWND; nID: Integer; lpsz: LongInt): LongInt; stdcall;
TCAPVIDEOCALLBACK = function(hWnd: HWND; lpVHdr: LongInt): LongInt; stdcall;
TCAPWAVECALLBACK = function(hWnd: HWND; lpWHdr: LongInt): LongInt; stdcall;
TCAPCONTROLCALLBACK = function(hWnd: HWND; nState: Integer): LongInt; stdcall;
// ------------------------------------------------------------------
// CapControlCallback states
// ------------------------------------------------------------------
const
CONTROLCALLBACK_PREROLL = 1; // Waiting to start capture
CONTROLCALLBACK_CAPTURING = 2; // Now capturing
// ------------------------------------------------------------------
// The only exported functions from AVICAP.DLL
// ------------------------------------------------------------------
var
capCreateCaptureWindow: function(
lpszWindowName: PChar;
dwStyle: DWord;
x, y: Integer;
nWidth, nHeight: Integer;
hwndParent: THandle;
nID: Integer): THandle; stdcall;
capGetDriverDescription: function(
wDriverIndex: DWord;
lpszName: PChar;
cbName: Integer;
lpszVer: PChar;
cbVer: Integer): Boolean; stdcall;
// ------------------------------------------------------------------
// New Information chunk IDs
// ------------------------------------------------------------------
(*
infotypeDIGITIZATION_TIME = mmioStringToFOURCC(PChar('IDIT'), MMIO_TOUPPER);
infotypeSMPTE_TIME = mmioStringToFOURCC(PChar('ISMP'), MMIO_TOUPPER);
*)
// ------------------------------------------------------------------
// String IDs from status and error callbacks
// ------------------------------------------------------------------
const
IDS_CAP_BEGIN = 300; (* "Capture Start" *)
IDS_CAP_END = 301; (* "Capture End" *)
IDS_CAP_INFO = 401; (* "%s" *)
IDS_CAP_OUTOFMEM = 402; (* "Out of memory" *)
IDS_CAP_FILEEXISTS = 403; (* "File '%s' exists -- overwrite it?" *)
IDS_CAP_ERRORPALOPEN = 404; (* "Error opening palette '%s'" *)
IDS_CAP_ERRORPALSAVE = 405; (* "Error saving palette '%s'" *)
IDS_CAP_ERRORDIBSAVE = 406; (* "Error saving frame '%s'" *)
IDS_CAP_DEFAVIEXT = 407; (* "avi" *)
IDS_CAP_DEFPALEXT = 408; (* "pal" *)
IDS_CAP_CANTOPEN = 409; (* "Cannot open '%s'" *)
IDS_CAP_SEQ_MSGSTART = 410; (* "Select OK to start capture\nof video sequence\nto %s." *)
IDS_CAP_SEQ_MSGSTOP = 411; (* "Hit ESCAPE or click to end capture" *)
IDS_CAP_VIDEDITERR = 412; (* "An error occurred while trying to run VidEdit." *)
IDS_CAP_READONLYFILE = 413; (* "The file '%s' is a read-only file." *)
IDS_CAP_WRITEERROR = 414; (* "Unable to write to file '%s'.\nDisk may be full." *)
IDS_CAP_NODISKSPACE = 415; (* "There is no space to create a capture file on the specified device." *)
IDS_CAP_SETFILESIZE = 416; (* "Set File Size" *)
IDS_CAP_SAVEASPERCENT = 417; (* "SaveAs: %2ld%% Hit Escape to abort." *)
IDS_CAP_DRIVER_ERROR = 418; (* Driver specific error message *)
IDS_CAP_WAVE_OPEN_ERROR = 419; (* "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." *)
IDS_CAP_WAVE_ALLOC_ERROR = 420; (* "Error: Out of memory for wave buffers." *)
IDS_CAP_WAVE_PREPARE_ERROR = 421; (* "Error: Cannot prepare wave buffers." *)
IDS_CAP_WAVE_ADD_ERROR = 422; (* "Error: Cannot add wave buffers." *)
IDS_CAP_WAVE_SIZE_ERROR = 423; (* "Error: Bad wave size." *)
IDS_CAP_VIDEO_OPEN_ERROR = 424; (* "Error: Cannot open the video input device." *)
IDS_CAP_VIDEO_ALLOC_ERROR = 425; (* "Error: Out of memory for video buffers." *)
IDS_CAP_VIDEO_PREPARE_ERROR = 426; (* "Error: Cannot prepare video buffers." *)
IDS_CAP_VIDEO_ADD_ERROR = 427; (* "Error: Cannot add video buffers." *)
IDS_CAP_VIDEO_SIZE_ERROR = 428; (* "Error: Bad video size." *)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -