Fórum Tocar MP3 armazenado em uma Tabela. #149351
24/03/2003
0
Como posso tocar um arquivo .mp3 que esta armazenado em uma tabela,
ja tentei o codigo abaixo so que o MediaPlayer recebe um arquivo .tmp e não toca.
[color=blue:e6a766b9c3]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, ExtCtrls, MPlayer, DBCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Panel1: TPanel;
OpenDialog1: TOpenDialog;
Table1Codigo: TAutoIncField;
Table1Nome: TStringField;
Table1Avi: TBlobField;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
FileName : string;
MediaPlayer1 : TMediaPlayer;
implementation
{$R *.DFM}
{Esta função cria um arquivo temporário para o sistema}
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);
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;
{Grava AVI ou Wav no arquivo PARADOX}
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream; {para ler o arquivo avi}
BlobStream: TBlobStream; {para salvar no campo blob}
begin
Application.ProcessMessages;
Button1.Enabled := false;
Button2.Enabled := false;
if OpenDialog1.Execute then FileStream := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
Table1.Append;
Table1Nome.Value := OpenDialog1.FileName;
BlobStream := TBlobStream.Create(Table1AVI, bmReadWrite);
BlobStream.Seek(0, soFromBeginning);
BlobStream.Truncate;
BlobStream.CopyFrom(FileStream, FileStream.Size);
FileStream.Free;
BlobStream.Free;
Table1.Post;
Button1.Enabled := true;
Button2.Enabled := true;
end;
{Reproduz o que está gravado no campo Blob}
procedure TForm1.Button2Click(Sender: TObject);
var
FileStream: TFileStream; {a temp file}
BlobStream: TBlobStream; {the AVI Blob}
begin
BlobStream := TBlobStream.Create(Table1AVI, bmRead);
if BlobStream.Size = 0 then
begin
BlobStream.Free;
Exit;
end;
MediaPlayer1.Close; {Reset the file name}
MediaPlayer1.FileName := ´´; {Refresh the play window}
MediaPlayer1.Display := Panel1;
Panel1.Refresh;
if FileName <> ´´ then DeleteFile(FileName); {Get a temp file name}
FileName := GetTemporaryFileName; {Create a temp file stream}
FileStream := TFileStream.Create(FileName,fmCreate or fmOpenWrite);
FileStream.CopyFrom(BlobStream, BlobStream.Size); {Free the streams}
FileStream.Free; BlobStream.Free;
MediaPlayer1.FileName := filename;
MediaPlayer1.DeviceType := dtAviVideo;
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
// Evento OnDestroy do Form
procedure TForm1.FormDestroy(Sender: TObject);
begin
MediaPlayer1.Close;
MediaPlayer1.FileName := ´´;
if FileName <> ´´ then DeleteFile(FileName);
end;
// Evento OnShow do Form
procedure TForm1.FormShow(Sender: TObject);
begin
MediaPlayer1 := TMediaPlayer.Create(self);
with MediaPlayer1 do
begin
Parent := self ;
Visible := False;
end;
Table1.Open;
end;
// Evento OnClose do Form
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Table1.Close;
end;
end.[/color:e6a766b9c3]
ja tentei o codigo abaixo so que o MediaPlayer recebe um arquivo .tmp e não toca.
[color=blue:e6a766b9c3]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, ExtCtrls, MPlayer, DBCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Panel1: TPanel;
OpenDialog1: TOpenDialog;
Table1Codigo: TAutoIncField;
Table1Nome: TStringField;
Table1Avi: TBlobField;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
FileName : string;
MediaPlayer1 : TMediaPlayer;
implementation
{$R *.DFM}
{Esta função cria um arquivo temporário para o sistema}
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);
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;
{Grava AVI ou Wav no arquivo PARADOX}
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream; {para ler o arquivo avi}
BlobStream: TBlobStream; {para salvar no campo blob}
begin
Application.ProcessMessages;
Button1.Enabled := false;
Button2.Enabled := false;
if OpenDialog1.Execute then FileStream := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
Table1.Append;
Table1Nome.Value := OpenDialog1.FileName;
BlobStream := TBlobStream.Create(Table1AVI, bmReadWrite);
BlobStream.Seek(0, soFromBeginning);
BlobStream.Truncate;
BlobStream.CopyFrom(FileStream, FileStream.Size);
FileStream.Free;
BlobStream.Free;
Table1.Post;
Button1.Enabled := true;
Button2.Enabled := true;
end;
{Reproduz o que está gravado no campo Blob}
procedure TForm1.Button2Click(Sender: TObject);
var
FileStream: TFileStream; {a temp file}
BlobStream: TBlobStream; {the AVI Blob}
begin
BlobStream := TBlobStream.Create(Table1AVI, bmRead);
if BlobStream.Size = 0 then
begin
BlobStream.Free;
Exit;
end;
MediaPlayer1.Close; {Reset the file name}
MediaPlayer1.FileName := ´´; {Refresh the play window}
MediaPlayer1.Display := Panel1;
Panel1.Refresh;
if FileName <> ´´ then DeleteFile(FileName); {Get a temp file name}
FileName := GetTemporaryFileName; {Create a temp file stream}
FileStream := TFileStream.Create(FileName,fmCreate or fmOpenWrite);
FileStream.CopyFrom(BlobStream, BlobStream.Size); {Free the streams}
FileStream.Free; BlobStream.Free;
MediaPlayer1.FileName := filename;
MediaPlayer1.DeviceType := dtAviVideo;
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
// Evento OnDestroy do Form
procedure TForm1.FormDestroy(Sender: TObject);
begin
MediaPlayer1.Close;
MediaPlayer1.FileName := ´´;
if FileName <> ´´ then DeleteFile(FileName);
end;
// Evento OnShow do Form
procedure TForm1.FormShow(Sender: TObject);
begin
MediaPlayer1 := TMediaPlayer.Create(self);
with MediaPlayer1 do
begin
Parent := self ;
Visible := False;
end;
Table1.Open;
end;
// Evento OnClose do Form
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Table1.Close;
end;
end.[/color:e6a766b9c3]
Kanedasam
Curtir tópico
+ 0
Responder
Posts
25/03/2003
Anonymous
Olá, tudo bem?
Colega, pelo que entendi, você está alocando o arquivo mp3 na sua tabela como se o mesmo fosse um texto, certo?
Se for isso é interessante você ter certeza de que esse processo não está corrompendo seu arquivo mp3 ou wav, se até aí você já havia observado, pode ser que o problema ocorra na identificação do tipo de midia que será tocada pelo mediaplayer, que se não me engano é realizada extensão do arquivo descrito em filename. Assim sendo, em vez de atribuir uma extensão tmp, coloque mp3 mesmo e faça um teste.
Mas só para comentar, se eu fosse você em vez de armazenar o mp3 dentro da sua tabela, oque vai deixar seu programa bastante lento, eu colocaria o Path do arquivo, e me certificaria de que ele sempre estaria lá, como em uma sub-pasta do seu programa tipo (C:\Prog\Efeitos\Arq.mp3).
Certo? Té Mais.
Colega, pelo que entendi, você está alocando o arquivo mp3 na sua tabela como se o mesmo fosse um texto, certo?
Se for isso é interessante você ter certeza de que esse processo não está corrompendo seu arquivo mp3 ou wav, se até aí você já havia observado, pode ser que o problema ocorra na identificação do tipo de midia que será tocada pelo mediaplayer, que se não me engano é realizada extensão do arquivo descrito em filename. Assim sendo, em vez de atribuir uma extensão tmp, coloque mp3 mesmo e faça um teste.
Mas só para comentar, se eu fosse você em vez de armazenar o mp3 dentro da sua tabela, oque vai deixar seu programa bastante lento, eu colocaria o Path do arquivo, e me certificaria de que ele sempre estaria lá, como em uma sub-pasta do seu programa tipo (C:\Prog\Efeitos\Arq.mp3).
Certo? Té Mais.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)