Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Storing / Playing an AVI file in a database

01.01.2007

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;