AVI文件格式    AVI(Audio/Video Interleaved)文件是MS-Windows的视频文件,其文件扩展名为“.AVI”。它一般由三部分构成:信息区、数据区和索引区(可缺省),即两个LIST快和一个idx1块。这些区域,通常由一些子块组成,它们多用于为播放软件提供更为系统的数据信息;或为播放时进行快速数据定位及播放,并提供详细资料和识别手段(关于“区域”与“子块”具体包容关系请见图6)。
说明:本例由“四部分”构成,即在两个LIST块中间夹了个JUNK块。这个JUNK块纯属人为添加的自定义块,即在AVI文件中从未有对此块的定义。换句话说,我们也可以添加自己的决,只要遵循如下原则:在这三个标准块其中的某个后面,定义一个四字节的块识别码(不要与本文用到的识别码相同,最好字母用大写),紧跟一个长整数来表示你自定义的块的大小,随后便可以在定义的大小范围内写入你想表述的信息。同样,在这三个标准块的内部,也可以用上述方法添加自定义干块。
注:下文的说明内容部分取自华中理工大学出版的<<MS-WINDOWS多媒体程序设计实物与范例>>一文和<<VIDEO FOR WINDOWS DEVRLOPMENT KIT V1.1>>的HELP文件。
以下就是作为例子的文件内容(数据D)及AVI文件标准结构图。
  1.从(00000000-000007F3)为一个WindowsAVI文件的信息区部分。
它是文件的第一个LIST块。在它的内部记录着整个文件的系统构成,如告诉播放软件“我是一个AVI文件”;“在我的体内有几个数据流”;“每个数据流包含着什么数据类型——图像、声音或其他”;“如果是图像数据流,那么它的大小、颜色、压缩方式、播放速度等,等是怎样规定的”;“如果是声音数据流,那么它的压缩方式、播放效果等等又将有何规定”......在信息区中还有多个附属的LIST块,也就是我们前面提到的“子块”,它们用来记录每个数据流的全部信息。而这些附间LIST块与数据流之间保持着—一对应的关系,即
第一个附属LIST块对应于00号数据流;第二个附属LIST块对应于01号数据流......要想解释数据流,我们必须先了解AVI文件中数据块是什么。在AVI文件中,数据块是被放置在数据区中的一个有起始标志(由“数据流识别码”和“数据块存储方式识别码"组成,请参见对数据区部分的说明),并指明大小和数据内容的数据段.那么,数据流就是那些相互之间具有联系的同种数据类型的数据块集合.00000000-00000003 多媒体文件识别码:RIFF
00000004-00000007 文件大小(10EDICh字节)-8字节
00000008-0000000B AVI文件识别码
0000000C-0000000F 第一个LIST块识别码
00000010-00000013 第一个LIST块的大小(168h字节)
00000014-00000017 hdrl部分识别码,以下数据记录着此文件的格式
00000018-0000001B hdrl部分所包含的avih块识别码,此模块记录着本文件的初始化信息
0000001C-0000001F avih块大小(38h字节)
00000020-00000023 每帧画面显示所维持多少个百万分之一秒,本例为1046Bh,即66667百万分之一秒,约0.07秒。所以在播放此文件时,你看到的画面约每秒15帧
要的是这个么?

解决方案 »

  1.   

    生成avi保存:unit Unit1; interface uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
    Dialogs, ExtCtrls, StdCtrls; type 
    TForm1 = class(TForm) 
    Panel1: TPanel; 
    OpenVideo: TButton; 
    CloseVideo: TButton; 
    GrabFrame: TButton; 
    SaveBMP: TButton; 
    StartAVI: TButton; 
    StopAVI: TButton; 
    SaveDialog1: TSaveDialog; 
    procedure FormCreate(Sender: TObject); 
    procedure OpenVideoClick(Sender: TObject); 
    procedure CloseVideoClick(Sender: TObject); 
    procedure GrabFrameClick(Sender: TObject); 
    procedure SaveBMPClick(Sender: TObject); 
    procedure StartAVIClick(Sender: TObject); 
    procedure StopAVIClick(Sender: TObject); 
    private 
    { Private declarations } 
    hWndC : THandle; 
    CapturingAVI : bool; 
    public 
    { Public declarations } 
    end; var 
    Form1: TForm1; implementation {$R *.DFM} const WM_CAP_START = WM_USER; 
    const WM_CAP_STOP = WM_CAP_START + 68; 
    const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; 
    const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; 
    const WM_CAP_SAVEDIB = WM_CAP_START + 25; 
    const WM_CAP_GRAB_FRAME = WM_CAP_START + 60; 
    const WM_CAP_SEQUENCE = WM_CAP_START + 62; 
    const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20; function capCreateCaptureWindowA(lpszWindowName : PCHAR; 
    dwStyle : longint; 
    x : integer; 
    y : integer; 
    nWidth : integer; 
    nHeight : integer; 
    ParentWin : HWND; 
    nId : integer): HWND; 
    STDCALL EXTERNAL 'AVICAP32.DLL'; procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    CapturingAVI := false; 
    hWndC := 0; 
    SaveDialog1.Options := 
    [ofHideReadOnly, ofNoChangeDir, ofPathMustExist] 
    end; procedure TForm1.OpenVideoClick(Sender: TObject); 
    begin 
    hWndC := capCreateCaptureWindowA('My Own Capture Window', 
    WS_CHILD or WS_VISIBLE , 
    Panel1.Left, 
    Panel1.Top, 
    Panel1.Width, 
    Panel1.Height, 
    Form1.Handle, 
    0); 
    if hWndC <> 0 then 
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); 
    end; procedure TForm1.CloseVideoClick(Sender: TObject); 
    begin 
    if hWndC <> 0 then begin 
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); 
    hWndC := 0; 
    end; 
    end; procedure TForm1.GrabFrameClick(Sender: TObject); 
    begin 
    if hWndC <> 0 then 
    SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); 
    end; procedure TForm1.SaveBMPClick(Sender: TObject); 
    begin 
    if hWndC <> 0 then begin 
    SaveDialog1.DefaultExt := 'bmp'; 
    SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp'; 
    if SaveDialog1.Execute then 
    SendMessage(hWndC, 
    WM_CAP_SAVEDIB, 
    0, 
    longint(pchar(SaveDialog1.FileName))); 
    end; 
    end; procedure TForm1.StartAVIClick(Sender: TObject); 
    begin 
    if hWndC <> 0 then begin 
    SaveDialog1.DefaultExt := 'avi'; 
    SaveDialog1.Filter := 'AVI files (*.avi)|*.avi'; 
    if SaveDialog1.Execute then begin 
    CapturingAVI := true; 
    SendMessage(hWndC, 
    WM_CAP_FILE_SET_CAPTURE_FILEA, 
    0, 
    Longint(pchar(SaveDialog1.FileName))); 
    SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0); 
    end; 
    end; 
    end; procedure TForm1.StopAVIClick(Sender: TObject); 
    begin 
    if hWndC <> 0 then begin 
    SendMessage(hWndC, WM_CAP_STOP, 0, 0); 
    CapturingAVI := false; 
    end; 
    end; end.