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.
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) –
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
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. –