Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Überprüfen, ob nächste Datei Audio/Video ist und abspielen (https://www.delphipraxis.net/78244-ueberpruefen-ob-naechste-datei-audio-video-ist-und-abspielen.html)

Nils_13 1. Okt 2006 18:08


Überprüfen, ob nächste Datei Audio/Video ist und abspielen
 
Hi,

ich möchte überprüfen, ob die nächste Datei der Playlist eine Video oder Audiodatei ist und entsprechend abspielen. Was muss ich bei folgendem Code ändern, damit es funktioniert (der Übergang zwischen Audio und Video funktioniert nicht, es liegt an den markierten Zeile, aber ich weiß nicht, wie ich es beseitigen könnte). Der Fehler: Video und Audio haben beide verschiedene Trackbar, wenn ich ein Video abspiele und die nächste Datei eine Audiodatei ist und ich dann verlange, dass die UNVERÄNDERTE AUDIOTRACKBAR auf dem Maximumwert steht, dann kann das nicht funktionieren. Ich weiß halt nicht, wie ich das umgehen könnte.
Delphi-Quellcode:
procedure TfrmMain.tListTimer(Sender: TObject);
begin
  if lbList.Items.Count <= 1 then
    exit;
  if (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.mp3') or
     (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wav') or
     (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wma') or
     (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aif') or
     (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aiff') or
     (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.ogg') then
  begin
    if not tb1.Max - tb1.Position = tb1.Max then
      Next_Audio;
    if BASS_ChannelIsActive(chan) = BASS_ACTIVE_PLAYING then
    begin
      if lbList.Items.Count > 0 then
      begin
        tb1.Max := GetBASSInfo('GetLength');
-->    if tb1.Position = tb1.Max then <--
        begin
          Next_Audio;
        end;
      end;
    end;
  end else
  begin
--> if frmVideo.tb1.Position = frmVideo.tb1.Max then <--
    begin
      Next_Video;
    end;
  end;
end;

procedure TfrmMain.Next_Audio;
var i : Integer;
begin
  if rbSeq.Checked then
  begin
    PlayFile(playindex);
    with fFiles[playindex] do
    begin
      s := Artist + ' - ' + Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']';
      lLauftext.Text := s;
    end;
    pindex := playindex;
  end else
  if rbRandom.Checked then
  begin
    randomize;
    BASS_ChannelStop(chan);
    for i := 0 to lbList.Items.Count - 1 do
    begin
      PlayIndex := Random(i);
      tb1.Max := GetBASSInfo('GetLength');
      PlayFile(playindex);
      with fFiles[playindex] do
      begin
        s := Artist + ' - ' + Titel + ' [' + trim(DurationMinSec(IntToStr(GetSongLength))) + ']';
        lLauftext.Text := s;
      end;
      pindex := playindex;
    end;
  end else
  if rbLoop.Checked then
  begin
    BASS_ChannelStop(chan);
    tb1.Position := 0;
    PlayFile(pindex);
  end;
  Application.Title := s;
  lbList.ItemIndex := pindex;
end;

procedure TfrmMain.Next_Video;
begin
  spath := fFiles[playindex].Dateiname;
  frmVideo.Play;
  pause := True;
end;

EWeiss 1. Okt 2006 19:36

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Ich denke es liegt generell an deinen Code!

Mein Vorschlag alle Audio.ext zu einen String zusammen fassen.
Beispiel:

const
AudioExt = '.mp3;.wav;.wma' usw..
VideoExt = '.wmv;.avi' usw..

Var
strExt : string;

AudioExt spliten mit Delemiter';' dann das Array in einer schleife durchlaufen
bis das ext.. des spielenden Titels mit dem im Array identisch ist.
Das ext dem strExt zuweisen.

Die abfrage nur außerhalb des Timers ausführen.
Im Timer muss keine abfrage für Ext rein das muss im Klick oder doppelklick event
der Playliste rein.

Im Timer sollte nur die position des aktuell spielenden Titels überprüft werden.

anschließend in deine Playfunktion springen.
Dort ein Case Anweisung einbauen die mit dem strExt überprüft wird.
wenn Case .mp3 dann spiele Audio usw..

Vorher solltest du aber eine Funktion einbauen
Beispiel CleanUp:
Da packst du alle Funktionen rein welche das Aktuelle File zurücksetzt.

gruß

Nils_13 1. Okt 2006 19:42

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Wozu, der Timer soll von einem Lied ins nächste springen, aber der Code ist schlecht.

EWeiss 1. Okt 2006 19:54

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Zitat:

Zitat von Nils_13
Wozu, der Timer soll von einem Lied ins nächste springen, aber der Code ist schlecht.

Nee einen Timer nutzt man für Timings.
Oder für alles was bewegt wird.

Da muss nix mit extension hinein.
Bremst den Timer nur aus.

So wie du das aufgebaut hast kann das auf dauer nichts werden weil viel zu unübersichtlich.
Du mußt deinen Code besser strukturieren.

1. Playlist Doppelklick
2. Alle Werte auf Default setzen (incl Trackbar..)
3. Dann Extension ermitteln
4. abhängig davon den Dateityp abspielen

Keine 2 TrackBars.. was erfüllt das für einen zweck?
Wenn Audio dann Trackbar.max = Maximale länge des audioFiles
Wenn Video dann Maximale länge des Video

Du benötigst ein Procedure in der du die extensions überprüfst und zwar
jedesmal wenn du einen Doppelklick ausführst oder wenn die Trackbar Max erreicht hat.

Direkt oben im Timer jedesmal das ext zu überprüfen ist ist der falsche weg.
Wenn dann nur sobald die TrackBar den Max status erreicht hat.

EDIT:
Außerdem kann er nicht weiterschalten weil!
Das Extension immer noch das gleiche oder aber schon das neue ist
sobald deine TrackBar Max erreicht hat.
Das hat wie oben schon beschrieben damit zu tun das du diese direkt in der ersten zeile überprüfst.

Du mußt sie dann überprüfen sobald die Trackbar = Max ist.
if tb1.Position = tb1.Max then überprüfe neues extension.
if ext video dann play video andererseits play audio
gruß

Nils_13 1. Okt 2006 20:21

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Es läuft nichts über Doppelklick, dann wird es auch noch unübersichtlicher. Wie soll ich denn überhaupt überprüfen, ob die Trackbar einen Maxwert hat, ohne Timer und vorallem macht es Sinn zwei zu haben, da man dann nich ständig den Videofensterfokus verliert, wenn man weiterspulen will (es sind zwei Forms, Videofenster ist eine Extraform). Hinzu muss ich die Endung von dem nächsten Lied ermitteln, um entsprechend zu handeln.

Meinst du das so ?
Delphi-Quellcode:
procedure TfrmMain.tListTimer(Sender: TObject);
begin
  if lbList.Items.Count <= 1 then
    exit;
  if not tb1.Max - tb1.Position = tb1.Max then
      Next_Audio;
  if tb1.Position = tb1.Max then
  begin
    if (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mp3') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wav') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wma') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.aif') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.aiff') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.ogg') then
    begin
      Next_Audio;
    end;
  end else
  begin
    if frmVideo.tb1.Position = frmVideo.tb1.Max then
    begin
      Next_Video;
    end;
  end;
end;

EWeiss 1. Okt 2006 20:33

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Zitat:

Zitat von Nils_13
Es läuft nichts über Doppelklick, dann wird es auch noch unübersichtlicher. Wie soll ich denn überhaupt überprüfen, ob die Trackbar einen Maxwert hat, ohne Timer und vorallem macht es Sinn zwei zu haben, da man dann nich ständig den Videofensterfokus verliert, wenn man weiterspulen will (es sind zwei Forms, Videofenster ist eine Extraform). Hinzu muss ich die Endung von dem nächsten Lied ermitteln, um entsprechend zu handeln.

Meinst du das so ?
Delphi-Quellcode:
procedure TfrmMain.tListTimer(Sender: TObject);
begin
  if lbList.Items.Count <= 1 then
    exit;
  if not tb1.Max - tb1.Position = tb1.Max then
      Next_Audio;
  if tb1.Position = tb1.Max then
  begin
    if (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.mp3') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wav') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.wma') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.aif') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.aiff') or
       (LowerCase(ExtractFileExt(fFiles[playindex].Dateiname)) = '.ogg') then
    begin
      Next_Audio;
    end;
  end else
  begin
    if frmVideo.tb1.Position = frmVideo.tb1.Max then
    begin
      Next_Video;
    end;
  end;
end;

Nein.

Ich versuche es mal anders zu erklären.
Der richtige weg ist dieser.

Wenn die Trackbar max ist dann mußt du zuerst das aktuelle File schließen.
Also in deine stop funktion springen.
1. stop
2. Timer ausschalten
3. alle werte auf Default setzen incl.. Trackbar = 0
4. Ext vom nächsten File in der Playliste prüfen
5. Timer einschalten
6. Datei abspielen

Logisch brauchst du einen Timer ohne gehts nicht. ;)

gruß

Nils_13 1. Okt 2006 20:45

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Pseudocode:
Delphi-Quellcode:
procedure TfrmMain.tListTimer(Sender: TObject);
begin
  if not tb1.Max - tb1.Position = tb1.Max then
      Next_Audio;
  if tb1.Position = tb1.Max then
  begin
    tList.Enabled := False;
    tb1.Position := 0;
    if (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.mp3') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wav') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wma') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aif') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aiff') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.ogg') then
    begin
      Next_Audio;
      tList.Enabled := True;
    end else
    begin
      if frmVideo.tb1.Position = frmVideo.tb1.Max then
      begin
        Next_Video;
      end;
    end;
  end;
end;

EWeiss 1. Okt 2006 20:57

Re: Überprüfen, ob nächste Datei Audio/Video ist und abspiel
 
Zitat:

Zitat von Nils_13
Pseudocode:
Delphi-Quellcode:
procedure TfrmMain.tListTimer(Sender: TObject);
begin
  if not tb1.Max - tb1.Position = tb1.Max then
      Next_Audio;
  if tb1.Position = tb1.Max then
  begin
    tList.Enabled := False;
    tb1.Position := 0;
    if (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.mp3') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wav') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.wma') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aif') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.aiff') or
       (LowerCase(ExtractFileExt(fFiles[playindex+1].Dateiname)) = '.ogg') then
    begin
      Next_Audio;
      tList.Enabled := True;
    end else
    begin
      if frmVideo.tb1.Position = frmVideo.tb1.Max then
      begin
        Next_Video;
      end;
    end;
  end;
end;

wenn du zeit hast und möchtest das ich dir helfe geh mal über ICQ

gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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