![]() |
Trackbar/Zeit
Hi,
1. Wie berechne ich die Zeit eines Liedes (BASS.dll) 2. Wie stelle ich das in der Trackbar da? |
Re: Trackbar/Zeit
Mit dem MediaPlayer wär es mir ein leichtes eine TrackBar zu proggen, der MediaPlayer ist aber schlechter als die BASS.dll.
|
Re: Trackbar/Zeit
Nils, bitte benutze in Zukunft unbedingt die Edit-Funktion, wenn Du Deinem Beitrag etwas hinzufügen möchtest. Dies hier ist nichts anderes als indirektes Pushen des Beitrages.
|
Re: Trackbar/Zeit
Hi,
klar Chef! :hi: |
Re: Trackbar/Zeit
Code:
//
{--------------------------------- SongPos ----------------------------------}
procedure TAudioEngine.Set_SongPos(SongPos : Integer); begin if WriteToFile Then Exit; SongPos := BASS_ChannelSeconds2Bytes(Channel, SongPos / 1000); BASS_ChannelSetPosition(Channel, trunc(SongPos)); end; function TAudioEngine.Get_SongPos : Integer; var SongPos : QWORD; MilliSec : Integer; FloatPos : FLOAT; begin SongPos := BASS_ChannelGetPosition(Channel); FloatPos:= BASS_ChannelBytes2Seconds(Channel, SongPos); MilliSec:= Trunc(1000 * FloatPos); if MilliSec < 0 then MilliSec:= 0; if (PlayerState = ENGINE_STOP) or (PlayerState = ENGINE_SONG_END) then Result := 0 else Result := MilliSec; end;
Code:
var Scroling : boolean;
procedure TMain_Form.Slider_TimerTimer(Sender: TObject); var len : integer; begin with AudioPlayer do begin Len:= Get_SongLen; if Len <= 0 then begin Slider.Position:= 0; exit; end; if Scroling = false then // Slider Slider.Position:= trunc((Slider.MaxValue / Len) * Get_SongPos + 0.1); end; end; procedure TMain_Form.SliderMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Scroling:= true; end; procedure TMain_Form.SliderMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin with AudioPlayer do begin Set_SongPos(Trunc(Get_SongLen * slider.Position / Slider.MaxValue + 0.1)); Scroling:= false; end end; // Die Plugin’s findest du bei ![]()
Code:
function TAudioEngine.Get_SongLength(FileName : String): Integer;
var Chn : DWORD; Res, MilliSec : Integer; SongLength : QWORD; FloatPos : FLOAT; ext : string; begin Ext:= UpperCase(ExtractFileExt(FileName)); Chn := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0); if (EXT = '.WMA') or (EXT = '.WMV') or (EXT = '.ASF') then Chn:= BASS_WMA_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0); if (EXT = '.FLAC') then Chn:= BASS_FLAC_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0); if (EXT = '.MP4') or (EXT = '.M4A') then Chn:= BASS_MP4_StreamCreateFile(PChar(FileName), 0); if (EXT = '.AAC') then Chn:= BASS_AAC_StreamCreateFile(PChar(FileName), 0); if (EXT = '.CDA') then Chn:= BASS_CD_StreamCreateFile(PChar(FileName), 0); if (EXT = '.APE') then Chn:= BASS_APE_StreamCreateFile(PChar(FileName), 0); if (EXT = '.MPC') then Chn:= BASS_MPC_StreamCreateFile(PChar(FileName), 0); if Chn <> 0 then SongLength := BASS_StreamGetLength(Chn); if (Chn = 0) then begin Chn := BASS_MusicLoad(FALSE, PChar(FileName), 0, 0, 0, 0); SongLength := BASS_MusicGetLength(Chn, True); end; if (Chn <> 0) then begin FloatPos:= BASS_ChannelBytes2Seconds(Chn, SongLength); MilliSec:= Trunc(1000 * FloatPos); if MilliSec < 0 then MilliSec:= 0; Res:= MilliSec; end else Res := -1; BASS_StreamFree(Chn); BASS_MusicFree(Chn); result := res; end; var function DurationMinSec(Secunden : string) : string; var Min, Sec : integer; SecToTime : string; begin Min:= StrToInt(Secunden) div 60; Sec:= StrToInt(Secunden) - Min * 60; SecToTime:= Format('%2d:%.2d', [Min, Sec]); result:= SecToTime; end; var Time : integer; Time:= trunc(Audioplayer.Get_SongLength(Files.Strings[i]) / 1000); label1.Caption:= DurationMinSec(inttostr(Time))); |
Re: Trackbar/Zeit
thx!!!
Wie heißt denn die Engine :drunken: :hi: |
Re: Trackbar/Zeit
Steht doch da: TAudioEngine.
|
Re: Trackbar/Zeit
Hi,
könnt ihr mir auf die Sprünge helfen? Ich kanns leider nicht finden :roll: |
Re: Trackbar/Zeit
Zitat:
|
Re: Trackbar/Zeit
Zitat:
![]() |
Re: Trackbar/Zeit
Zitat:
Steht auch schon oben. @Nils jetzt musst du nur noch auf Bass klicken und schwupp, da isses :shock: |
Re: Trackbar/Zeit
Mit der bass.dll kämpft ere doch schon die ganze Zeit. Ich glaube, er wollte wissen, wo er die ganze Klasse TAudioEngine findet.
|
Re: Trackbar/Zeit
Hi,
Luckie hat mal etwas von:
Delphi-Quellcode:
Wie könnte ich das in der Trackbar verwenden?
var TrackPos, hFileStream: integer;
begin TrackPos := BASS_ChannelGetPosition(hFileStream); |
Re: Trackbar/Zeit
Hi!
Und was ist da der Fehler? Ciao Frederic |
Re: Trackbar/Zeit
Es ist ja nicht nur ein Fehler, wenn ich alles aufzählen würde wäre die Seite locker voll.
|
Re: Trackbar/Zeit
[OT]
Der Fehler ist wahrscheinlich auf der anderen Seite der Tastatur. Ein gutgemeinter Tip: Mensch Nils, beschäftige dich doch erstmal grundlegend mit Delphi, bevor du dich an einen eigenen Player ranwagst! Jeder beginnt erstmal klein.
Delphi-Quellcode:
Wenn du das gemacht hast, kannst du auch präzise Fragen hier stellen und bekommst schnelle und präzise Antworten zurück.
label1.caption:='Hello World'
[/OT] |
Re: Trackbar/Zeit
Hab ich schon längst!!!
|
Re: Trackbar/Zeit
Hi Nils,
Zitat:
Du erhaelst die Position (in Sekunden, in Eiern, Tortenschnitten, was weiss ich was). Es gibt sicher auch eine Funktion welche dir die gesamte Laenge des Streams in derselben Einheit liefert (also wieder Sekunden, Eier, Tortenschnitten oder was auch immer). Nun rechnest du einfach aus, wieviel Prozent des Liedes abgearbeitet sind und uebertraegst das auf die Trackbar bzw. eine Progressbar oder was du willst. Die Onlinehilfe hilft dir bei den einzelnen Komponenten weiter... Greetz alcaeus |
Re: Trackbar/Zeit
Zitat:
Wenn du jetzt noch die gesamte Länge des Stream herausbekommst dann gehts ganz einfach:
Delphi-Quellcode:
procedure {Öffnen oder so};
begin TrackBar1.Max := BASS_StreamLength(aStream); // Ich weiß nicht obs das gibt. Aber eine Function zum herausfinden der gesamten länge wirds ja geben end; // Danach Timer auf die Form und ins OnTimer event: procedure {OnTimerEvent}; var TrackPas, hFileStream: Integer; begin TrackPos := BASS_ChannelGetPosition(hFileStream); TrackBar1.Position := TrackPos; end; |
Re: Trackbar/Zeit
Wenn ich das richtig verstanden habe sollte man statt
Delphi-Quellcode:
einfach
TrackBar1.Max := BASS_StreamLength(aStream);
Delphi-Quellcode:
nehmen, da Spiders Funktion nicht funktioniert.
tb1.MaxValue := BASS_MusicGetLength(aStream, True);
Folgendes bei menem Code hab ich in die Play-funktion (die Playfunktion öffnet auch)
Delphi-Quellcode:
stehen, bei dem Timer hab ich den Code von Spider genommen, könnte doch eigentlich gehen?!
tb1.MaxValue := BASS_MusicGetLength(aStream, True);
----------------------------------------------------------------- Geht nicht :gruebel: |
Re: Trackbar/Zeit
Hi!
Ja, es könnte. UND? Geht es oder geht es nicht? Falls nein, WAS geht nicht? Fehlermeldungen? Kompiliert er? Ciao Frederic |
Re: Trackbar/Zeit
Keine Fehlermeldung, die Trackbar funktioniert leider nicht!
|
Re: Trackbar/Zeit
Hi!
Dann zeig mal deinen Code her! Ciao Frederic |
Re: Trackbar/Zeit
Den ganzen?
|
Re: Trackbar/Zeit
Hi!
Nein, nur die relevanten Stellen (Start des Abspielens und die Timer-Procedure). Ciao Frederic |
Re: Trackbar/Zeit
1. (Play)
Delphi-Quellcode:
2. (Timer)
procedure TFormPlayer.Image1Click(Sender: TObject);
var aStream: integer; begin BASS_Start(); BASS_ChannelPause(channel); position := 0; op1.Title := 'Open Files'; if not op1.Execute then exit; Channel := BASS_StreamCreateFile(FALSE, PChar(op1.FileName), 0, 0, 0); BASS_StreamPlay(Channel, False, 0); Image1.Enabled:= true; p1.Visible:= false; tb1.MaxValue := BASS_MusicGetLength(aStream, True); end;
Delphi-Quellcode:
procedure TFormPlayer.tbTimer(Sender: TObject);
var TrackPos, hFileStream: Integer; begin TrackPos := BASS_ChannelGetPosition(hFileStream); tb1.Position := TrackPos; end; |
Re: Trackbar/Zeit
Hi!
Du verwendest munter die als integer deklarierten Variablen aStream und hFileStream ohne, dass die wirklich mit irgendwas belegt sind oder sonst etwas. Was erwartest du da? Ciao Frederic |
Re: Trackbar/Zeit
Cool, automatisch wird ein ladestand angezeigt.
Na ja dafür läuft wichtigeres nicht mehr :cry: Wenn ich einfach
Delphi-Quellcode:
und
tb1.MaxValue := aStream;
Delphi-Quellcode:
sage, läufts nicht, nur warum?!
TrackPos := BASS_ChannelGetPosition(hFileStream);
tb1.Position := hFileStream; |
Re: Trackbar/Zeit
Hi!
Zitat:
Ciao Frederic |
Re: Trackbar/Zeit
@Fkerber: Siehe 2 Beiträge drüber!
|
Re: Trackbar/Zeit
Zitat:
Dir wurde jetzt oft geholfen, und noch schaffst du es nicht. Ein paar Grundlagen solltest du schon beherrschen, bevor du Ego-Shooter, Betriebssystem, Autorennspiel und MP3-Player programmieren willst :roll: Also. Du initialisierst einen Stream, z.B. so:
Delphi-Quellcode:
Nun steht irgendwas in aStream drin. Wenn du denkst, dass das die Länge des Streams ist, dann hast du dich mal gewaltig geirrt. aStream enthält nichts anderes als die Speicheradresse, ab welcher der Stream im Hauptspeicher liegt. Bei einem Zugriff regelt der Programmcode alles weitere. Was macht deine Zeile nun? Du weißt tbl.MaxValue einfach die Adresse zu, d.h. der höchste Wert der Trackbar ist eine Zahl, welche genau gleich wie die Anfangsadresse des FileStreams im Speicher ist.
aStream := TFileStream.Create('...', ...);
Bei der Zeile
Delphi-Quellcode:
muss ich wohl nichts mehr dazu sagen, oder? :roll:
tpl.Positon := hFileStream;
Greetz alcaeus |
Re: Trackbar/Zeit
Hi!
Was soll denn aStream sein???? Es ist nur ein Integer, dem kein Wert zugewiesen wurde! Wie soll er da ne Länge rauskriegen - dieser Integer hat doch nix mit deinem Lied zu tun. Ciao Frederic |
Re: Trackbar/Zeit
@alki: in die Klammern sollte man den Befehl fürs erzeugen einer Datei!
|
Re: Trackbar/Zeit
Zitat:
Ich hoffe du hast wenigstens kapiert, warum dein Code nicht funktioniert... Greetz alcaeus |
Re: Trackbar/Zeit
Hi Nils,
wenn du mal überlegen würdest und nicht nur munter abkopieren, hättest du den Fehler schon bemerkt. Statt hFileStream musst du halt aStream schreiben. Ausserdem heißt das nicht MaxValue (bei Tb1) sondern nur Max. Das was Adreas geschrieben hat, war auch nur ein Beispiel, welches Du in dein Programm umsetzen sollst. Also nicht mit Pünktchen etc. sondern mit dem Dateinamen. |
Re: Trackbar/Zeit
Hi!
Nils, ich kann dir im Prinzip nur noch einen Tipp geben: Ich an deiner Stelle würde Delphi mal eine zeitlang zulassen und nicht einfach so drauflos programmieren sondern mir mal Stift und Papier Gedanken über meinen eigentlichen Programmaufbau machen. Stichwort: Pseudocode Ciao Frederic |
Re: Trackbar/Zeit
Hi,
1. Das Prinzip hab ich kapiert! 2. Das umstetzen ist eine andere Sache! 3. Max gibt es nicht! 4. Falls es hier noch niemanden aufgefallen ist: die Umsetzung ist doch gerade das Problem :wink: |
Re: Trackbar/Zeit
LOL
:mrgreen: |
Re: Trackbar/Zeit
Zitat:
Also, wo ist dann das Problem? |
Re: Trackbar/Zeit
@Spider: siehe 3 Beiträge über deinen!!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 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