Donnerstag, 10. Juni 2010

MP3 - Datei abspielen

Im Post Wave - Datei abspielen gab's den Trick, wie man Wave - Dateien mit C# abspielt. Jetzt möchte ich euch zeigen, wie man MP3 - Dateien abspielen kann.
Das ist auf Grund des Formats etwas komplizierter, es gibt keinen direkten, "einfachen" Befehl zum Abspielen einer MP3 - Datei, aber doch viele Möglichkeiten.
MP3 - Dateien kann man einerseits über die API - Funktion MCISendString() abspielen, doch der Code ist umständlich und nicht leicht verständlich.
Eine sehr naive Variante wäre System.Diagnostics.ProcessStart() die MP3 - Datei als Parameter zu übergeben, das Betriebssystem wird dann die Datei mit dem Standardplayer öffnen:

System.Diagnostics.Process.Start(@"C:\Dokumente und Einstellungen\Oliver\Eigene Dateien\Eigene Musik\101-darius_and_finlay_and_shaun_baker_-_show_me_10_(dj_gollum_edit).mp3");

Elegant ist diese Methode aber nicht.
Deswegen möchte ich euch heute das Einbinden des Steuerelements Windows Media Player zeigen, womit u.a. MP3s abgespielt werden können.
Das Steuerelement kann man in die Toolbox hinzufügen, in dem man rechts auf diese klickt und dann Element auswählen ... anklickt. Im sich öffnenden Fenster zu COM - Steuerelementen wechseln und Windows Media Player auswählen.
Dieser kann nun wie zum Beispiel ein Button auf dem Formular platziert werden.
Wenn der Player nur zum Abspielen für MP3s gebraucht wird, kann die Eigenschaft Visible auf false gestellt werden, so ist er für den Benutzer nicht sichtbar.
Über die Eigenschaft URL kann die abzuspielende MP3 - Datei ausgewählt werden. Normalerweise startet der Player dann direkt mit dem Abspielen der Datei.
Mittels der Eigenschaft Ctlcontrols kann sozusagen auf den geladenen Inhalt des Players zugegriffen werden, die Funktionen start() und stop() dienen zum manuellen Starten und Stoppen der Datei.
Über settings sind einige Einstellungen des Players, wie z.B. die Lautstärke änderbar.
Im folgenden Beispiel wird eine MP3 - Datei geladen, das Abspielen gestoppt und die Anwendung wartet 2 Sekunden.
Danach wird der Player auf volle Lautstärke gestellt und die Datei abgespielt:

axWindowsMediaPlayer1.URL = @"C:\Dokumente und Einstellungen\Oliver\Eigene Dateien\Eigene Musik\101-darius_and_finlay_and_shaun_baker_-_show_me_10_(dj_gollum_edit).mp3";
axWindowsMediaPlayer1.Ctlcontrols.stop();
System.Threading.Thread.Sleep(2000);
axWindowsMediaPlayer1.settings.volume = 100; // 0 = kein Ton, 100 = volle Lautstärke
axWindowsMediaPlayer1.Ctlcontrols.play();

Kommentare:

  1. Erstmal Danke für das Tutorial. Aber ich hab ein Problem, und zwar jedesmal wenn ich den .URL Befehl ausfähre, beendet mein Programm. Ich hoffe du kannst mir helfen.
    2. würd ich gerne wissen obs noch gute OpenSource Player gibt die ich anstatt des Windows Media Players einbinden könnte.

    AntwortenLöschen
  2. Hallo Tingel, tut mir Leid, ein Absturz kann viele Ursachen haben, da kann ich dir so nicht helfen. Kommt denn eine Fehlermeldung o.ä.? Kannst dich auch gerne noch per Email melden.
    Dein 2. Punkt ist echt interessant, ich denke mal du hast vielleicht den VLC Player im Kopf, über die Einbindung dessen habe ich einen neuen Post geschrieben: http://csharp-tricks.blogspot.com/
    Hoffe das hilft dir, so ist dann wahrscheinlich auch der Media Player Fehler überflüssig ;-)

    AntwortenLöschen
  3. Oh, der Link zum Post mit dem VLC Player sollte natürlich http://csharp-tricks.blogspot.com/2010/08/vlc-player-einbinden.html heißen.
    Grüße!

    AntwortenLöschen
  4. Vielleicht kann mir hier jemand helfen.

    Ich möchte die URL einer MP3- Datei an den Windows Media Player weitergeben, die aber nicht sofort wiedergegeben wird, sondern einfach nur in die Playlist eingefügt werden soll.

    Eigentlich genau so wie es beim VLC Player möglich ist, den ich aber nicht verwenden möchte, da mein Programm ohne installation einer Zusatzsoftware auskommen soll.

    Schonmal Danke!

    AntwortenLöschen
  5. Hallo Martin,

    deine Frage war also, wie man generell Mediendaten in den Player hineinlädt ohne diese direkt abzuspielen?

    Dann sollte folgendes Code Snippet die Frage beantworten:
    Im Media Player Control kann man Playlists anlegen und diesen Musik u.ä. hinzufügen.
    Die Dateien werden dann nicht direkt abgespielt, sondern erst wenn der Benutzer auf Play klickt oder die Aktion anderweitig ausgelöst wird.

    axWindowsMediaPlayer1.playlistCollection.newPlaylist("Beispielliste");
    WMPLib.IWMPMedia Lied1 = axWindowsMediaPlayer1.newMedia(@"C:\Users\User\Music\Linkin Park - The Catalyst.mp3");
    WMPLib.IWMPMedia Lied2 = axWindowsMediaPlayer1.newMedia(@"C:\Users\User\Music\Rammstein vs. Eminem - Lose your Sonne.mp3");
    axWindowsMediaPlayer1.currentPlaylist.appendItem(Lied1);
    axWindowsMediaPlayer1.currentPlaylist.appendItem(Lied2);

    Viele Grüße, hoffe das hat geholfen.

    AntwortenLöschen
  6. Genau das wollte ich wissen!
    Vielen Dank!

    AntwortenLöschen
  7. Vielen Dank
    Du hast mir sehr viel weiter geholfen.

    AntwortenLöschen
  8. Wie kann man es machen, dass ich mit einem Fortschritt Balken anzeige, wie lange die MP3 schon abspielt und wenn die MP3 zu Ende ist, dieser auch voll ist? Oder wie kann ich es machen mit einem Slider Dings (Sry, bin Anfänger in C#) wie in VLC Player so eine Leiste zu machen die auch mitgeht?

    Solltest du antworten darauf, bitte per E-Mail melden: epiclper@gmx.at Danke!

    AntwortenLöschen
  9. Hallo Epiclper,
    ich verstehe deine Frage nicht - in dem Media Player Control läuft doch standardmäßig ein Fortschrittsbalken mit der genau das gewünschte erledigt.
    Vielleicht hast du auch die Sichtbarkeit auf false gestellt so wie im Post erwähnt? Dann änder die doch einfach auf true (Visible = true) und schon siehst du den Player inklusive Leiste.

    Grüße,
    Oliver

    AntwortenLöschen
  10. Hallo! Ich habe dieselbe frage, wie epiclper.
    Wie kann ich eine Trackbar mit dem Windowsmediaplayer "verknüpfen", sodass ich mit der Trackbar durch das Lied "scrollen" kann?
    Ich schreibe ein Programm, dass später mit einem Touchscreen-Display genutzt werden soll, deshalb ist die Windowsmediaplayer-Trackbar zu klein...

    AntwortenLöschen
  11. Habe die Lösung schon gefunden:

    http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f22702bb-ff3b-4b6f-af7c-10cb5a997fd3/

    Omie's Post hats gebracht

    AntwortenLöschen
  12. Problem bei der sache mit der Playlist wie in den Kommentaren beschrieben ist, dass jedesmal eine neue Playlist erstellt wird, egal ob sie schon existiert oder nicht, somit wird der PC mit unnötigen Playlists zugemüllt.

    Meine Lösung ist: abfragen ob playlist schon existiert, wenn nicht erstellen, wenn ja auf diese zugreifen.

    Man kann eine Playlist auch über die URL öffnen, hat die Endung *.wpl und dann kann man über den Befehl axWindowsMediaPlayer1.currentPlaylist.clear();
    Die Titel der Playlist löschen und über das oben beschriebene Verfahren mit additem die neuen einfügen.

    Somit wird nur eine Playlist erstellt, aufgerufen und bearbeitet, statt mit jedem mal eine neue Playlist zu erstellen.

    MfG Shaitan

    AntwortenLöschen
  13. Tut mir Leid für Doppelpost.

    Mein Lösungsvorschlag ist eine Idee von mir, allerdings merke ich gerade, dass die Playlist auf diesem wege nicht bearbeitbar ist, bzw, dass die Titel nicht in der Playlist gespeichert werden, sondern nur kurzfristig hinzugefügt.

    Vlt hat jemand eine Idee wie man das Problem beheben kann.

    Bei mir tritt noch ein Problem auf:
    Ich habe mehrere kurze mp3 files in die playlist gepackt (8 Stk) aber er spielt nur die ersten 2 ab, wenn ich dann auf Play klicke spielt er nur denn jeweils nächsten ab. Ich vermute man muss die aktuelle Playlist aktualisieren, weiß jemand wie das geht? Das Problem könnte ich auf anderem Weg lösen, wenn ich wüsste wie ich Titel in der Playlist richtig reinspeichern könnte, nicht nur temporär...

    MfG Shaitan

    AntwortenLöschen
  14. Hallo,
    ich habe hier schon viele tolle Sachen gefunden und bin auch jetzt wieder begeistert. Ich bin gerade an einem Projekt und müsste die Musik-Dateien nicht nur abspielen können, sondern auch "live" an einen anderen PC übertragen können (wie bei einem Chat an eine bestimmte IP). Ich weiß leider nicht, wie ich es machen kann, dass ich es richtig sende und empfangen kann. Wenn du dazu eine Erklärung machen könntest währe ich sehr froh.

    AntwortenLöschen
    Antworten
    1. Vielen Dank!
      Schau dir mal diesen Post an: http://csharp-tricks.blogspot.de/2010/10/webcam-chat.html
      Dieser sollte eigentlich deine Fragen klären, es wird der Aufbau einer Videoverbindung erklärt, die einleitend erwähnten Posts erklären die Grundlagen der Kommunikation übers Internet.

      Löschen
  15. Ich hätte da auch noch mal eine Frage, nämlich folgendes: Wie verändere ich die Abspielgeschwindigkeit des Musikstücks programmgesteuert?

    AntwortenLöschen
    Antworten
    1. Die Abspielgeschwindigkeit kann mit
      axWindowsMediaPlayer1.settings.rate
      geändert werden, zum Beispiel
      axWindowsMediaPlayer1.settings.rate = 3
      für 3-fache Geschwindigkeit.
      Alle Werte von 0.5 bis unendlich sind möglich.

      Löschen
  16. Hallo Oliver oder andere,
    Ich möchte gerne Das meine TrackBar zu der Musik läuft.
    auch wenn ich z.B auf die TrackBar irgendwo hinkilcke das die Musik sofort da weiter geht

    AntwortenLöschen
  17. Hallo
    wie kann ich wenn ich das Lied gepaust habe wieder starten? mit.play geht es nicht.

    AntwortenLöschen