| |
VB & Windows APImcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 16.11.10 19:13 |
| Brauche kleine Hilfestellung für VB Anfänger
zum abspielen von mp3 files habe ich den Abspielbutton so belegt:
Dim sFilename
Dim TI
Dim IP
sFilename = Me!DateiName
TI = Me!Titel
IP = Me!Interpret
MP3_Play sFilename, "MyAlias"
Me!Label1.Caption = TI & " - " & IP
... spielt nur den aktuellem Datensatz ab
wenn ich alle (oder die restlichen) Datensätze abspielen will,
komme ich einfach nicht weiter | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Martoeng (Moderator) | Datum: 17.11.10 13:21 |
| Also erstmal werden Variablen IMMER mit Typ deklariert!
Ich nehme mal an, Du lädtst Titel aus einer Datenbank.
Wenn Du die nun abspielen möchtest, musst Du den ersten nehmen, abspielen, einen Datensatz weiterspringen und wieder abspielen, letztlich ein Schleifenkonstrukt.
Da Du aber vermutlich zwischendurch noch Kontrolle über Dein Programm haben möchtest, solltest Du vielleicht einfach erstmal einen Next-Button implementieren, mit dem Du im Datenbank-Resultset weiterspringst und den nächsten Titel abspielst.
Da Du nicht schreibst, was Du verwendest, mal allgemein:
Sub cmdNext_Click()
datenobjekt.Next
sFilename = datenobjekt!Dateiname
sTitel = datenobjekt!Titel
sInterpret = datenobjekt!Interpret
MP3_Play sFilename, "MyAlias"
lblInfo.Caption = sInterpret & " - " & sTitel
End Sub vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com. | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 17.11.10 15:11 |
| Hi Martoeng,
danke erstmal für die Antwort. Die entsprechenden Buttons für Previous und Next habe ich bereits in meinem Projekt - funktioniert auch.
Mein Problem etwas genauer:
Mit dem "Play-Button" soll ab dem aktuellen Datensatz (Position und restliche Datensätze ausrechnen funktioniert) der Rest einer nach dem anderen abgespielt werden.
Mit
Dim P ' Nummer aktueller Datensatz
Dim A ' Anzahl der Datensätze der Tabelle
P = Me!DNS ' Aktuellen Datensatz holen
A = AnzahlDatensätze("tbl_Musik_Aufsteigend sortiert") 'Gesamtanzahl in Tab
For I = 0 To A - P
MP3_Play ...
I = I + 1
Next
wird jedes Lied nur angespielt, aber nicht komplett abgepielt.
Wahrscheinlich fehlt mir einfach ausgedrückt nur
"Lied zu Ende"
Nächstes abspielen.
Gruß
Peter | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 18.11.10 00:03 |
| Hi Martoeng,
vorweg noch folgendes - ich versuche den Player in eine Access 2003 zu integrieren - mit Musik geht alles leichter.
hab mal folgendes probiert:
Timer im Form auf 1000 eingestellt
Dim sFilename
sFilename = Me!DateiName
MP3_Play sFilename, "MyAlias" ' Aktuellen Datensatz abspielen
Dim lCurPos As Long
Dim lLength As Long
' aktuelle Position auslesen
lCurPos = MP3_CurPos("MyAlias")
' Gesamtspielzeit auslesen
lLength = MP3_GetLength("MyAlias")
' Prüfen, ob am Ende angelangt und ggf.
' neues Lied spielen
If lCurPos >= lLength Then ' wenn beides gleich
DoCmd.GoToRecord , , acNext ' next Titel
sFilename = Me!DateiName
Me!Numma = Me!DNS
MP3_Play sFilename, "MyAlias"
End If Die Bedingung wird zwar erreicht (MsgBox lCurPos & " " & lLength) aber weiter gehts nicht. Entsprechende Steuerelemente für Spielzeit, Position
und Restzeit werden korrekt aktualisiert.
Gruß
Leo_N | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 18.11.10 12:43 |
| hab nach Deinem Vorschlag "Stop_MP3" eingefügt
me
sFilename = Me!DateiName
Dim lCurPos As Long
Dim lLength As Long
' aktuelle Position
lCurPos = MP3_CurPos("MyAlias") '
' Gesamtspielzeit
lLength = MP3_GetLength("MyAlias")
' Prüfen, ob am Ende angelangt und ggf.
' neues Lied spielen
If lCurPos >= lLength Then
MP3_Stop "MyAlias"
DoCmd.GoToRecord , , acNext
sFilename = Me!DateiName
MP3_Play sFilename, "MyAlias"
End If
End Sub]
aber mit dem gleichen Erfolg ...
es wird lediglich ein Titel abgespielt.
Den Timer habe auch mal auf 0 gesetzt. Dient eigentlich nur zur aktualisierung der Positions- und Restzeitanzeige. | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 18.11.10 17:19 |
| Hab Dir die Textdateien gesandt ..
Leo_N | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 18.11.10 23:52 |
| Hab noch einen "Repeat-Button" eingefügt
Im Modul
nction MP3_Repeat(ByVal sAlias As String) As Long
' ---------------------------------
' Momentan gespielte MP3 wiedeholen
' ---------------------------------
Dim sBuffer As String * 255
On Error Resume Next
mciSendString "play " & sAlias & " repeat", sBuffer, 0, 0
MP3_Repeat = Val(sBuffer)
End Function
]
und im frm
ub cmdRepeat_Click()
' -----------------
' Titel wiederholen
' -----------------
On Error Resume Next
MP3_Repeat "MyAlias"
End Sub
]
Gruß
Leo_N | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 20.11.10 00:02 |
| Hi Martoeng,
ich kriegs nicht hin - ich schicke dir mal die komlette Access.mdb.
Schau bitte mal drüber.
Dank Dir | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 20.11.10 00:09 |
| Sorry ging nicht
Hast du eine andere Lösung, ich habe das mit dem Timer probiert.
Hat aber auch nicht geklappt.
Ich schicke morgen nochmal den gesamten VBA Code.
Gruß
Leo_N | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 22.11.10 11:01 |
| Hi Martoeng,
habe Deinen Vorschlag wie folgt umgesetzt:
Private Sub Form_Timer()
Dim lCurPos As Long
Dim lLength As Long
' aktuelle Position ermitteln
lCurPos = MP3_CurPos("MyAlias")
' Gesamtspielzeit ermitteln
lLength = MP3_GetLength("MyAlias")
' Prüfen, ob am Ende angelangt und ggf.
' neues Lied spielen
If lCurPos >= lLength Then
MP3_Stop "MyAlias"
DoCmd.GoToRecord , , acNext
sFilename = Me!DateiName
Me!Numma = Me!DNS
MP3_Play sFilename, "MyAlias"
End If
End Sub Leider wird dann überhaupt kein mp3-File mehr abgespielt. Wahrscheinlich
weil die aktuelle Position bereits gleich der Spieldauer ist. Beide haben den
den Wert 0.
Auch der folgende Versuch hatte nur teilweise Erfolg
Private Sub Form_Timer()
If MP3_IsPlaying("MyAlias") = False Then
MP3_Stop "MyAlias"
DoCmd.GoToRecord , , acNext
sFilename = Me!DateiName
Me!Numma = Me!DNS
MP3_Play sFilename, "MyAlias"
End If
End Sub Hier wird zwar die erste mp3 abgespielt, aber danach wird im Sekundentakt um
einen Datensatz weitergeschaltet ohne die Datei abzuspielen.
Die Funktion
Public Function MP3_IsPlaying(ByVal sAlias As String) As Long
' -------------------------------------------
' Prüfen ob momentan gespielte MP3 noch läuft
' -------------------------------------------
Dim sBuffer As String * 255
mciSendString "status " & sAlias & " mode", sBuffer, Len(sBuffer), 0
MP3_IsPlaying = (Mid$(sBuffer, 1, 7) = "playing")
End Function gibt auch brav "TRUE" zurück so lange noch ein Lied läuft.
Mein Abspielbutton ist wie folgt definiert
Private Sub cmdPlayAll_Click()
Dim sFilename
sFilename = Me.DateiName
MP3_Play sFilename, "MyAlias"
Label1.Caption = Me.DateiName
End Sub bin am verzweifeln | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 25.11.10 00:00 |
| Hallo allerseits,
mittlerweile bin ich Dank Hinweis von Martoeng auf das „wait-flag“ etwas weiter gekommen.
Beim PLAY/ALL Button habe ich folgende SUB
code]
[Private Sub cmdPlayAll_Click()
' ----------------------------------------------------------------------
' Das ist die Routine, die zwar funktioniert aber nicht wie sie soll ...
' In der Funktion ist bei "play" das "wait-flag" gesetzt - der Ablauf
' wird angehalten bis der Titel vollständig abgepielt ist.
' ... mciSendString("play " & sAlias & " wait", 0, 0, 0) = 0 ...
' Auch der Sprung zum nächsten Datensatz ( 3 x ) funktioniert.
' Allerdings ist ein manueller Eingriff (z.B. Command-Button) gesperrt.
' ----------------------------------------------------------------------
Label1.Caption = ""
Dim sFilename as String
Dim TI as String
Dim IP as String
Dim F as Long
F = MP3_IsPlaying("MyAlias")
If F = 0 Then
Do Until Z = 3 ' Zum Testen auf 3 Durchläufe gesetzt
sFilename = Me!DateiName
MP3_Play_All sFilename, "MyAlias"
TI = Me!Titel
IP = Interpret
Label1.Caption = TI & " - " & IP
Me!lblDauer.Caption = MP3_GetLength("MyAlias")
Me!lblVolume.Caption = MP3_GetVolume("MyAlias")
Me!LST = MP3_GetVolume("MyAlias")
Me!L = sFilename
Me!Numma = Me!DNS
Z = Z + 1
MP3_Stop "MyAlias"
MP3_Close "MyAlias"
DoCmd.GoToRecord , , acNext
Loop
Else
End If
End SubWie oben bereits erwähnt hat das ganze einen Haken …
Die zugehörige Funktion sieht so aus
Public Function MP3_Play_All(ByVal sFile As String, ByVal sAlias As String) As _
Boolean
' ------------------------------------
' MP3-Datei ganz abspielen
' ------------------------------------
Dim bResult As Boolean
Dim I
' Dateinamen in DOS 8.3 Format, da z.B. Sonderzeichen
' wie Leerzeichen Probleme machen
Dim sBuffer As String
Dim lResult As Long
sBuffer = Space$(255)
lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
If lResult <> 0 Then
sFile = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
' MCI öffnen
lResult = mciSendString("open " & sFile & " type MPEGVideo alias " & _
sAlias, 0, 0, 0)
' Standarlautstärke setzen
MP3_SetVol sAlias, 200
If lResult = 0 Then
' MP3 abspielen -- wait --
If mciSendString("play " & sAlias & " wait", 0, 0, 0) = 0 Then
bResult = True
End If
End If
End If
MP3_Play_All = bResult
End Function Der Zeitgeber im Access Formular Form_frm_MCI sieht so aus
Private Sub Form_Timer()
'-----------------------------------------------------------------------
' Spielzeit, aktuelle Position und Restzeit im Formular frm_MCI anzeigen
' ----------------------------------------------------------------------
Label1.Caption = ""
' Uhrzeit anzeigen
Clock.Caption = Time
Dim sFilename
Dim TI As String
Dim IP As String
sFilename = Me.DateiName
TI = Me.Titel
IP = Me.Interpret
Label1.Caption = TI & " - " & IP
lblDauer.Caption = MP3_GetLength("MyAlias")
lblPosition.Caption = MP3_CurPos("MyAlias")
lblRestspielzeit.Caption = MP3_GetLength("MyAlias") - MP3_CurPos("MyAlias")
lblVolume.Caption = MP3_GetVolume("MyAlias")
Me.LST = MP3_GetVolume("MyAlias")
Me.SPZ = MP3_GetLength("MyAlias")
Me.AktPos = MP3_CurPos("MyAlias")
Me.RSZT = MP3_GetLength("MyAlias") - MP3_CurPos("MyAlias")
Me.Numma = Me.DNS
Me!L = Me.DateiName
End Sub Noch eine andere Frage: Wie beende ich eine laufende Prozedur aus einer anderen heraus
Also simpel gesagt, wenn ich den STOP Button drücke, soll die Abspiel Routine abgebrochen werden. Dies bezieht sich auf eine andere – nicht auf obige mit „wait“.
Gruß
Leo_Nardo | |
Re: mcisendstring mp3 dateien abspielen | | | Autor: Leo_Nardo | Datum: 19.12.10 17:56 |
| Hi Martoeng,
sorry war 2 Wochen in Malta - deswegen erst jetzt meine Antwort.
Dein Angebot klingt verlockend - danke Dir erstmal ...
Hab's inzwischen hingekriegt, zwar nicht unbedingt die sauberste Loesung, aber es funktioniert:
Private Sub cmdPlayAll_Click()
' ---------------------------------------------
'
' Restliche mp3 ab aktueller Position abspielen
'
' ---------------------------------------------
Label1.Caption = ""
Dim sFilename As String
Dim L As Long
Dim A As Long
On Error GoTo err
A = AnzahlDatensaetze("tbl_Musik")
Do Until Z = A - Me.DNS
sFilename = Me!DateiName
MP3_Play sFilename, "MyAlias"
Z = Z + 1
' Liedlänge (Millisekunden) auslesen
L = MP3_GetLength("MyAlias")
Me.Titel.SetFocus
Me.Label1.Caption = Me.Titel & " - " & Me.Interpret
' Wartezeit in Millisekunden an DelayMilSec übergeben
DelayMilSec (L)
MP3_Stop "MyAlias"
MP3_Close "MyAlias"
DoCmd.GoToRecord , , acNext
Loop
err:
End Sub Die Anzeigen von Spielzeit, Position und Restspielzeit aktualisiert, wie Du vorgeschlagen hast, der Timer im Access-Formular. Prevoius, Next, Mute, Pause, Repeat und Intro ( 7 Sekunden anspielen) funktionieren auch.
Public Sub DelayMilSec(mSekunden As Long)
' --------------------------------------
' Warteschleife mit Millisekundenvorgabe
' --------------------------------------
Dim TimeOut As Long
TimeOut = (GetTickCount) + mSekunden
Do
DoEvents
Loop Until TimeOut < (GetTickCount) Ok und nun der Haken - wenn ich einen Button mit einer anderen Funtion aufrufen will - muss ich die STOP-Taste drücken - dort ist "End" hinterlegt
um cmdPlayAll abzuschiessen (das Gleiche ist beim Beenden-Button eingefügt). Aber damit kann man leben.
Hab doch noch eine Frage:
Wie realisiere ich eine graphische Anzeige der aktuellen Position und der aktuellen Lautstärke - allerdings ohne die "gängigen" Progressbars.
Einfach ausgedrückt ein Textfeld das entsprechend gefüllt oder bei weniger Lautstärke entsprechend geleert wird.
Dank Dir
Gruß
Leo_Nardo | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|