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;