![]() |
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. |
Eine Antwort auf deine Frage weiß ich auch nicht, aber wo landet deine AVI-Datei?
Delphi-Quellcode:
das sie von deinem Programm gefunden wird, wenn es sie braucht dürfte Zufall sein.
const Filename='~temp.avi';
|
Sie landet im dem Verzeichnis wo sich deine exe befindet
|
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.
|
danke!
vielleicht kannst du mir ein beispiel zeigen so ? extractfilepath(application.exename) |
Zum Beispiel und dann hängst du noch deinen Dateinamen dran.
|
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 ;-) ) |
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? |
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} |
Zitat:
|
Auch ".\datei.end" liefert das aktuelle Verzeichnis und nicht unbedingt das Programmverzeichnis.
|
:shock: hab ich bis jetzt immer so benutzt...
|
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. |
ähm um eigendlich auf meine frage zurück zu kommen weiß denn nun einer was ,wie man eine loop funktion codet?? :mrgreen:
|
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." |
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. |
Zitat:
|
:? help!
|
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...
|
ja danke aber das ist nicht das wo nach ich suche
|
Was willst du dann?
|
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