Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Avi aus Resource laden und abspielen (https://www.delphipraxis.net/2689-avi-aus-resource-laden-und-abspielen.html)

City Light 2. Feb 2003 19:14


Avi aus Resource laden und abspielen
 
Hallo ich habe mal ein bisschen was gebastelt

meine frage bezieht sich auf diesem Code.
Kann mir einer sagen wie ich eine loop oder Replay funktion für die Avi bekomme so das ,daß Video immer als schleife abspielt.

das in die RC Datei schreiben
A1 AVI Film.avi

Datei speichern als Film.rc und so kompilieren
brcc32 Film.rc

Film.Res in Programm einbinden mit
{$R Film.res}


Delphi-Quellcode:
uses
    MMSystem;

  public
    { public-Deklarationen }
    procedure MMNotify(var message: TMessage); message MM_MCINOTIFY;
  end;


implementation
const Filename='~temp.avi';

{$R *.dfm}
{$R Film.res}

procedure TForm1.MMNotify(var message: TMessage);
begin
  MCISendString('close film', nil, 0, 0);
end;

{$WARNINGS OFF}
procedure Temp;
var
  rs: TCustomMemoryStream;
  s : string;
begin
  s := 'A1'; {Name der Resource}
  try
    rs := TResourceStream.Create(hInstance, s, 'AVI');
    rs.SavetoFile(Filename);
  finally
    rs.Free;
  end;
end;
{$WARNINGS ON}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Temp();
  MCISendString(PChar('Play '+ filename), nil, 0, 0);
  {
  Oder auch im Vollbild:
  MCISendString(PChar('open '+ filename +' alias film'), nil, 0, 0);
  MCISendString('window film handle 0', nil, 0, 0);
  MCISendString('window film state show maximized', nil, 0, 0);
  MCISendString('play film notify', nil, 0, Form1.Handle);
  }
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if fileexists(filename) then
  deletefile(filename); // ~temp.avi' löschen;
end;

end.

Luckie 2. Feb 2003 20:03

Eine Antwort auf deine Frage weiß ich auch nicht, aber wo landet deine AVI-Datei?
Delphi-Quellcode:
const Filename='~temp.avi';
das sie von deinem Programm gefunden wird, wenn es sie braucht dürfte Zufall sein.

City Light 2. Feb 2003 20:16

Sie landet im dem Verzeichnis wo sich deine exe befindet

Luckie 2. Feb 2003 20:21

Wo steht das? Sie wird in das aktuelle Verzeichnis entpackt. Das muß aber nicht das Exe-Verzeichnis sein. Gib bei einer Verknüpfung ein anderes Arbeitsverzeichnis an und Peng. Genauso sieht es aus, wenn man innerhalb der Anwendung das Verzeichnis gewechselt wird.

City Light 2. Feb 2003 20:41

danke!

vielleicht kannst du mir ein beispiel zeigen

so ?
extractfilepath(application.exename)

Luckie 2. Feb 2003 20:44

Zum Beispiel und dann hängst du noch deinen Dateinamen dran.

Christian Seehase 2. Feb 2003 20:45

Moin Tino,

grundsätzlich: Ja.

Ich persönlich ziehe folgende Variante vor:

ExtractFilePath(paramstr(0))

Da paramstr(0) und Application.Exename den gleichen Wert zurückliefern, würde zwar das gleiche dabei herauskommen, aber dafür funktioniert paramstr(0) auch ohne unit Forms, was sich bei Konsolenanwendungen als recht hilfreich erweisen kann (@Luckie: und natürlich auch bei nonVCL ;-) )

nailor 2. Feb 2003 20:48

Wenn mich nicht alles täuscht, ist '.\' doch das .exe-Verzeichnis, und nicht der aktuelle Ordner. d.h. mach aus

'~temp.avi' -> '.\~temp.avi'

und es ist eindeutig, oder nicht?

City Light 2. Feb 2003 20:48

danke Christian
ich hab mal das so gemacht

Delphi-Quellcode:
{$WARNINGS OFF}
procedure TForm1.Temp;
var
  rs: TCustomMemoryStream;
  s : string;
begin
  s := 'A1'; {Name der Resource}
  try
    rs := TResourceStream.Create(hInstance, s, 'AVI');
    rs.SavetoFile(ExtractFilePath(paramstr(0))+Filename);
  Finally
    rs.Free;
  end;
end;
{$WARNINGS ON}

City Light 2. Feb 2003 20:52

Zitat:

Zitat von Nailor
Wenn mich nicht alles täuscht, ist '.\' doch das .exe-Verzeichnis, und nicht der aktuelle Ordner. d.h. mach aus

'~temp.avi' -> '.\~temp.avi'

und es ist eindeutig, oder nicht?

hmmm...denke ich auch Nailor!!!

Luckie 2. Feb 2003 20:54

Auch ".\datei.end" liefert das aktuelle Verzeichnis und nicht unbedingt das Programmverzeichnis.

nailor 2. Feb 2003 20:57

:shock: hab ich bis jetzt immer so benutzt...

Christian Seehase 2. Feb 2003 20:59

Moin Tino,

ja, sollte so gehen.

Ich würde übrigens bei der Vergabe von Variablen-/Konstantennamen immer einen Präfix davorsetzen, um welchen Typ es sich handelt.
Filename wird z.b. als Eigenschaft von TOpenDialog/TSaveDialog verwendet, und durch den Präfix vermeidet man Kollisionen mit solchen Namen. Das unangenehme kann nämlich sein, dass das Programm plötzlich unerwartet reagiert, weil eine solche Kollision auftritt, und das womöglich noch ohne Exception.

Da . das aktuelle Verzeichnis angibt müsste .\ dieses auch noch sein, und unter aktuell versteht Windows das aktuelle Arbeitsverzeichnis.
Also sollte .\~temp.avi = ~temp.avi sein.

Man kann sich auch von Windows temporäre Dateinamen generieren lassen (GetTempFileName) dann vermeidet man Probleme mit eventuell schon vorhandenen Dateien.

City Light 2. Feb 2003 21:01

ähm um eigendlich auf meine frage zurück zu kommen weiß denn nun einer was ,wie man eine loop funktion codet?? :mrgreen:

nailor 2. Feb 2003 21:03

Zitat:

Zitat von Christian Seehase
Da . das aktuelle Verzeichnis angibt müsste .\ dieses auch noch sein, und unter aktuell versteht Windows das aktuelle Arbeitsverzeichnis.
Also sollte .\~temp.avi = ~temp.avi sein.

Im jungfräulichen Programmzustand, ja. Aber wie siehts aus, wenn man SetCurrentDir('..\'); einmal vorher anwendet. Stimmt es dann immer noch?

nailor 2. Feb 2003 21:07

Du willst eine avi als Schleife abspielen? Setzt Repetitions auf 0.

"Set Repetitions to 0 to indicate that the sequence of frames should repeat indefinitely."

Luckie 2. Feb 2003 21:11

Eben. Davon reden wir die ganze Zeit, dass es nach so einer Aktion nicht mehr das Anwendungsverzeichnis ist. Und wenn ich in einer Verknüpfung ein anderes Arbeitsverzeichnis angebe, dann stimmt es schon direkt nach dem Programmstart nicht.

Deswegen soll man sich in de Pfad der Exe holen und die Datei darein stecken.

City Light 2. Feb 2003 21:12

Zitat:

Du willst eine avi als Schleife abspielen? Setzt Repetitions auf 0.

"Set Repetitions to 0 to indicate that the sequence of frames should repeat indefinitely."
hast du vielleicht ein beispiel für mich??

City Light 3. Feb 2003 19:04

:? help!

nailor 3. Feb 2003 19:29

Falls du das avi in einem TAnimate abspielst, einfach im Object Inspector den Wert Repetitions auf 0 stellen. (Ist eigentlich auch Standard) und es sollte loopen...

City Light 3. Feb 2003 20:13

ja danke aber das ist nicht das wo nach ich suche

nailor 3. Feb 2003 20:46

Was willst du dann?

City Light 4. Feb 2003 12:13

Ich suche eine lösung für meinen Code ,weil er im vollbild läuft. Und dazu breuchte ich jetzt nur eine loop funktion.

Gruß Tino


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz