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