Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi (D7) Memp Mediaplayer anpassen (Vorspulen) (https://www.delphipraxis.net/197325-d7-memp-mediaplayer-anpassen-vorspulen.html)

JanWe 30. Jul 2018 21:22


(D7) Memp Mediaplayer anpassen (Vorspulen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich möchte einen kleinen Player erstellen - aber nicht einen von Grundauf, denn so gut kann ich Delphi dann leider doch nicht.
Hab mir auch das Tutorial von Gausi angeschaut, aber das ist mir doch noch zu hoch.

Der Player MEMP von Gausi kann ja schon viel (Nemp ist auch Open Source, aber mir zu kompliziert :D)

Nunja, mein Player sollte

1) per Button eine gewisse Zeitspanne vorspulen/springen (3 Sekunden) können. Per Buttonklick.

2) beim Klick auf eine Stelle der Scrollbar dorthin springen.


KodeZwerg hatte ich angeschrieben, weil er sich mit der BassDLL auch gut auskennt.
Aber er hat keine alte Delphi Version. Und somit waren seine Codevorschläge leider nicht bei mir einsetzbar. Danke auch an ihn.

Ich wäre natürlich sehr glücklich, wenn mir jemand der Dephi 7 hat, helfen könnte und ich nicht erst die 20 GB große Delphi 10 Berlin Free instlalieren müßte.

Mein Problem ist nämlich, daß ich die Titel/Stücklänge in dem Code von MEMP nicht sehe/finde. Und auch nicht, in welcher Unit die steht. (Player_Klasse oder unit1)

Denn die bräuchte ich ja, um überhaupt Entfernungen auf der Scrollbar

Memp gibt es hier
https://www.entwickler-ecke.de/viewtopic.php?t=80555

EditH:
Wo wir gerade dabei sind: .... Die Scrollbar/Volumeregler mit dem Mausrad steuern, unter D7 sicher ziemlich kompliziert, oder?

Habe mal meine lauffähige Version angehängt
MEMP_mit_D7.7z (863,5 KB)

KodeZwerg 30. Jul 2018 21:46

AW: (D7) Memp
 
Mit dem Vor- Zurückspulen sollte kein Problem darstellen, das schau ich mir gleich nochmal an, aber diese TScrollBar für Positionierung ist doof, die hat keine Eigenschaften, mit einer TProgressBar ist das in Null Komma Nichts erledigt, die hat Eigenschaften mit denen ich bei OnChange was Anfangen kann, darf man die tauschen?

JanWe 30. Jul 2018 21:54

AW: (D7) Memp
 
Grüß Dich KodeZwerg,

mhh, Tauschen ... zusätzlich wäre besser, oder?

KodeZwerg 30. Jul 2018 22:44

AW: (D7) Memp Mediaplayer anpassen (Vorspulen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang ist ProgressBar zusätzlich enthalten, entpacke das in Dein Memp, kompiliere, teste.
Klappt es mit Delphi 7? Sind die Sekunden Spuler Knöpfe nun noch Notwendig?

Bin schon müde, +3 / -3 Sekunden Knöpfe kommen Morgen ran.

Ps: Erstelle vorher Backup von Dein Memp, man weiß ja nie...

Pps:
Der Code dazu sieht so aus:
Delphi-Quellcode:
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 var
  i : integer;
begin
 Form1.Caption := IntToStr(round(X / (pb1.Width / pb1.Max)));
 i := round(X / (pb1.Width / pb1.Max));
// if ((i < pb1.Max)and(i > 0)) then
 pb1.Position := i;
 MeMPPlaylist.Progress := pb1.Position / 100;
end;
Wenn ich die Sekunden Knöpfe mache schaut Code danach so aus, kannst Du jetzt schon machen wenn Du Lust hast.
Delphi-Quellcode:
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 pb1.Position := round(X / (pb1.Width / pb1.Max));
 MeMPPlaylist.Progress := pb1.Position / 100;
end;

Luckie 30. Jul 2018 23:38

AW: (D7) Memp Mediaplayer anpassen (Vorspulen)
 
Autsch:
Delphi-Quellcode:
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 var
  i : integer;
begin
 Form1.Caption := IntToStr(round(X / (pb1.Width / pb1.Max)));
Nimm das Form1 aus dem Code raus. pb1MouseDown ist doch schon eine Methode von TForm1. Man sollte es im Code nicht noch mal referenzieren. Und wenn es doch sein muss, nimm
Delphi-Quellcode:
Self
.

KodeZwerg 31. Jul 2018 04:23

AW: (D7) Memp Mediaplayer anpassen (Vorspulen)
 
Schade das Du mitten drinn anscheinend aufgehört hast zu Lesen, sonst hättest Du ein wenig weiter unten auch den Fix entdeckt.
Da hab ich zu schnell hochgeladen gehabt mit noch Testkrams drinnen.

Gausi 31. Jul 2018 11:50

AW: (D7) Memp Mediaplayer anpassen (Vorspulen)
 
Zitat:

Zitat von JanWe (Beitrag 1409158)
Mein Problem ist nämlich, daß ich die Titel/Stücklänge in dem Code von MEMP nicht sehe/finde. Und auch nicht, in welcher Unit die steht. (Player_Klasse oder unit1)

Hallo,

Da stöbert man nur mal kurz hier im Forum, und findet direkt jemanden, der dieses uralte Tutorial ausgräbt. :lol:

Motivation hinter dem Tutorial war (neben dem Wettbewerb bei Delphi-Treff damals) es, ein halbwegs vernünftiges Basiskonzept vorzustellen. Also zum Beispiel die übliche Trennung von Daten und Anzeige, die grade bei Programmieranfängern oft komplett ignoriert wird. Damit müsste dann schon klar sein, dass man die Dauer des aktuellen Stücks nicht in der Unit1 findet (bzw. dem Formular), sondern in der Playerklasse. In der Unit1, die zum Hauptformular gehört, wird dann zur Anzeige dieser Daten auf die entsprechenden Properties des Player-Objekts zugegriffen.

Ob man bei seinem eigenen Player dann die hier vorgeschlagene Klassenstruktur wählt, oder eine andere, ist dann zweitrangig. In meinem großen Player Nemp ist dann z.B. die Playlistklasse nicht von der Playerklasse abgeleitet, sondern die Playlist hat eine Property vom Typ TPlayer, da dieser "Player" nicht nur Zeug aus der Playlist abspielen soll, sondern ggf. auch was anderes.

Zum Thema:

Das mit der Titellänge in meinen Playern ist immer so eine Sache. Einerseits bestimme ich die über meine eigenen (sehr schnellen) Methoden in der "Audiofile"-Klasse (mit Hilfe meiner Mp3FileUtils etc.), andererseits stimmen diese Berechnungen nicht immer 100%ig mit der Realität überein (CBR, VBR, XING-Header, irgendwelches anderes Gedöns), so dass diese Daten für das Abspielen mit der Dauer abgeglichen werden sollte, die die bass.dll liefert. Sonst kommt die GUI ggf. durcheinander.

In Memp sind dafür die folgenden Eigenschaften interessant:
Delphi-Quellcode:
// Properties von TMempPlayer (bzw. dann auch von TMempPlaylist, die vom TMempPlayer abgeleitet ist)
// aktuelle Position im Titel in Sekunden. Auslesen im Timer für Zeitanzeige, Setter nutzen für "3 Sekunden vorspulen" oder so
property Time: Double read GetTime write SetTime;

// aktuelle Position im Titel in "Prozent". Auslesen für den Progress in einer Scrollleiste/Progressbar o.Ä. für einen "relativen Fortschritt"
// Setter ebenso nutzbar für Klicks auf eine Progressbar/Scrollleiste oder ein geeigneteres visuelles Element
property Progress: Double read GetProgress write SetProgress;

// Dauer des aktuellen Stücks in Sekunden. Nur Getter, weil wir keinen Audio-Editor haben, sondern nur einen Player
property Dauer: Double read Getlength;
Welche visuellen Komponenten man dann wählt, um dem User die Steuerung möglichst bequem zu machen, ist dann wieder was anderes. Die TScrollbar ist da ein einfaches Beispiel, was einige Features bietet, aber eben nicht unbedingt alle. - Zum Beispiel kein OnMouseDown, um per Klick zu einer bestimmten Stelle zu springen.

KodeZwerg 31. Jul 2018 12:08

AW: (D7) Memp Mediaplayer anpassen (Vorspulen)
 
Hallo nochmal,
habe noch etwas nachkorrigiert hier damit das visuelle aktueller gleich ausschaut, vielleicht machst Du das auch bei Dir.
Delphi-Quellcode:
procedure TForm1.pb1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 pb1.Position := round(X / (pb1.Width / pb1.Max));
 MeMPPlaylist.Progress := pb1.Position / 100;
 MainScrollbar.Position := pb1.Position;
end;
Delphi-Quellcode:
procedure TForm1.MainTimerTimer(Sender: TObject);
var t: integer;
begin
  if MainScrollbar.Tag = 0 then
  begin
    MainScrollbar.Position := Round(MeMPPlaylist.Progress * 100);
    pb1.Position := MainScrollbar.Position;
  end;

  t := Round(MeMPPlaylist.Time);
  LblTime.Caption := Format('%.2d:%.2d',[t Div 60, t Mod 60]);
  MeMPPlaylist.DrawSpectrum(SpectrumPaintbox.Canvas.Handle);
end;
Hallo @Gausi, ich hoffe das geht in Ordnung so.

Mit paar sekunden vor oder nach hinten hopsen würde ich auch über eine der TBar.Position realisieren, es kann dann nicht exakt 3 sekunden sein da die TBar's immer 0-100 sind, prozentual von liedlänge halt.
Vielleicht klappts auch anders, der Erfinder kann sich da bestimmt noch Besser zu äußern :thumb:

Nachtrag: Hat er ja bereits getan :)


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