Storing/Playing an .AVI file in a database

Материал из DRKB


How can I store an AVI file in a database and then play AVI files?

AVI files can be stored in BLOB (binary large object) fields. The easiest way to play an AVI file stored in a BLOB is to write the BLOB data to a temporary file, then let the mulimedia player play the file. The following example demonstrates how to store an AVI file to a BLOB field, and also play the AVI file from the BLOB field.


var
  FileName: string;

{ This function gets a temporary file name form the system }
function GetTemporaryFileName: string;
{$IFNDEF WIN32}
  const MAX_PATH = 144;
{$ENDIF}
var
 {$IFDEF WIN32}
  lpPathBuffer: PChar;
 {$ENDIF}
  lpBuffer: PChar;
begin
  { Get the file name buffer }
  GetMem(lpBuffer, MAX_PATH);
{$IFDEF WIN32}
  { Get the temp path buffer }
  GetMem(lpPathBuffer, MAX_PATH);
  { Get the temp path }
  GetTempPath(MAX_PATH, lpPathBuffer);
  { Get the temp file name }
  GetTempFileName(lpPathBuffer, 'tmp', 0, lpBuffer);
  { Free the temp path buffer }
  FreeMem(lpPathBuffer, MAX_PATH);
{$ELSE}
  { Get the temp file name }
  GetTempFileName(GetTempDrive('C'), 'tmp', 0, lpBuffer);
$ENDIF}
  { Create a pascal string containg the temp file name and return it }
  Result := StrPas(lpBuffer);
  { Free the file name buffer }
  FreeMem(lpBuffer, MAX_PATH);
end;

{ Read a AVI file into a blob field }
procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream: TFileStream; { to load the avi file }
  BlobStream: TBlobStream; { to save to the blob }
begin
  { Allow the button to repaint }
  Application.ProcessMessages;
  { Turn off the buttons }
  Button1.Enabled := False;
  Button2.Enabled := False;
  { Assign the avi file name to read }
  FileStream := TFileStream.Create(
    'C:\PROGRA~1\BORLAND\DELPHI~1\DEMOS\COOLSTUF\COOL.AVI',
    fmOpenRead);
  Table1.Edit;
  { Create a BlobStream for the TField Table1AVI }
  BlobStream := TBlobStream.Create(Table1AVI, bmReadWrite);
  { Seek to the Beginning of the stream }
  BlobStream.Seek(0, soFromBeginning);
  { Delete any data that may be there }
  BlobStream.Truncate;
  { Copy from the FileStream to the BlobStream }
  BlobStream.CopyFrom(FileStream, FileStream.Size);
  { Free the streams }
  FileStream.Free;
  BlobStream.Free;
  { Post the record }
  Table1.Post;
  { Enable the buttons }
  Button1.Enabled := True;
  Button2.Enabled := True;
end;

{ Read an avi stored in a blob, and play it }
procedure TForm1.Button2Click(Sender: TObject);
var
  FileStream: TFileStream; { a temp file }
  BlobStream: TBlobStream; { the AVI Blob }
begin
  { Create a blob stream for the AVI blob }
  BlobStream := TBlobStream.Create(Table1AVI, bmRead);
  if BlobStream.Size = 0 then
  begin
    BlobStream.Free;
    Exit;
  end;
  { Close the media player }
  MediaPlayer1.Close;
  { Reset the file name }
  MediaPlayer1.FileName := '';
  { Refresh the play window }
  MediaPlayer1.Display := Panel1;
  Panel1.Refresh;
  { if we have a temp file then erase it }
  if FileName  '' then
    DeleteFile(FileName);
  { Get a temp file name }
  FileName := GetTemporaryFileName;
  { Create a temp file stream }
  FileStream := TFileStream.Create(FileName, fmCreate or fmOpenWrite);
  { Copy the blob to the temp file }
  FileStream.CopyFrom(BlobStream, BlobStream.Size);
  { Free the streams }
  FileStream.Free;
  BlobStream.Free;
  { Setup the Media player to play the AVI file }
  MediaPlayer1.FileName := filename;
  MediaPlayer1.DeviceType := dtAviVideo;
  MediaPlayer1.Open;
  MediaPlayer1.Play;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  { Unassign the temp file from the media player }
  MediaPlayer1.Close;
  MediaPlayer1.FileName := '';
  { Erase the temp file }
  if FileName  '' then
    DeleteFile(FileName);
end;


ID: 03809