axMediaPlayer mit Progressbar als CurrentPosition-Anzeige

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von FloFuchs.

    axMediaPlayer mit Progressbar als CurrentPosition-Anzeige

    Ich würde gerne eine Progressbar nutzen umd die Position des Liedes anzugeben.

    Ich stelle mir das so vor:

    VB.NET-Quellcode

    1. Deklarieren maximale länge der progressbar als maximale länge des im mediaplayer abzupielendem liedes
    2. die progressbar value soll so groß sein wie die position des liedes
    3. das problem ist ich habe keine ahnung wie das geht...



    Wäre für Hilfe dankbar.
    Also du brauchst dann nen Timer auf Deiner Form.
    Da wo Du dein Lied startest, startest du den Timers un setzt das Progressbar.Maximum auf die gesamt sekundenzahl von deinem Song.

    VB.NET-Quellcode

    1. Sub starteLied()
    2. ProgressBar1.Maximum = deinLiedGesamtSekunden
    3. Timer1.Start()
    4. 'play lied....
    5. End Sub

    UNd im Tick ereignis setzt du dann deine progressbar immer eins weiter...

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. ProgressBar1.Value += 1
    3. End Sub

    evtl das in nen Backgroundworker einfügen. Zum Resourcen sparen. Dazu gibts hier nen schönes Tut...
    [VB.NET] Multithreading mit BackgroundWorker

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    hmm du wirst doch i-wo die Länge deinesLiedes abfragen können, oder? der wird doch bestimmt eine entsprechende Eigenschaft haben.
    btw Threading is natürlich noch besser =)

    VB.NET-Quellcode

    1. TrackBar1.Maximum = AxWindowsMediaPlayer1.currentMedia.duration

    sowas in der art...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    ehm wenn du oben liest .. klar mitm Timer... aber der muss ja schließlich nich in der GUI mitlaufen... sondern darf das ruhig im Hintergrund machen....
    Wird ja auch nich nur in einem Tut so erklärt ;)
    Macht ja auch Sinn so ne daueraufgabe einfach in den Hintergrund zu schieben, oder meinste nich...
    nein es war von

    VB.NET-Quellcode

    1. .duration
    die Rede. Und das liefert einen Double zurück, un der ist niemals im Format "00:00"
    Und das war weder arrogant, noch sonst was. Wie hast du denn das ganze ausgeteste, dass du auf ein Ergebnis im Format "00:00" gekommen bist?

    timonator schrieb:

    Da liegst du falsch, es werden Minuten und Sekunden (00:00) zurückgegeben !

    ??? mit welchem Code kam denn diese Rückgabe?
    nicht mit dem den ich dir oben drüber als tip gegeben habe. Un deshalb komme ich mir da auch schon ein wenig veralbert vor... :( also nix für ungut...
    Habs nochmal nachvollzogen.
    Also, ich habe mir als erstes "AxWindowsMediaPlayer1.currentMedia.duration" in eine Texbox ausgeben lassen.
    Dummerweise mit einem Stream, der natürlich 0 angezeigt hat.
    Dann habe ich es mit "AxWindowsMediaPlayer1.currentMedia.durationString" probiert und dabei ist 00:00 raus gekommen.
    Daraufhin habe ich eine mp3 Datei geladen und 00:47 angezeigt bekommen.

    Kannst du jetzt meine Verwirrung nachvollziehen ?

    Und nein, ich will hier niemanden veralbern, es handelt sich hier um ein klassisches Missverständnis, im doppelten Sinn !
    Ich habe extra "VB Newbie" unter meinen Avatar geschrieben, das bedeutet, daß ich noch nicht so den Plan habe.
    Trotzdem, oder grade deswegen ist so etwas wie ...

    FloFuchs schrieb:

    ...
    Wie wäre es mal mit lesen?

    ... nicht besonders Freundlich.

    Aber nix für ungut, du hast mir ja auch geholfen. :)
    Sorry 4 Doppelposting, aber das hier drüber ist eher offtopic. :D


    Ich habe es jetzt so gemacht :

    VB.NET-Quellcode

    1. Option Explicit On
    2. Public Class Form1
    3. Public Function Calculate()
    4. Dim MediaDuration As Double
    5. Dim MediaDuration2 As Double
    6. MediaDuration = AxWindowsMediaPlayer1.currentMedia.duration
    7. MediaDuration2 = Math.Round(MediaDuration * 1.0).ToString
    8. Calculate = MediaDuration2 + 1 ' <-- Hängt eine Sekunde drann, da Timer und Mediaplayer nicht synchron laufen
    9. End Function
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. If TextBox1.Text = "" Then
    12. MsgBox("Bitte eine Datei angeben")
    13. ElseIf Button1.Text = "Start" Then
    14. Button1.Text = "Stop"
    15. AxWindowsMediaPlayer1.URL = TextBox1.Text
    16. Timer1.Start()
    17. ElseIf Button1.Text = "Stop" Then
    18. AxWindowsMediaPlayer1.URL = Nothing
    19. Button1.Text = "Start"
    20. ProgressBar1.Value = 0
    21. Timer1.Stop()
    22. End If
    23. End Sub
    24. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    25. ProgressBar1.Maximum = Calculate()
    26. ProgressBar1.Value += 1
    27. If ProgressBar1.Value = Calculate() Then
    28. AxWindowsMediaPlayer1.URL = Nothing
    29. ProgressBar1.Value = 0
    30. Timer1.Stop()
    31. End If
    32. End Sub
    33. End Class

    Ist nicht besonders genau, funktioniert aber.
    Gibt es an dem Code was auszusetzen, oder kann man den so stehen lassen ?
    Wo soll man anfangen?
    1. Option Strict On - bitte anschalten und Fehler beheben.
    2. Wozu soll das ganze eigentlich gut sein? Der MediaPlayer hat doch ne Fortschrittsanzeige
    3. Setz dich mal mit den Events auseinander, die der MediaPLayer mit bringt.
    Zu 1. Fehler behoben :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Public Class Form1
    4. Public Function Calculate() As String
    5. Dim MediaDuration As Double
    6. Dim MediaDuration2 As Double
    7. MediaDuration = AxWindowsMediaPlayer1.currentMedia.duration
    8. MediaDuration2 = CDbl(Math.Round(MediaDuration * 1.0).ToString)
    9. Calculate = CStr(MediaDuration2 + 1) ' <-- Hängt eine Sekunde drann, da Timer und Mediaplayer nicht synchron laufen
    10. End Function
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. If TextBox1.Text = "" Then
    13. MsgBox("Bitte URL zu einem Stream, oder einer lokalen Datei angeben")
    14. ElseIf Button1.Text = "Start" Then
    15. Button1.Text = "Stop"
    16. AxWindowsMediaPlayer1.URL = TextBox1.Text
    17. Timer1.Start()
    18. ElseIf Button1.Text = "Stop" Then
    19. AxWindowsMediaPlayer1.URL = Nothing
    20. Button1.Text = "Start"
    21. ProgressBar1.Value = 0
    22. Timer1.Stop()
    23. End If
    24. End Sub
    25. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    26. ProgressBar1.Maximum = CInt(Calculate())
    27. ProgressBar1.Value += 1
    28. If ProgressBar1.Value = CDbl(Calculate()) Then
    29. AxWindowsMediaPlayer1.URL = Nothing
    30. ProgressBar1.Value = 0
    31. Timer1.Stop()
    32. End If
    33. End Sub
    34. End Class

    Zu 2. Wenn der Mediaplayer unsichtbar im Hintergrund läuft, braucht man halt eine eigene Fortschrittsanzeige.

    Zu 3. Was meinst du genau, etwas konkreter bitte !?

    timonator schrieb:

    VB.NET-Quellcode

    1. Public Function Calculate() As String
    2. Dim MediaDuration As Double
    3. Dim MediaDuration2 As Double
    4. MediaDuration = AxWindowsMediaPlayer1.currentMedia.duration
    5. MediaDuration2 = CDbl(Math.Round(MediaDuration * 1.0).ToString)
    6. Calculate = CStr(MediaDuration2 + 1) ' <-- Hängt eine Sekunde drann, da Timer und Mediaplayer nicht synchron laufen
    7. End Function
    Was soll dieser Blödsinn?
    Diese Funktion sollte ein Double, meinetwegen ein Integer zurückgeben, nicht aber einen String.
    2x hin- und her-konvertieren (Double -> String -> Double -> String) X(
    Deinen Zeit-Offset addierst Du auf das Double drauf, und ausgegeben sird der Wert mit ToString.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!