# Musik wiedergabe



## Stephan Boettcher (23. Januar 2005)

Guten Abend,

Ich habe diesen Programmcode:


```
Option Explicit

' Benötigte API-Deklarationen
Public Declare Function mciSendString Lib "winmm.dll" _
  Alias "mciSendStringA" ( _
  ByVal lpstrCommand As String, _
  ByVal lpstrReturnString As String, _
  ByVal uReturnLength As Long, _
  ByVal hwndCallback As Long) As Long

Public Declare Function GetShortPathName Lib "kernel32" _
  Alias "GetShortPathNameA" ( _
  ByVal lpszLongPath As String, _
  ByVal lpszShortPath As String, _
  ByVal cchBuffer As Long) As Long

Public Enum mciType
  fromVideo = 0
  fromSound = 1
End Enum

' Multimedia-Datei öffnen
' Falls es sich um eine Videoausgabe handelt, erwartet die Funktion
' das Fensterhandle des Ausgabe-Controls (z.B. PictureBox oder Form)
' als 2. Parameter (hwnd_Output)
Public Sub mciOpen(ByVal sFile As String, _
  Optional ByVal hwnd_Output As Long = 0)
  
  Dim sBuffer As String * 255
  Dim sType As String
  Dim nResult As Long
  Dim sExt As String
  Dim bVideo As Boolean
  
  On Error Resume Next
  
  ' kurzen Dateinamen ermitteln
  nResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
  sFile = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)

  ' Multimedia-Typ ermitteln
  sType = mciGetType(sFile, bVideo)
  
  ' File öffnen
  mciSendString "open " & sFile & " type " & sType & " alias TempMCI", 0, 0, 0
  DoEvents

  ' Zeitformat auf Millisekunden einstellen
  mciSendString "set TempMCI time format milliseconds", 0, 0, 0
  DoEvents

  ' Falls es sich um eine Video-Datei handelt...
  If bVideo And hwnd_Output <> 0 Then
    mciSendString "window TempMCI handle " & CStr(hwnd_Output), 0, 0, 0
  End If
End Sub

' Multimedia-Datei abspielen
Public Sub mciPlay(Optional nFromPos As Long = 0)
  On Error Resume Next
  mciSendString "play TempMCI from " & CStr(nFromPos), 0, 0, 0
  mciSendString "put TempMCI destination", 0, 0, 0
End Sub

' Multimedia-Datei schließen
Public Sub mciClose()
  On Error Resume Next
  mciSendString "close TempMCI", 0, 0, 0
End Sub

' Abspielvorgang stoppen
Public Sub mciStop()
  On Error Resume Next
  mciSendString "stop TempMCI", 0, 0, 0
End Sub

' Pause
Public Sub mciPause()
  On Error Resume Next
  mciSendString "pause TempMCI", 0, 0, 0
End Sub

' Weiterspielen
Public Sub mciResume()
  On Error Resume Next
  mciSendString "resume TempMCI", 0, 0, 0
  mciSendString "put TempMCI destination", 0, 0, 0
End Sub

Public Function mciGetLength() As Long
  Dim sBuffer As String * 255

  On Error Resume Next
  mciSendString "status TempMCI length", sBuffer, Len(sBuffer), 0
  mciGetLength = Val(sBuffer)
End Function

Public Function mciGetStatus() As String
  Dim sBuffer As String * 255

  On Error Resume Next
  mciSendString "status TempMCI mode", sBuffer, Len(sBuffer), 0
  mciGetStatus = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
End Function

Public Function mciGetCurPos() As Long
  Dim sBuffer As String * 255
  
  On Error Resume Next
  mciSendString "status TempMCI position", sBuffer, Len(sBuffer), 0
  mciGetCurPos = Val(sBuffer)
End Function

' Millisekunden nach mm:ss umrechnen
 Public Function mciFormatTime(ByVal nMSec As Long) As String
  Dim nMin As Integer
  Dim nSec As Integer

  nSec = Int(nMSec / 1000)
  nMin = Int(nSec / 60)
  nSec = nSec - (nMin * 60)
  mciFormatTime = Format$(nMin, "00") & ":" & Format$(nSec, "00")
End Function

' Multimedia-Typ ermitteln
Public Function mciGetType(ByVal sFile As String, _
  ByRef bVideo As Boolean) As String

  Dim sExt As String
  
  bVideo = False
  If InStr(sFile, ".") > 0 Then
    sExt = Right$(sFile, Len(sFile) - InStrRev(sFile, ".", Len(sFile)))
    Select Case LCase(sExt)
      Case "mid", "midi"
        mciGetType = "Sequencer"
      Case "rmi"
        mciGetType = "Sequencer"
      Case "wav"
        mciGetType = "waveaudio"
      Case "cda"
        mciGetType = "CDAudio"
      Case "aif", "aifc", "aiff", "au", "mp3", "snd"
        mciGetType = "MPEGVideo"
      Case "wma"
        mciGetType = "MPEGVideo2"
      Case "mpeg", "mpg", "m1v", "mp2", "mpa", "mpe"
        mciGetType = "MPEGVideo"
        bVideo = True
      Case "avi"
        mciGetType = "AVIVideo"
        bVideo = True
      Case "wmv"
        mciGetType = "MPEGVideo2"
        bVideo = True
      Case Else
        mciGetType = "MPEGVideo"
    End Select
  End If
End Function
```


Mein Problem ist es, ich habe auf eine Form 2 "Player" gebastelt.
Wie kann ich jetzt gleichzeitig 2 Titel abspielen lassen?

Wenn ich bei Player1 musik starte, danach bei Player 2 ein anderes Lied starten will, bricht Lied 1 ab.


Gibt es ne möglichkeit 2 Lieder abzuspielen?
Wenn ja wie?


Danke euch!


----------



## Geisel (23. Januar 2005)

Hallo,

 ich weiss zwar nicht wie man 2 Titel Parallel abspielen kann aber mit MCI geht nur einer zu spielen ! Schau mal nach einer Lösung mit DirectSound das müsste ja gehen ... 
 nur bevor du weiter an MCI testest ist es besser nach einem anderen Weg zu suchen ...

 sorry 

 Geisel

 Es gibt 10 arten von Menschen, die jenigen die Binär verstehen,
  und die jenigen die Binär nicht verstehn


----------



## Stephan Boettcher (23. Januar 2005)

Kannst du mir soeinen Codeteil zeigen?
Bin noch recht neu in sachen VB.


Danke dir


----------



## Geisel (23. Januar 2005)

Hola,

   na ja ich muss gleich in die Nachtschicht ... aber wenns dir hilft eine kleine Einführung in
   Direct Sound bei www.vbfun.de ist ganz gut und immer schön wenn man weiss wo man
  nachlesen kann . da -> http://www.vbfun.de/vb/directx/directx014.shtml 
    viel Spass damit  ...

   Geisel

   Vb is auch nur ne Sprache


----------



## spirit (24. Januar 2005)

Hallo

Benutze doch einfach das MediaControl. Damit habe ich mir einen Player geproggt, bei dem es möglich zwischen 2 bis 20  verschiedene Titel abzuspielen. Damit ist auch möglich ganz einfach einen Überblendeffekt zu proggen


----------



## Stephan Boettcher (24. Januar 2005)

spirit hat gesagt.:
			
		

> Hallo
> 
> Benutze doch einfach das MediaControl. Damit habe ich mir einen Player geproggt, bei dem es möglich zwischen 2 bis 20  verschiedene Titel abzuspielen. Damit ist auch möglich ganz einfach einen Überblendeffekt zu proggen




Hallo,

Den "Überblendeffekt" möchte ich auch haben 

Das Eine Lied hört auf und das neue Fängt an ( fängt an wenn das andere Lied 2 in 2 sek zu ende ist )

Das will ich erreichen aber MediaControl, dann hat man immer dieses Bild vom Windows Media Player und das möchte ich nicht.

( Mit dem DirectSound werd ich mir mal ansehen )

Danke!


----------



## spirit (24. Januar 2005)

Wer sagt das du das du ein Bild vom Mediaplayer siehst Stell die Eigenschaft des PlayerControls "visible" auf false und schon siehst du nix mehr  Also einfacher geht es nicht!


----------



## wimmer5 (31. Januar 2005)

Hi.
 ich probiere schon seit Tagen mit der oben beschriebenen Methode Videos im loop abzuspieln. klappt auch bei manchen, andere laufen viel zu schnell ab.
 (ich hab alle codecs installiert,)

 woran liegt das dass er manche zu schnell abspielt..

 und wie kann ich die repeatfunktion anschalten, sodass das video im loop läuft?

 gruß 
 wimma


----------



## wimmer5 (31. Januar 2005)

ausserdem habe ich grade bemerkt, dass auf die mci methode nicht alle filme abgespielt werden können..


 z.b. die angehängte datei.

 einer ne idee wie ich am besten einen player mache, der mölichst viele video dateien abspielen kann, vollbild und im loop? (repeat)


 anbei eine datei die nicht abgespielt werden kann..

 hmm blöd is zu gross (242k)
 sind auf jeden fall wmv dateien die nicht abgespielt werden können.
 obwohls unter windows geht..

 ich such mal noch nach nem anderen film..-.


----------



## wimmer5 (31. Januar 2005)

Ja gut. so wie es aussieht kann er keine einzige wmv datei abspielen.


 wenn ihr dennoch eine besipieldatei brauch .. schreiben...


----------



## Shakie (31. Januar 2005)

Bei mir geht das Abspielen von wmv-Dateien problemlos!
Verwendest du den alten MediaPlayer oder den Neuen (Version 9.0)?


----------



## wimmer5 (31. Januar 2005)

mplayer 9.0


 allerdings..

 der mediaplayer selbst kann es abspielen. nur unter vb net.


 was kann das sein..

 und hat einer ne ahnung wie das mit dem loopen geht?


----------



## wimmer5 (31. Januar 2005)

es kommt aber auch kein fehler.. 
 der clip wird lediglich nicht abgespielt..


----------



## Orakel (6. April 2005)

Hallo zusammen,

etwas Spät, aber dennoch eine Antwort auf die Ursprüngliche Frage von Stephan Boettcher. Klar kann das MC-Interface mahr als eine Datei gleichzeitig abspielen. Wenn ich das richtig erkennen kann, hast Du ein Standardbeispiel aus dem Netz genommen. Hier liegt der Knackpunkt darin, dass der Alias-Namen für die zu öffnende Datei fix codiert ist.

mciSendString "open " & sFile & " type " & sType & " alias TempMCI", 0, 0, 0

hälst Du den Alias-Namen (in Deinem Fall "TempMCI") für die einzelnen zu spielenden Dateien variabel, kommt das Interface auch nicht in irgendwelche Konflikte. In Deinem Beispiel erkennt das Interface, dass bereits eine Datei mit diesem Alias geöffnet ist und schließt sie natürlich.

IMHO geht das nur nicht bei allen Device Typen des MCI. Der Sequencer (MIDI Files) kann immer nur eine Datei wiedergeben, auch wenn unterschiedliche Alias-Namen vergeben wurden.

Und noch was in eigener Sache. Kennt jemand ne möglichkeit diesen Überblendeffekt (also Sound 1 wird leiser und Sound 2 wird lauter) unter benutzung des MCI zu verwenden

Grüße
Das Orakel


----------

