AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DSPack::spielt einmal->danach nicht mehr
Thema durchsuchen
Ansicht
Themen-Optionen

DSPack::spielt einmal->danach nicht mehr

Ein Thema von Nils_13 · begonnen am 25. Sep 2006 · letzter Beitrag vom 29. Aug 2007
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 07:47
Hi,

wie der Cpp-Titel schon sagt, spielt mir das DSPack ein Video einmal ab und danach nicht mehr:
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;
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:
Delphi-Quellcode:
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin
  FilterGraph.ClearGraph;
  FilterGraph.Free;
  VideoWindow.Free;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 08:02
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:
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin
  FilterGraph.ClearGraph;
  FilterGraph.Free;
  VideoWindow.Free;
end;
muß im klickverhalten von deiner Playliste stehen.
Vergleichen mit if not FilterGraph.Active then : Else Obige zeilen ausführen.

Gruß
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 08:16
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:
with frmVideo do
begin
  if Filtergraph.Active then
  begin
    FilterGraph.ClearGraph;
    FilterGraph.Free;
    VideoWindow.Free;
  end;
end;
vor den Abspielcode setze, wird eine AV bei der markierten Zeile hervorgerufen:
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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 08:58
Zitat von Nils_13:
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:
with frmVideo do
begin
  if Filtergraph.Active then
  begin
    FilterGraph.ClearGraph;
    FilterGraph.Free;
    VideoWindow.Free;
  end;
end;
vor den Abspielcode setze, wird eine AV bei der markierten Zeile hervorgerufen:
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;
Nee hast mich falsch verstanden!
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ß
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#5

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 09:31
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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 09:39
Zitat von Nils_13:
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;
JA !
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:
      if not FilterGraph.Active then
        FilterGraph.Active := true;
      FilterGraph.Stop;
      FilterGraph.ClearGraph;
      FilterGraph.RenderFile(fFiles[playindex].pfad);
      FilterGraph.play;
      pause := True;
Der FilterGraph.ClearGraph; muß nicht nochmal gelöscht werden!
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:
  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;
end;

gruß
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#7

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 09:46
Es funktioniert jetzt zwar allgemein, aber MouseUp kann ich wegen Drag&Drop der ListBox nicht verwenden. Was könnte ich anstelle von MouseUp nehmen ?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 09:50
Zitat von Nils_13:
Es funktioniert jetzt zwar allgemein, aber MouseUp kann ich wegen Drag&Drop der ListBox nicht verwenden. Was könnte ich anstelle von MouseUp nehmen ?
Du kannst eine eigene Funktion erstellen.
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ß
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#9

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 10:06
Delphi-Quellcode:
procedure TfrmMain.lbListDblClick(Sender: TObject);
begin
  xiPlayClick(Sender);
end;
In xiPlay.Click werden die Endungen geprüft: Wenn Video dann öffne Videofenster, geb Filtergraph frei, lade das neue Video und spiel es ab.

Mit MouseUp komm ich da nicht weiter.

frmVideo:
Delphi-Quellcode:
procedure TfrmVideo.FormDestroy(Sender: TObject);
begin
  FilterGraph.ClearGraph;
  FilterGraph.Free;
  VideoWindow.Free;
  frmMain.FGC := True;
end;
frmMain:
Delphi-Quellcode:
procedure TfrmMain.xiPlayClick(Sender: TObject);
var s : String;
begin
  if (lbList.ItemIndex >= 0) then
  begin
    playindex := lbList.ItemIndex;
    if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mp3then
    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)) = '.wmvthen
    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)) = '.mpegthen
    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.
Das ist der Ursprungscode.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: DSPack::spielt einmal->danach nicht mehr

  Alt 25. Sep 2006, 10:34
Lieber Nils

Ich sagte es ja schon.
Was mir auffällt ist das du alles doppelt machst.
Ich frage mich warum ?

Delphi-Quellcode:
    if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wmvthen
    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 not FilterGraph.Active then wird zweimal in der gleichen abfrage aufgerufen
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:
    if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wmvthen
    begin
      xiStopClick(Sender);
      CheckPlayState
    end;
procedure CheckPlayState()

//hier deine ganze abfrage vom aktuellen Spielstatus einfügen.

end;


Das gleiche bei

Delphi-Quellcode:
    if LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mpegthen
    begin
        xiStopClick(Sender);
        CheckPlayState
      end;
    end;
Du mußt dann die abfrage nur einmal schreiben und nicht bei jeden Dateityp doppelt.
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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz