Sonntag, 6. Juni 2010

Wave - Datei abspielen

Um Wave - Dateien abzuspielen, stellt .Net die Klasse System.Media.SoundPlayer zur Verfügung.
Die Klasse kann entweder mit dem Pfad zu einer Wave - Datei im Konstruktor initialisiert werden, oder der Pfad wird über die Eigenschaft SoundLocation gesetzt.
Folgender Code spielt eine Beispielsounddatei ab:

System.Media.SoundPlayer ExamplePlayer = new System.Media.SoundPlayer();
ExamplePlayer.SoundLocation = "C:\\Dokumente und Einstellungen\\Oliver\\Desktop\\wav\\MM_Lachen.wav";
ExamplePlayer.Play();

In dem Post MP3 - Datei abspielen zeige ich die Verwendung des Windows Media Player Steuerelements, welches sich nicht ganz zum Titel passend zum Abspielen eigentlich aller Audioformate eignet. Wer also mehr als die hier beschriebenen Wave - Dateien nutzen möchte, der sei auf den genannten Post verwiesen.

Kommentare:

  1. Ich würde das gerne in einer Endlosschleife haben... WIE GEHT DAS???

    AntwortenLöschen
  2. Du musst wahrscheinlich das Finish-Event abonnieren und da das Lied wieder starten.

    AntwortenLöschen
  3. Hey,

    coole Idee, aber ein Finish-Event gibt es nicht.
    Dafür gibt es aber die Funktion PlaySinc(), welche den Ton synchron abspielt, das Programm also nur weiterlaufen lässt wenn zuende abgespielt wurde.
    Um eine Endlosschleife zu verwirklichen bietet sich also folgender Code statt dem Play() aus dem obigen Post an:
    while (true)
    {
    ExamplePlayer.PlaySync();
    }
    Generell sollte man aber mit Endlosschleifen vorsichtig sein.

    Viele Grüße
    Oliver

    AntwortenLöschen
  4. Mal gucken ob es funktioniert...
    Hab da mal noch eine Frage: Wenn ich auf einem Button drücke soll es aufhören zu spielen. Geht das ungefähr so?:
    private void button1_Click(object sender, EventArgs e)
    {
    ExamplePlayer.Stop();
    }

    AntwortenLöschen
  5. Die Endlosschleife funktioniert nicht!!! Das Programm bleibt hängen und macht nichts

    AntwortenLöschen
  6. Du darfst die Endlosschleife natürlich nicht im GUI-Thread haben.
    Ich habs nicht probiert, denke aber, dass es geht.
    Einfach einen Timer verwenden und die Liedlänge als Intervall nehmen. Im Tick-Event kann dann das Lied wieder gestartet werden.

    AntwortenLöschen
  7. Genau, wenn du die Endlosschleife im Form - Thread laufen lässt, blockiert dein Lied ja die ganze Zeit die Interaktion mit dem Formular, es bleibt optisch gesehen hängen.
    Erstelle einen neuen Thread und starte da die Endlosschleife, dann sollte es problemlos gehen.

    AntwortenLöschen
  8. Hä... also verstehe ich jetzt nicht ganz. Was für ein Thread? Und wie soll ich das jetzt genau machen?

    AntwortenLöschen
  9. Hahaha.... rofl xD, Ich habs jetzt selber hingekriegt:
    System.Media.SoundPlayer ExamplePlayer = new System.Media.SoundPlayer();
    ExamplePlayer.SoundLocation = "C:\\JUHU.wav";
    ExamplePlayer.PlayLooping();

    ....PlayLooping();!!!! und NICHT ...PlaySync();

    AntwortenLöschen
  10. Hey, Glückwunsch, das ist natürlich eine elegante Lösung! Hab ich selber nicht gesehen.
    Threads sind kleine "Unterprozesse" in einem Programm die quasi selbstständig voneinander ablaufen, so kannst du mehrere Sachen fast gleichzeitig erledigen lassen.
    Google das mal bei Interesse ;-)

    Viele Grüße
    Oliver

    AntwortenLöschen
  11. Gut erklärt, das hab ich gesucht.

    AntwortenLöschen
  12. Weiß zufällig jemand hier, wie ich so eine .wav-Datei in mein Projekt einbinden (und dann abspielen) kann? Ich möchte nämlich am Ende nur die .exe-Datei und nicht noch andere externe .wav-Dateien.

    Danke im Vorraus!

    LG
    Tom

    AntwortenLöschen
  13. Hi Tom,

    interessante Frage!
    Generell geht so etwas über Ressourcen.
    Du kannst beliebige Dateien zu deinem Projekt als Ressourcen hinzufügen, welche dann quasi in dem Projekt gespeichert werden, sodass die ursprünglichen Dateien nicht mehr benötigt werden.
    Klicke hierzu im Projektmappenexplorer mit Rechts auf Ressourcen, "Hinzufügen" und dann auf "Vorhandenes Element ...".
    Wähle dann die WAVE Datei aus.

    Nun werden Ressourcen aber als Streams gespeichert, der obige Soundplayer erwartet bei Soundlocation aber einen Pfad auf eine Datei.
    Deswegen habe ich mir folgendes kleines Workaround ausgedacht (nicht ganz schön, wenn jemand eine bessere Idee hat bitte Bescheid sagen!):

    Das Programm schreibt vor dem Abspielen den Ressourcenstream in eine lokale Datei und öffnet diese dann.
    Der Code dazu sieht so aus:

    System.Media.SoundPlayer ExamplePlayer = new System.Media.SoundPlayer();

    System.IO.FileStream fs = new System.IO.FileStream("temp.wav", System.IO.FileMode.OpenOrCreate);

    byte[] WaveData = new byte[Properties.Resources.DeineWaveDatei.Length];
    Properties.Resources.DeineWaveDatei.Read(WaveData, 0, (int)Properties.Resources.DeineWaveDatei.Length);

    fs.Write(WaveData, 0, WaveData.Length);
    fs.Close();

    ExamplePlayer.SoundLocation = "temp.wav";
    ExamplePlayer.Play();

    Das wärs! Am Ende kann man die Datei noch löschen, so kriegt der Benutzer gar nichts von dieser Umwandlung mit.

    Viele Grüße
    Oliver

    AntwortenLöschen
  14. Habe vor einen kleinen Player zu programmieren.
    1. Jetzt möchte ich die abzuspielende Datei in einem Explorerfenster auswählen.
    Wie lautet der Code dazu????

    2.Wie kann ich den Player mit dem Start bzw. Stopp Button verknüpfen????

    AntwortenLöschen
  15. Hallo Jonas,
    hast du schon mal das "Windows Media Player" Steuerelement ausprobiert? Da hättest du schon einen fertigen Player. Um Dateien vom PC zum Abspielen auszuwählen, könntest du dir selber einen Explorer mit ListBoxes o.ä. bauen (das dauert aber bestimmt ein bisschen) oder du benutzt z.B. das OpenFileDialog Steuerelement, das ginge sehr schnell.

    AntwortenLöschen
  16. Zur Endlosschleife:

    Der Soundplayer verfügt eine Methode namens "PlayLooping();"

    So würde es gehen:


    SoundPlayer sp = new SoundPlayer(@"C:\test.wav");

    buttonStart_Click(..)
    {
    sp.PlayLooping();
    }

    buttonStop_Click(...)
    {
    sp.Stop();
    }


    Hoffe das wurde noch nicht gepostet.

    AntwortenLöschen
  17. hallo,
    kriege leider folgenden Fehler mit zwei unterschiedlichen wav Dateien.
    "Die Sound-API unterstützt nur die Wiedergabe von PCM-Wavedateien."
    in den Dateieigenschaften der einen wav Datei steht Auddioformat PCM, trotzdem gehts nicht.

    Ideen?
    danke!

    AntwortenLöschen
  18. Hallo,
    das klingt komisch, bist du sicher dass du den Pfad o.ä. richtig angegeben hast?
    Kannst mir auch gerne mal die Dateien schicken, würde mich interessieren.
    Kennst du ansonsten schon diesen Post hier? http://csharp-tricks.blogspot.com/2010/06/mp3-datei-abspielen.html
    Dort beschreibe ich unten das MediaPlayer Steuerelement, dieses sollte eigentlich alle Sounddateien abspielen können und ähnlich wie obige Komponente benutzt.

    Viele Grüße
    Oliver

    AntwortenLöschen
  19. Hallo alle,

    ich würde gerne eine PCM-Datei mit simulierten Daten füllen.

    Geht das?
    Wer weiß wie?

    Grüße
    D

    AntwortenLöschen
    Antworten
    1. Hallo,

      was genau meinst du mit simulierten Daten?
      Ich habe einen Post geschrieben zum Thema "Wave Dateien schreiben" (http://csharp-tricks.blogspot.de/2011/03/wave-dateien-schreiben.html).
      Hilft dir das vielleicht?

      Grüße
      Oliver

      Löschen
    2. Hallo,

      Danke! Da hab ich erstmal was zum lesen.
      Mit simulierten Daten meine ich, dass ich mir z.B. softwareseitig einen Sinusverlauf berechnen lasse, diesen als PCM abspeichere, so dass ich das mit einem Player anhören kann.

      Gruß
      D

      Löschen
    3. Hi,

      ja das müsste genau das richtige für dich sein, du berechnest für die einzelnen Abtastpunkte den Sinuswert und schreibst diesen dann in die Wave Datei.

      Grüße
      Oliver

      Löschen
    4. Hi Oliver,

      das sieht in der Tat nach dem aus, wonach ich suche.
      Danke für die Tips :)
      Jetzt muss ich nur noch Muße finden, damit mal ausgiebig rumzuspielen ;)

      Beste Grüße
      D

      Löschen
  20. wie kann ich zwei genau Wave datein hintereinander abspielen? ohne eine Sekunde Pause so das der user nicht merkt das es zwei wave Dateien sind ?

    AntwortenLöschen