![]() |
DSPack::spielt einmal->danach nicht mehr
Hi,
wie der Cpp-Titel schon sagt, spielt mir das DSPack ein Video einmal ab und danach nicht mehr:
Delphi-Quellcode:
Das heißt, ich spiele Video1 aus der Playlist ab und klicke doppelt, entweder während Video1 noch abgespielt wird, oder wenn es gestoppt wurde, auf das Video2, womit der oben gezeigte Code aufgerufen wird. Plötzlich sehe ich nur noch ein schwarzes DSVideoWindowEx2 auf der Videoform. Ab dem ersten Abspielen von einem beliebigen Video, kann ich keine anderen mehr abspielen. Eventuell liegt es auch an der Videoform:
frmVideo.Show;
with frmVideo do begin if not FilterGraph.Active then begin if not FilterGraph.Active then FilterGraph.Active := true; FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end;
Delphi-Quellcode:
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin FilterGraph.ClearGraph; FilterGraph.Free; VideoWindow.Free; end; |
Re: DSPack::spielt einmal->danach nicht mehr
Ich denk mal das du den Filtergraph auch beenden (freigeben)
mußt wenn du einen doppelklick auf die Liste ausführst. Ich kann aus deine schnipsel nicht entnehmen das dies geschieht.
Delphi-Quellcode:
muß im klickverhalten von deiner Playliste stehen.
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin FilterGraph.ClearGraph; FilterGraph.Free; VideoWindow.Free; end; Vergleichen mit if not FilterGraph.Active then : Else Obige zeilen ausführen. Gruß |
Re: DSPack::spielt einmal->danach nicht mehr
1. Das MUSS in OnDestroy trotzdem stehen, da ich sonst eine AV beim Beenden des Programms bekomme.
2. Wo soll dann der Freigabecode in Doppelklick hin ? Wenn ich noch
Delphi-Quellcode:
vor den Abspielcode setze, wird eine AV bei der markierten Zeile hervorgerufen:
with frmVideo do
begin if Filtergraph.Active then begin FilterGraph.ClearGraph; FilterGraph.Free; VideoWindow.Free; end; end;
Delphi-Quellcode:
frmVideo.Show;
with frmVideo do begin if not FilterGraph.Active then begin --> if not FilterGraph.Active then <-- FilterGraph.Active := true; FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end; |
Re: DSPack::spielt einmal->danach nicht mehr
Zitat:
Ein AV bekommst du deshalb weil du den FilterGraph neu initialisierst und er noch nicht freigegeben ist Bei jeden Film wird eine neue Instanz von FilterGraph gebildet was bedeutet wird diese nicht vorher beendet bekommst du einen AV. Du kannst if not FilterGraph.Active nicht aufrufen wenn du einen doppelklick auf die Liste machst FilterGraph dürfte dann schon nicht mehr existieren. Mache doch eine Public oder Globale Variable welche dir ermöglicht den status unabhängig von FilterGraph zu überprüfen. Beispiel: ISVIdeoPlaying : Boolean; Das einfügen nachdem ein Video spielt logischer weise auf True setzen Wenn du nun auf die Liste klickst dieses Variable abfragen Wenn True dann FilterGraph beenden, neu initialisieren und fertig. PS: Am besten nicht im Doppelklick event sondern im Mouseup Event Die Liste darf nicht mehr den Focus habe wenn du FilterGraph neu initialisierst. Und noch was FilterGraph.Free; muss immer ausgeführt werden bevor du ein neues Video abspielst. VideoWindow.Free; nicht unbedingt .. wenn du es mit einer PIcBox(Canvas) verbunden hast. Aber auf jedenfall wenn du dein Projekt beendest. Gruß |
Re: DSPack::spielt einmal->danach nicht mehr
Meinst du das so ?
Delphi-Quellcode:
procedure TfrmMain.lbListMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if FGC= True then begin with frmVideo do begin if Filtergraph.Active then begin FilterGraph.Active := False; FilterGraph.ClearGraph; FilterGraph.Free; FGC := False end; end; end else begin with frmVideo do begin if not FilterGraph.Active then FilterGraph.Active := true; FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end; end; |
Re: DSPack::spielt einmal->danach nicht mehr
Zitat:
Nur die abfrage 'if Filtergraph.Active then' benötigst du nicht mehr das erledigt FGC nun an der stelle Auch die anderen wie FilterGraph.Active := False; nicht. All das erledigt nun die neue Variable unabhängig vom FilterGraph Beim neustart bracuhst du auch die anderen sachen nicht.
Delphi-Quellcode:
Der FilterGraph.ClearGraph; muß nicht nochmal gelöscht werden!
if not FilterGraph.Active then
FilterGraph.Active := true; FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; Das geschieht bereits in der obigen abfrage. FilterGraph.Stop; brauchst du auch nicht. nur diese beiden FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; etwa so ! Habe aber jetzt nicht auf die IF abfragen geachtet.
Delphi-Quellcode:
end;
if FGC= True then
begin with frmVideo do begin FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.Free; FGC := False end; end else begin with frmVideo do begin FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; FGC= True pause := True; end; gruß |
Re: DSPack::spielt einmal->danach nicht mehr
Es funktioniert jetzt zwar allgemein, aber MouseUp kann ich wegen Drag&Drop der ListBox nicht verwenden. Was könnte ich anstelle von MouseUp nehmen ?
|
Re: DSPack::spielt einmal->danach nicht mehr
Zitat:
Beispiel: Procedure CeckState(); Hier dein Code If FC True xxx.... end; diese im Mouseup Events aufrufen. Die ganze schleife also da rein. PS: Du muß im Mouseup event eine abfrage einfügen welche dir mitteilt ob ein doppelklick event ausgeführt wurde. Nur dann in Checkstate reinspringen. gruß |
Re: DSPack::spielt einmal->danach nicht mehr
Delphi-Quellcode:
In xiPlay.Click werden die Endungen geprüft: Wenn Video dann öffne Videofenster, geb Filtergraph frei, lade das neue Video und spiel es ab.
procedure TfrmMain.lbListDblClick(Sender: TObject);
begin xiPlayClick(Sender); end; Mit MouseUp komm ich da nicht weiter. frmVideo:
Delphi-Quellcode:
frmMain:
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin FilterGraph.ClearGraph; FilterGraph.Free; VideoWindow.Free; frmMain.FGC := True; end;
Delphi-Quellcode:
Das ist der Ursprungscode.
procedure TfrmMain.xiPlayClick(Sender: TObject);
var s : String; begin if (lbList.ItemIndex >= 0) then begin playindex := lbList.ItemIndex; if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mp3' then begin PlayFile(playindex); with fFiles[playindex] do begin s := Artist + ' - ' + Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']'; lLauftext.Text := s; lLauftext.Active := True; lLauftext.Transparent := True; Application.Title := s; end; pindex := playindex; pause := True; end; if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wmv' then begin frmVideo.Show; xiStopClick(Sender); with frmVideo do begin if not FilterGraph.Active then begin if not FilterGraph.Active then FilterGraph.Active := True; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end; end; if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mpeg' then begin frmVideo.Show; with frmVideo do begin if not FilterGraph.Active then begin if not FilterGraph.Active then FilterGraph.Active := true; FilterGraph.Stop; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end; end; usw. |
Re: DSPack::spielt einmal->danach nicht mehr
Lieber Nils
Ich sagte es ja schon. Was mir auffällt ist das du alles doppelt machst. Ich frage mich warum ?
Delphi-Quellcode:
if not FilterGraph.Active then wird zweimal in der gleichen abfrage aufgerufen
if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wmv' then
begin frmVideo.Show; xiStopClick(Sender); with frmVideo do begin if not FilterGraph.Active then begin if not FilterGraph.Active then FilterGraph.Active := True; FilterGraph.ClearGraph; FilterGraph.RenderFile(fFiles[playindex].pfad); FilterGraph.play; pause := True; end; end; end; das muss nicht sein. Dann kannst du dir viel ärger ersparen wenn du die abfragen Play/Stop auslagerst in eine eigens dafür erstellte Function. Und die aufrufst wenn du ein anderes Video startest. Ich würde im click verhalten nur das Format abfragen also *-wmv/*-avi oder was auch immer
Delphi-Quellcode:
procedure CheckPlayState()
if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wmv' then
begin xiStopClick(Sender); CheckPlayState end; //hier deine ganze abfrage vom aktuellen Spielstatus einfügen. end; Das gleiche bei
Delphi-Quellcode:
Du mußt dann die abfrage nur einmal schreiben und nicht bei jeden Dateityp doppelt.
if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mpeg' then
begin xiStopClick(Sender); CheckPlayState end; end; frmVideo.Show; direkt in der ersten zeile des click events PS: Da fällt mir noch was auf zwei die gleichen abfragen nur wegen verschiedene Formate das geht besser. Feste Variable anlegen 'VideoTypen' VideoTypen := '.mpeg;.wmv' Dann kannst du beide Typen mit der Variable VideoTypen abfragen und mußt nicht alles doppelt machen. gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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