Länge einer MP3 Datei auslesen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    Länge einer MP3 Datei auslesen

    hmm.. hier mal eine wahrscheinlich einfache frage:
    wie kann ich die Länge( und gespielte zeit) eines Liedes, das gerade im wmp(control) wiedergegeben wird auslesen? ich hab schon rumgegoogeld und sonst was, find aber nichts gescheites ;( .
    ich möchte nämlich eine eigene anzeigebar darstellen, und diese dann auch mit der windows taskbar api in der taskleiste anzeigen, alles soweit fertig, nur weiß ich nicht, wie ich das auslesen kann ... dankeschön
    Das kannst du auch direkt im WMP-Control machen:

    VB.NET-Quellcode

    1. AxWindowsMediaPlayer1.currentMedia.durationString 'gibt die Laufzeit der aktuell abgespielten Datei im Format mm:ss aus; Alternativ gibt .duration den Wert in Sekunden aus
    2. AxWindowsMediaPlayer1.currentMedia.name 'gibt den ID3 Title-Tag aus, falls dieser vorhanden ist. Falls kein ID3-Tag vorhanden ist, ist der Rückgabewert identisch mit dem Dateinamen (ohne .mp3 Endung)
    3. AxWindowsMediaPlayer1.currentMedia.sourceURL 'Gibt den kompletten Pfad zur Datei zurück, welche gerade abgespielt wird
    4. AxWindowsMediaPlayer1.Ctlcontrols.currentPositionString 'Gibt die aktuelle Abspielposition zurück im Format mm:ss. Wenn du es genauer haben willst oder die Abspielposition manuell setzen möchtest, dann benutzt du .currentPosition (welche den Wert in Sekunden inklusive Nachkommastellen enthält)
    ah, danke, flash, nach sowas hab ich gesucht, ich wusste, dass es sowas gibt, habs nur nicht gefunden :(

    ist es irgentwie möglich, die ausgabe zu splitten, sodass bei der gesamten länge anstatt 03:56 0356 rauskommt, und die bisher abgespielte länge auch? denn dann könnte man ja das einfach eintragen und müsste das nicht in prozent oder so umrechnen..

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

    du kannst es auch mit der gesammtzahl der bytes und der bitrate berechnen.


    ähh... ja..., davon versteh ich leider nicht viel... sry^^

    Dim zeit As integer

    Zeit = axwmp.currentmedia.duration.Replace(":","")


    dankeschön, GENAU sowas hab ich gesucht ;) ich denke, damit ist dieses thema endlich gelöst...edit: wenn kein fehler kommt... und es kommt einer^^

    also, hier ist jetzt mal der code:

    VB.NET-Quellcode

    1. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsPlaying Then 'wenn er spielt
    2. If Not AxWindowsMediaPlayer1.URL = "http://www.wdr.de/wdrlive/media/einslive.asx" Then 'und wenn nicht 1Live läuft dann
    3. API.Show() 'Form öffen(die minianzeige mit der W7 Taskbar API)
    4. Label1.Text = AxWindowsMediaPlayer1.currentMedia.durationString 'Label 1 = die gesamtlaufzeit des aktuellen liedes
    5. API.Timer1.Start() 'Der Timer bewirkt, dass in der Taskbar die laufzeit angezeigt wird
    6. ZeitMoment = API.Label1.Text.Replace(":", "") 'Die Variable, dort kommt immer ein fehler, wenn ich zum nächsten lied wechsle.(Ungültige Konvertierung von der Zeichenfolge in Typ Integer.)
    7. ZeitLied = Label1.Text.Replace(":", "") 'Das gleiche, bloß dieses mal gesamtlaufzeit
    8. API.ProgressBar1.Value = 'Zuordnung
    9. API.ProgressBar1.Maximum = ZeitLied 'wieder das gleiche...
    10. End If
    11. Else 'wenn kein Lied läuft, wird form geschlossen
    12. Api.hide
    13. End If


    das ganze ist in einem timer event, das ab start der form läuft...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Betzi“ ()

    Also vorweg gesagt kann der von Slayers gepostete Code nicht passen, weil .duration einen Rückgabewert im Double-Format ergibt. Eine Abspieldauer von zB 3:56 würde bei .duration also "236,1234567" (3x60+56 + sieben Nachkommastellen) ergeben. .durationString hingegen gibt wie man schon erahnen kann einen String im Format "03:56" zurück. So wie du mit den Zeitangaben im Integer-Format von "mmss" arbeiten möchtest, wäre der korrekte Code folgender:

    VB.NET-Quellcode

    1. Dim ZeitMoment, ZeitLied As Integer
    2. ZeitMoment = AxWindowsMediaPlayer1.Ctlcontrols.currentPositionString.Replace(":", "") ' aktuelle Abspielposition
    3. ZeitLied = AxWindowsMediaPlayer1.currentMedia.durationString.Replace(":", "") ' komplette Länge der aktuell abgespielten Datei


    Allerdings wäre meine Empfehlung, dies anders zu lösen, wenn du tatsächlich eine Progressbar damit aktualisieren möchtest. Wieso dies nach deiner Art und Weise nicht so klug ist, lässt sich auch sehr einfach erklären: eine Abspielposition bei 59 Sekunden ergäbe einen Wert von 59, während der Wert nur eine Sekunde später auf 100 ansteigt - das inherente Problem einer Zeitenberechnung. Wenn du also mit diesen Werten rechnen möchtest oder sie irgendwie darstellen willst, wie hier geschehen mit einer Progressbar, dann ist die einfachste und logische Methode, die Zeitwerte in Sekunden umzurechnen. In diesem Fall musst du das gar nicht manuell umrechnen, weil du diese Sekunden-Werte bereits direkt erhalten kannst. Ich würds also wie folgt lösen:

    VB.NET-Quellcode

    1. Dim ZeitMoment, ZeitLied As Integer
    2. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsPlaying Then 'wenn er spielt
    3. If Not AxWindowsMediaPlayer1.URL = "http://www.wdr.de/wdrlive/media/einslive.asx" Then 'und wenn nicht 1Live läuft dann
    4. API.Show() 'Form öffen(die minianzeige mit der W7 Taskbar API)
    5. Label1.Text = AxWindowsMediaPlayer1.currentMedia.durationString 'Label 1 = die gesamtlaufzeit des aktuellen liedes
    6. API.Timer1.Start() 'Der Timer bewirkt, dass in der Taskbar die laufzeit angezeigt wird
    7. ZeitMoment = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition ' aktuelle Abspielposition
    8. ZeitLied = AxWindowsMediaPlayer1.currentMedia.duration ' komplette Länge der aktuell abgespielten Datei
    9. API.ProgressBar1.Value = ZeitMoment 'Zuordnung
    10. API.ProgressBar1.Maximum = ZeitLied 'wieder das gleiche...
    11. End If
    12. Else 'wenn kein Lied läuft, wird form geschlossen
    13. Api.hide
    14. End If
    15. End If
    Welcher Fehler wird dir denn angezeigt? Das hast du bisher noch in keinem Beitrag genau erwähnt, für die Fehlersuche ist das aber sehr wichtig.

    In jedem Fall verursacht mein sehr einfacher Code bestimmt keinen Fehler, das wusste ich schon als ich ihn hier im Forum getippt habe. Nach deinem neuesten Post habe ich das mal fix im Visual Studio nachgebaut und folgender Code funktioniert perfekt zur Steuerung einer Progressbar mit Daten vom Windows Media Player Control:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    3. Dim ZeitMoment, ZeitLied As Integer
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. AxWindowsMediaPlayer1.URL = "C:\test.mp3"
    6. End Sub
    7. Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
    8. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsPlaying Then
    9. If Not AxWindowsMediaPlayer1.URL = "http://www.wdr.de/wdrlive/media/einslive.asx" Then
    10. SendMessage(ProgressBar1.Handle, 1040, 1, 0)
    11. Timer1.Start()
    12. End If
    13. ElseIf AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsPaused Then
    14. SendMessage(ProgressBar1.Handle, 1040, 3, 0)
    15. Timer1.Stop()
    16. Else
    17. Timer1.Stop()
    18. ProgressBar1.Value = 0
    19. ZeitMoment = Nothing
    20. ZeitLied = Nothing
    21. End If
    22. End Sub
    23. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    24. ZeitMoment = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition
    25. ZeitLied = AxWindowsMediaPlayer1.currentMedia.duration
    26. Label1.Text = "ZeitMoment: " & ZeitMoment
    27. Label2.Text = "ZeitLied: " & ZeitLied
    28. ProgressBar1.Maximum = ZeitLied
    29. ProgressBar1.Value = ZeitMoment
    30. End Sub
    31. End Class
    Bilder
    • Test_WmpControl.jpg

      10,24 kB, 311×208, 271 mal angesehen