2017-05-31 2 views
0

Dies ist wahrscheinlich eine wirklich einfache Lösung, aber für das Leben von mir kann ich es nicht herausfinden.Wiedergabe von zwei Audioclips mit Windows Media Player-Bibliothek nicht möglich

Was ich versuche zu tun ist, zwei Audio-Clips konisch in meinem C# -Projekt zu spielen. Ich möchte jedoch nicht, dass der nächste Clip abgespielt wird, bis der erste Clip abgespielt wurde.

Zusammengefasst ist das, was ich (alten Code) tue:

public static void PlayAudioClip(string path) 
{ 
    Console.WriteLine(path) // Just so we know which file is playing. 
    wplayer.controls.stop(); 
    wplayer.URL = path; 
    wplayer.controls.play(); 
} 

public static void CharacterTalking() 
{ 
    PlayAudioClip(@"C:\Game\Audio\Hello world.mp3"); 
    PlayAudioClip(@"C:\Game\Audio\How are you today.mp3"); 
} 

Statt nun beiden Clips zu spielen hintereinander, weder Clip tatsächlich spielt. Ich konnte nicht herausfinden warum.

Ich würde bevorzugen, um die Windows Media Player-Bibliothek für diese verwenden, aber wenn Sie einen anderen Vorschlag haben, zögern Sie nicht zu teilen. Ich bin nicht verpflichtet, Windows Media Player dafür zu verwenden.

Eine ähnliche Frage geschrieben here erklärt, wie man eine Datei loop, aber das ist nicht das, was ich tun möchte. Es ist hilfreich zu erklären, dass ich einen Event-Handler verwenden kann, um den Status einer Datei zu überprüfen, aber das hat mir in dieser Lösung nicht geholfen. Oder vielleicht hat es das, und ich überdenke es nur.

EDIT: Es kommt mir vor, ich habe dies nicht früher erklärt. Entschuldigung. Angenommen, diese beiden Audiodateien, die ich angegeben habe, sind nicht die einzigen zwei das Programm wird schließlich haben. Ich möchte meine PlayAudioClip() -Funktion immer warten, bis der vorherige Clip beendet ist zu spielen.

///////////////////////////////////////

EDIT 2: Dies ist ein wirklich komplizierter Umweg, dies zu tun, aber hier ist mein neuer Versuch, mit einigen Informationen, die ich gelernt habe here.

Neuer Code:

public static List<String> Playlist = new List<string>(); 
public static void AddToPlaylist(string path) 
{ 
    Playlist.Add(path); 
    Console.WriteLine("Queued " + path); 
} 

public static void RunPlaylist() 
{ 
    PlayAudioClip(Playlist.First()); 
} 

private void Wplayer_PlayStateChange(int NewState) 
{ 
    switch (NewState) 
    { 
     case 0: 
      WriteFancyConsoleLine("PlayState = wmppsUndefined", ConsoleColor.DarkGray); 
      break; 
     case 1: 
      WriteFancyConsoleLine("PlayState = wmppsStopped", ConsoleColor.Red); 
      try 
      { 
       Playlist.Remove(Playlist.First()); 
       try 
       { 
        PlayAudioClip(Playlist.First()); 
       } 
       catch 
       { 
        WriteFancyConsoleLine("Playlist is now empty!", ConsoleColor.DarkRed); 
       } 
      } 
      catch 
      { 
       WriteFancyConsoleLine("Playlist already empty!", ConsoleColor.DarkRed); 
      } 
      break; 
     case 2: 
      WriteFancyConsoleLine("PlayState = wmppsPaused", ConsoleColor.Yellow); 
      break; 
     case 3: 
      WriteFancyConsoleLine("PlayState = wmppsPlaying", ConsoleColor.Green); 
      break; 
     case 4: 
      WriteFancyConsoleLine("PlayState = wmppsScanForward", ConsoleColor.DarkMagenta); 
      break; 
     case 5: 
      WriteFancyConsoleLine("PlayState = wmppsScanReverse", ConsoleColor.Magenta); 
      break; 
     case 6: 
      WriteFancyConsoleLine("PlayState = wmppsBuffering", ConsoleColor.Gray); 
      break; 
     case 7: 
      WriteFancyConsoleLine("PlayState = wmppsWaiting", ConsoleColor.DarkYellow); 
      break; 
     case 8: 
      WriteFancyConsoleLine("PlayState = wmppsMediaEnded", ConsoleColor.DarkRed); 
      break; 
     case 9: 
      WriteFancyConsoleLine("PlayState = wmppsTransitioning", ConsoleColor.DarkGray); 
      break; 
     case 10: 
      WriteFancyConsoleLine("PlayState = wmppsReady", ConsoleColor.Magenta); 
      break; 
     case 11: 
      WriteFancyConsoleLine("PlayState = wmppsReconnecting", ConsoleColor.Magenta); 
      break; 
     case 12: 
      WriteFancyConsoleLine("PlayState = wmppsLast", ConsoleColor.DarkBlue); 
      break; 
    } 
} 

public static void PlayAudioClip(string path) 
{ 
    WriteFancyConsoleLine("Playing " + path, ConsoleColor.Gray); 
    wplayer.controls.stop(); 
    wplayer.URL = path; 
    wplayer.controls.play(); 
} 

private void CharacterTalking() // This is where the magic happens. 
{ 
    AddToPlaylist(@"C:\Game\Audio\Hello world.mp3"); 
    AddToPlaylist(@"C:\Game\Audio\How are you today.mp3"); 
    RunPlaylist(); 
} 

jedoch der zweite Audioclip spielt immer noch nicht. Nachdem in der Konsole wmppsStopped angezeigt wird, wird versucht, den nächsten Clip abzuspielen, springt dann jedoch einige Male zwischen wmppsTransitioning und wmppsReady.

+1

Mögliches Duplikat von [Wie zu erkennen, wenn eine MP3-Datei abgespielt ist] (https://stackoverflow.com/questions/17644754/how-to-detect-when-a-mp3-file-has- Fertig spielen) –

+0

Ich stimme Camilo zu, [diese Antwort] (https://stackoverflow.com/a/17645100/783284) insbesondere kann Ihnen helfen.Ich stimme zu, dies zu schließen, aber wenn Sie feststellen, dass die Antwort in dieser Frage Sie nicht dahin bringt, wo Sie sein müssen - posten Sie Ihre Ergebnisse erneut, wo Sie sie hinbekommen haben und wo Sie feststecken. – Cody

+0

Ich glaube, ich bin letzte Nacht auf diese Antwort gestoßen, konnte sie aber nicht mehr finden, als ich diese Frage gestellt habe. Wie auch immer, das Problem mit dieser Antwort ist, dass sie in ihrem Beispiel versuchen, den gleichen Audioclip zu wiederholen. Das möchte ich hier nicht machen. Vielleicht habe ich etwas übersehen. Lass es mich nochmal versuchen. –

Antwort

1

erstellen Abspiellisten, Ihre Songs hinzufügen, dann die Liste spielen:

WMPLib.IWMPPlaylist Playlist = wplayer.newPlaylist("MyPlayList", ""); 
Playlist.appendItem(wplayer.newMedia(@"C:\Game\Audio\Hello world.mp3")); 
Playlist.appendItem(wplayer.newMedia(@"C:\Game\Audio\How are you today.mp3")); 
wplayer.currentPlaylist = Playlist; 
wplayer.controls.play(); 
+0

Ich glaube, du hast einen Tippfehler in der letzten Zeile hinterlassen, aber das könnte das sein, wonach ich suche! Gibt es eine Möglichkeit, die Wiedergabeliste auch zu löschen, wenn ich fertig bin? EDIT: Nvm, es ist wplayer.currentPlaylist.clear(); –

+0

Okay, das hat nicht funktioniert. Nur der erste Clip wird abgespielt. –

+0

Nicht sicher, was der Unterschied ist, funktioniert es perfekt auf meinem System. Ich muss auch "Ctlcontrols" anstelle von "Kontrollen" auf meinem Computer verwenden. –

0

Die Lösung für mein Problem hier gefunden:

Mediaplayer WinForm won't play

Der Grund, warum die beiden Clips gewonnen Spielen Sie nicht sofort hintereinander, weil Windows Media Player ein wenig Zeit braucht, um sich für den nächsten Clip fertig zu machen, oder er bricht zusammen.

Indem Sie stattdessen einen Boolean im Change Play-Status setzen und stattdessen das nächste Listenelement von einem Timer aufrufen, funktioniert das Programm jetzt.

public static List<String> Playlist = new List<string>(); 
public static void AddToPlaylist(string path) 
{ 
    Playlist.Add(path); 
    Console.WriteLine("Queued " + path); 
} 

public static void RunPlaylist() 
{ 
    try 
    { 
     PlayStateStopped = false; 
     PlayAudioClip(Playlist.First()); 
     Playlist.Remove(Playlist.First()); 
    } 
    catch 
    { 
     WriteFancyConsoleLine("Playlist is empty.", ConsoleColor.Red); 
    } 
} 

private void Wplayer_PlayStateChange(int NewState) 
{ 
    switch (NewState) 
    { 
     case 0: 
      WriteFancyConsoleLine("PlayState = wmppsUndefined", ConsoleColor.DarkGray); 
      break; 
     case 1: 
      WriteFancyConsoleLine("PlayState = wmppsStopped", ConsoleColor.Red); 
      PlayStateStopped = true; 
      break; 
     case 2: 
      WriteFancyConsoleLine("PlayState = wmppsPaused", ConsoleColor.Yellow); 
      break; 
     case 3: 
      WriteFancyConsoleLine("PlayState = wmppsPlaying", ConsoleColor.Green); 
      break; 
     case 4: 
      WriteFancyConsoleLine("PlayState = wmppsScanForward", ConsoleColor.DarkMagenta); 
      break; 
     case 5: 
      WriteFancyConsoleLine("PlayState = wmppsScanReverse", ConsoleColor.Magenta); 
      break; 
     case 6: 
      WriteFancyConsoleLine("PlayState = wmppsBuffering", ConsoleColor.Gray); 
      break; 
     case 7: 
      WriteFancyConsoleLine("PlayState = wmppsWaiting", ConsoleColor.DarkYellow); 
      break; 
     case 8: 
      WriteFancyConsoleLine("PlayState = wmppsMediaEnded", ConsoleColor.DarkRed); 
      break; 
     case 9: 
      WriteFancyConsoleLine("PlayState = wmppsTransitioning", ConsoleColor.DarkGray); 
      break; 
     case 10: 
      WriteFancyConsoleLine("PlayState = wmppsReady", ConsoleColor.Magenta); 
      break; 
     case 11: 
      WriteFancyConsoleLine("PlayState = wmppsReconnecting", ConsoleColor.Magenta); 
      break; 
     case 12: 
      WriteFancyConsoleLine("PlayState = wmppsLast", ConsoleColor.DarkBlue); 
      break; 
    } 
} 

public static void PlayAudioClip(string path) 
{ 
    WriteFancyConsoleLine("Playing " + path, ConsoleColor.Gray); 
    wplayer.controls.stop(); 
    wplayer.URL = path; 
    wplayer.controls.play(); 
    PlayStateStopped = false; 
} 

// Remember that timer1.Enabled = true; has to be set somewhere. 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (PlayStateStopped) 
    { 
     RunPlaylist(); 
    } 
} 
Verwandte Themen