Rubrik: Multimedia & Sound · Audio | VB-Versionen: VB2005, VB2008 | 14.04.10 |
MP3 im Loop abspielen Eine kleine MP3Player-Klasse, mit der sich MP3-Dateien sehr einfach im Loop abspielen lässt. | ||
Autor: Dieter Otter | Bewertung: | Views: 11.083 |
www.tools4vb.de | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie man eine MP3-Datei abspielt, haben wir Ihnen bereits in früheren Tipps & Tricks gezeigt, u.a. auch die API-Variante. Und genau auf dieser Variante baut unser heutiger Tipp auf.
Diesmal zeigen wir Ihnen, wie sich eine MP3-Datei im Loop abpsielen lässt, d.h. sobald der Abspielvorgang beendet ist, lässt sich die MP3-Datei optional erneut abspielen.
Den Code für den Abspielvorgang kapseln wir in ein kleines Klassenmodul, das autom. ein Event auslöst, wenn der Abspielvorgang beendet ist. Auf diese Weise kann mit in der Anwendung dann ganz einfach den Abspielvorgang wiederholen.
''' <summary> ''' MP3Player-Klasse zum Abspielen von MP3-Dateien ''' </summary> Public Class MP3Player ' Benötigte API-Funktion Private Declare Function mciSendString Lib "winmm.dll" _ Alias "mciSendStringA" ( _ ByVal lpszCommand As String, _ ByVal lpszReturnString As String, _ ByVal cchReturnLength As Integer, _ ByVal hwndCallback As Integer) As Integer ''' <summary> ''' Wird ausgelöst, wenn die MP3-Datei vollständig abgespielt wurde ''' </summary> Public Event Finished(ByVal sender As Object, ByVal e As EventArgs) ' Timer Private WithEvents oTimer As Timer ' Eigenschaften Private m_Filename As String = "" Private m_Alias As String = "" Private m_IsOpened As Boolean = False Private m_IsPlaying As Boolean = False ' Hilfsfunktion: ' MCI-Kommando senden und "Ergebnis" zurückgeben Private Function SendCommand(ByVal sCmd As String) As Integer Dim sReturn As String = Strings.Space(256) Dim nResult As Integer = mciSendString(sCmd, sReturn, sReturn.Length, 0) Return Val(sReturn) End Function
''' <summary> ''' Initialisiert die Klasse und lädt die angegebene MP3-Datei ''' </summary> ''' <param name="Filename">MP3-Datei</param> Public Sub New(ByVal Filename As String) m_Filename = Filename m_Alias = "MP3_" & Now.ToString("HHmmss") & CStr(Now.Millisecond) ' MCI öffnen m_IsPlaying = False m_IsOpened = (mciSendString("open " & Chr(34) & m_Filename & Chr(34) & _ " type MPEGVideo alias " & m_Alias, 0, 0, 0) = 0) ' Timer erstellen oTimer = New Timer oTimer.Interval = 500 oTimer.Enabled = False End Sub
''' <summary> ''' Gibt True zurück, wenn die MP3-Datei abgespielt werden kann ''' </summary> Public ReadOnly Property CanPlay() As Boolean Get Return m_IsOpened End Get End Property
''' <summary> ''' Startet den Abspielvorgang ''' </summary> Public Function Play() As Boolean If m_IsOpened Then m_IsPlaying = (SendCommand("play " & m_Alias & " from 0") = 0) ' Timer starten oTimer.Start() Return m_IsPlaying End If End Function
''' <summary> ''' Gibt True zurück, während die MP3-Datei abgespielt wird ''' </summary> Public ReadOnly Property IsPlaying() As Boolean Get Return m_IsPlaying End Get End Property
''' <summary> ''' Beendet den aktuellen Abspielvorgang ''' </summary> Public Sub [Stop]() If m_IsOpened AndAlso m_IsPlaying Then SendCommand("stop " & m_Alias) m_IsPlaying = False End If ' Timer stoppen oTimer.Stop() End Sub
''' <summary> ''' Beendet den Abspielvorgang und schließt die MP3-Datei ''' </summary> Public Sub Close() If m_IsOpened Then If m_IsPlaying Then Me.Stop() SendCommand("close " & m_Alias) m_IsOpened = False End If End Sub
Private Sub oTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles oTimer.Tick ' Prüfen, ob MP3 noch abgespielt wird Dim MP3Pos As Integer = SendCommand("status " & m_Alias & " position") Dim MP3Len As Integer = SendCommand("status " & m_Alias & " length") If MP3Pos >= MP3Len Then oTimer.Stop() ' Ereignis auslösen RaiseEvent Finished(Me, e) End If End Sub
Protected Overrides Sub Finalize() Me.Close() MyBase.Finalize() End Sub
End Class
Aufrufbeispiel:
' MP3Player-Klasse Private WithEvents MP3Play As MP3Player
' MP3-Datei laden und abspielen MP3Play = New MP3Player("d:\MyMP3.mp3") If MP3Play.CanPlay Then MP3Play.Play() End If
Private Sub MP3Play_Finished(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MP3Play.Finished If MsgBox("MP3 noch einmal abspielen?", _ MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then MP3Play.Play() End If End Sub