Musikdateien richtig abspielen

Spezielle Fragen zu 2D- und 3D-Grafik, Sound und Video
basicwurm
Foriker
Beiträge: 42
Registriert: Di 8. Jan 2013, 16:59
Kontaktdaten:

Musikdateien richtig abspielen

Beitrag von basicwurm » Di 2. Aug 2016, 17:04

Hallo Gambistas,
Ich möchte einen Player für Musikdateien schreiben und stoße dabei auf 2 Probleme.

1. Die Dateien eines Ordners sollen der Reihe nach gespielt werden (Klassische Musik...) und sind mit Track 1.wav, Track 2.wav usw. benannt. Liest man sie mit For each aus, wird aber zuerst Track 10 gespielt. Die Filenames in ein Array zu stopfen und es zu sortieren, hilft nix - auch dann wird alfabetisch sortiert.
Als Lösung fand ich, die Filenames in ein ListView zu schreiben und dieses zu sortieren. Dann stehen sie zwar richtig drin, können aber nur mit MoveFirst/MoveNext richtig ausgelesen werden, weil der Index ja gleich bleibt. Weiß jemand eine bessere/einfachere Lösung?

2. Es braucht eine Schleife, um alle files abzuspielen, und die darf erst weitermachen, wenn ein file fertig abgespielt ist. Der folgende Code beginnt nur dann Track 1 zu spielen, wenn die While-Schleife auskommentiert ist - MIT ihr beginnt er mit Track 10, dem letzten. Das bedeutet wohl, dass die Schleife voll durchläuft und erst dann zu spielen beginnt? gbHandbuch zu MoveNext: "Returns TRUE if there is no child item left." Was funktioniert da nicht, das MoveNext oder das Music.Stopped?

Vielen Dank schon mal für eure Antworten!

Verwendete Komponenten: gb.media, gb.sdl2.audio
gambas code
Public Sub PLAY_Click()

Dim FIL As String               ' File zum abspielen
Dim PFA As String               ' Kompletter Pfad
Dim N As String                 ' IndexNr
Dim I As Integer = 1
 
For Each FIL In Dir(ORD)        ' Public Ordner vom DirChooser
  If FIL Ends "wav" Or FIL Ends "mp3" Or FIL Ends "ogg" Then
    N = CStr(I)
    LV.Add(N, FIL)               ' Alle files in ListView schreiben    
    I = I + 1
  Endif
Next

LV.Sorted = True                  ' ListView sortieren
LV.MoveFirst  

While LV.MoveNext() = False       ' lt. Handbuch
  FIL = CString(LV.Item.Text)
  PFA = ORD &/ FIL                 ' Pfad + Filename
  LB.Text = "Playing " & FIL        ' Label anzeigen
  Music.Load(PFA)
  Music.Play
  Wait
  If Music.Stopped = 0 Then LV.MoveNext() ' Etwas davon funktioniert nicht
Wend
End
Zuletzt geändert von tux_ am Di 2. Aug 2016, 17:25, insgesamt 1-mal geändert.
Grund: Bitte fuer Gambas-Code die gambas-Tags anstatt der code-Tags verwenden.

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von tux_ » Di 2. Aug 2016, 17:43

1. Die Dateien eines Ordners sollen der Reihe nach gespielt werden (Klassische Musik...) und sind mit Track 1.wav, Track 2.wav usw. benannt. Liest man sie mit For each aus, wird aber zuerst Track 10 gespielt. Die Filenames in ein Array zu stopfen und es zu sortieren, hilft nix - auch dann wird alfabetisch sortiert.
Du moechtest die natuerliche oder Versions-Sortierung der Dateinamen, wie sie auch von "ls -v" erzeugt wird. Dazu gambas code
Dir(sPfad).Sort(gb.Natural)
2. Es braucht eine Schleife, um alle files abzuspielen, und die darf erst weitermachen, wenn ein file fertig abgespielt ist. Der folgende Code beginnt nur dann Track 1 zu spielen, wenn die While-Schleife auskommentiert ist - MIT ihr beginnt er mit Track 10, dem letzten. Das bedeutet wohl, dass die Schleife voll durchläuft und erst dann zu spielen beginnt? gbHandbuch zu MoveNext: "Returns TRUE if there is no child item left." Was funktioniert da nicht, das MoveNext oder das Music.Stopped?
Weder noch. Der Music.Play()-Aufruf wartet nicht, bis das Musikstueck fertig gespielt ist, sondern stoeszt nur den Abspielprozess an und kehrt danach sofort zurueck, sodass dein Programm mit anderen Dingen weiterarbeiten kann, waehrend im Hintergrund die Datei abgespielt wird. (Denk daran, dass dein SDL-Programm ein Computerspiel sein koennte, bei dem Hintergrundmusik laufen soll, aber das Programm hauptsaechlich mit anderen Rechnungen beschaeftigt ist.) Deine Schleife laedt also schnell hintereinander alle Musikdateien und faengt an, sie abzuspielen. Das Abspielen der naechsten Datei beendet natuerlich das der vorherigen, sodass du am Ende der Schleife nur das letzte Stueck hoerst. Leider verfuegt die Music-Klasse ueber keine Events, aber da du sowieso auf das Ende der Musikdatei warten moechtest anstatt etwas nebenher zu machen, kannst du den Status des Players pollen: gambas code
Music.Load(PFA)
Music.Play()
Do
  Wait 1
Loop Until Music.State = Music.Stopped
Uebrigens leistet die Zeile "If Music.Stopped = 0 Then ..." in deinem Quelltext wahrscheinlich nicht, was du dir dachtest. Music.Stopped ist eine Konstante in der Music-Klasse [1], naemlich konstant 0. Ob die Musik gestoppt hat, erfaehrst du wie oben gezeigt, indem du die Eigenschaft Music.State mit den drei Konstanten Music.Playing, Music.Paused und Music.Stopped vergleichst.

Ich schaetze mal, dass gb.media eine bessere Schnittstelle bietet als gb.sdl2.audio, habe aber noch mit keiner von beiden selbst gearbeitet. Jedenfalls haben die Objekte in gb.media auch Ereignisse, mit denen du eleganter auf das Ende der Musikdatei warten kannst.

[1] http://gambaswiki.org/wiki/comp/gb.sdl2 ... ic/stopped
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

gambasso
Foriker
Beiträge: 1080
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von gambasso » Di 2. Aug 2016, 17:52

moin,

ist der veröffentliche Text Original oder gibt es da noch irgenwelche Verzwickungen?
Beispiel: gambas code
If FIL Ends "wav" Or FIL Ends "mp3" Or FIL Ends "ogg" Then
was ist 'FIL Ends' ? wie setzt sich das zusammen? Oder ist es nur symbolisch zur Erklärung?
Gruss

basicwurm
Foriker
Beiträge: 42
Registriert: Di 8. Jan 2013, 16:59
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von basicwurm » Mi 3. Aug 2016, 16:59

@tux
Hurra, es funktioniert alles! Vielen Dank für deine Tipps! Und das Programm ist jetzt viel kürzer.
Ich kann sogar, während es läuft, diese Antwort schreiben. Insgesamt scheint es mir ein gutes Beispiel, was man in gb mit ein paar Zeilen Code erreichen kann. Nebenbei: Die Tonqualität ist trotz meiner billigen Soundkarte ausgezeichnet.
gambas code
Public Sub PLAY_Click()

Dim FIL As String               ' File zum abspielen
Dim PFA As String              ' Kompletter Pfad
Dim ARR As String[]           ' Array für Dir-Inhalt

ARR = Dir(ORD).Sort(gb.Natural) ' Public ORD = Ordner vom DirChooser

For Each FIL In ARR
     
  If FIL Ends "wav" Or FIL Ends "mp3" Or FIL Ends "ogg" Then
    PFA = ORD &/ FIL                ' Pfad + Filename
    LB.Text = "Playing " & FIL  ' Label anzeigen
    Music.Load(PFA)
    Music.Play()
  Endif  
    Do
      Wait 1
    Loop Until Music.State = Music.Stopped
Next

End
@gambasso

Also das "Ends" ist ein ganz normaler Bestandteil der String-Funktionen. Lt. Gambas-Index "Returns TRUE if the String string ends with the Pattern string". Ich brauche es hier, weil in meinen Musik-Ordnern auch .png-files mit Plattencovers und .txt-files mit Liedtexten liegen.

consolefetischist
Foriker
Beiträge: 8
Registriert: So 12. Apr 2020, 13:06
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von consolefetischist » So 12. Apr 2020, 13:45

Moin!
Ich habe da ein kleines Problem mit dem Sound.
Ich benutze eigentlich für meine hausautomation espeak für audio rückmeldungen.
ala shell'espeak text'

ich habe mir ein paar samples besorgt die etwas besser klingen als die espeak computerstimme.
Allerdings funktioniert shell 'mpg123 filename' nicht, es wird zwar ausgeführt, ich höre aber nix.
mit shell'cvlc dateiname' höre ich etwas aber sehr leise.

rufe ich das file direkt in der console auf funktioniert es mit beiden programmen und auch die lautstärke passt.

jemand ne Idee ?

vuott
Foriker
Beiträge: 103
Registriert: Fr 16. Jan 2015, 01:27
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von vuott » Mo 13. Apr 2020, 17:57

Kannst du eine dieser Audiodateien anhängen?

consolefetischist
Foriker
Beiträge: 8
Registriert: So 12. Apr 2020, 13:06
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von consolefetischist » Fr 24. Apr 2020, 16:31

Hoppla antwortet doch noch jemand :) Datei anhängen geht scheinbar nicht, ne idee wo ich eine der dateien hochladen kann ?
ginge sonst natürlich auch per e-mail.


edit:
So habe noch einen auf-die-schnelle-hoster gefunden.
Datei von filehorst.de laden


wie gesagt, diese datei wird mit vlc sowie cvlc als auch mgp123 mit systemlautstärke( also normal weg ) abgespielt.
Zum System noch : opensuse 15.1
shellcalls via espeak werden auch mit systemlautstärke "abgespielt"

Benutzeravatar
tionov
Site Admin
Beiträge: 342
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von tionov » Fr 24. Apr 2020, 18:05

consolefetischist hat geschrieben:
Fr 24. Apr 2020, 16:31
Hoppla antwortet doch noch jemand :) Datei anhängen geht scheinbar nicht ...
Doch, geht schon ... seit jetzt. Habs gerade geändert ...
Alles Gute,

tionov

consolefetischist
Foriker
Beiträge: 8
Registriert: So 12. Apr 2020, 13:06
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von consolefetischist » Fr 24. Apr 2020, 18:17

Super! Danke sehr.
Dann hier eine der etwa 20 Dateien im Anhang.
Dateianhänge
automatisches_licht_AN.mp3
(44.99 KiB) 6-mal heruntergeladen

vuott
Foriker
Beiträge: 103
Registriert: Fr 16. Jan 2015, 01:27
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von vuott » Fr 24. Apr 2020, 19:46

consolefetischist hat geschrieben:
So 12. Apr 2020, 13:45
Allerdings funktioniert shell 'mpg123 filename' nicht, es wird zwar ausgeführt, ich höre aber nix.
Ich kann den Test nicht machen: ich habe mp123 nicht auf dem System installiert.

consolefetischist hat geschrieben:
So 12. Apr 2020, 13:45
mit shell'cvlc dateiname' höre ich etwas aber sehr leise.
Ich höre den Audio von Datei "automatisches_licht_AN.mp3" regelmäßig.

Benutzeravatar
tionov
Site Admin
Beiträge: 342
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von tionov » Fr 24. Apr 2020, 21:19

consolefetischist hat geschrieben:
So 12. Apr 2020, 13:45
jemand ne Idee ?
Hast du mal den MediaPlayer probiert?
http://gambaswiki.org/wiki/comp/gb.media/mediaplayer

Ich kopiere mal schlicht Code, der bei mir funktioniert, Du siehst, da ist auch noch eine ProgressBar im Spiel:
gambas code
Private $Mp As New MediaPlayer

Private Sub File_Write(Value As String)

    $File = Value
    $Mp.URL = Media.URL($File)

End

Private Sub Play()

    ProgressBar1.Value = 0
    $Mp.Play

    While $Mp.State = Media.Playing
        ProgressBar1.Value = $Mp.Position / $Mp.Duration

        If $Mp.Position = $Mp.Duration Then
            $Mp.Stop
            Break
        Endif

        ProgressBar1.Refresh
        ProgressBar1.Mouse = Mouse.Cross
        Wait 0.01
    Wend

    ' Try sonst Ärger bei Abbruch
    Try ProgressBar1.Mouse = Mouse.Default

End
Alles Gute,

tionov

consolefetischist
Foriker
Beiträge: 8
Registriert: So 12. Apr 2020, 13:06
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von consolefetischist » Sa 25. Apr 2020, 17:46

die Progressbar hab ich fix mal auskommentiert da ich den Code direkt im Programm teste.
ich habe da aber scheinbar noch etwas übersehen da bei :

Private Sub File_Write(Value As String)

$File = Value
$Mp.URL = Media.URL($File)

End

der Fehler unbekannter Bezeichner kommt.
Oder muss ich die Variable noch definieren ? bin was gambas angeht etwas angestaubt :)

Benutzeravatar
tionov
Site Admin
Beiträge: 342
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von tionov » So 26. Apr 2020, 07:16

Sorry, ich habe jetzt gerade keine Zeit. Aber in der Software Farm ist gerade ein Programm hochgeladen worden, "Medienspieler", das kannst du dir mal ansehen. Dort wird auch der Mediaplayer verwendet.
Alles Gute,

tionov

consolefetischist
Foriker
Beiträge: 8
Registriert: So 12. Apr 2020, 13:06
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von consolefetischist » So 26. Apr 2020, 18:16

Also der "Medienspieler funktioniert überhaupt nicht, nach der xten Fehlermeldung habe ich es aufgegeben.
der "MP3 PLayer" funktioniert, allerdings ist der so dermaßen kompliziert das ich das Programm nicht verstehe. *seufz*

Benutzeravatar
tionov
Site Admin
Beiträge: 342
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: Musikdateien richtig abspielen

Beitrag von tionov » So 26. Apr 2020, 19:28

consolefetischist hat geschrieben:
So 26. Apr 2020, 18:16
Also der "Medienspieler funktioniert überhaupt nicht, nach der xten Fehlermeldung habe ich es aufgegeben.
der "MP3 PLayer" funktioniert, allerdings ist der so dermaßen kompliziert das ich das Programm nicht verstehe. *seufz*
Bei mir funktioniert er. Vielleicht magst du mal die Fehlermeldungen posten? Vielleicht liegt es ja an deinem System?
Alles Gute,

tionov

Antworten

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast