Frage

Gibt es eine tragbare, nicht-patent-eingeschränkte Art und Weise zu spielen komprimiert sound-Dateien in C# / .Net?Ich will spielen, kurz "jingle" - sounds auf verschiedenen Veranstaltungen Auftritt im Programm.

System.Medien.SoundPlayer kann mit nur WAV -, aber diese sind in der Regel zu groß, um zu embed in eine herunterladbare Anwendung neu.MP3 ist geschützt durch Patente, so dass auch wenn es ein vollständig verwalteter decoder/player, es würde nicht frei sein, Sie zu verteilen.Das beste format verfügbar zu sein scheint, OGG Vorbis, aber ich hatte kein Glück bekommen jede C# - Vorbis-Bibliotheken zu arbeiten (ich es geschafft, zu extrahieren, eine raw-PCM mit csvorbis aber ich weiß nicht, wie es zu spielen danach).

Ich nicht haben verteilen wollen, werden alle Programme, die mit meiner Anwendung noch davon abhängen, P/Invoke, wie das Projekt laufen soll, zumindest auf Windows und Linux.Ich bin fein mit Bündelung .Net-Assemblys, solange Sie die Lizenz-kompatibel mit der GPL.

[diese Frage ist ein follow-up zu einem Mailingliste Diskussion über mono-dev Mailingliste vor einem Jahr]

War es hilfreich?

Lösung

Ich endlich revisited diesem Thema, und mit Hilfe von BrokenGlass auf das schreiben des WAVE header, aktualisiert csvorbis.Ich habe Hinzugefügt OggDecodeStream übergeben werden kann, um System.Media.SoundPlayer einfach zu spielen (kompatibel), Ogg Vorbis-stream.Beispiel Verwendung:

using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read))
{
  var player = new SoundPlayer(new OggDecodeStream(file));
  player.PlaySync();
}

"Geeignet" in diesem Fall bedeutet "es funktioniert, wenn ich es ausprobiert'.Der decoder ist vollständig verwaltet, funktioniert gut auf Microsoft .Net - im moment scheint es eine regression in Mono - SoundPlayer das verursacht die Verzerrung.

Veraltet:

System.Diagnostics.Process.Start("fullPath.mp3");

Ich bin überrascht, aber die Methode Dinah erwähnt eigentlich funktioniert.Ich war jedoch spielen denken kurz "jingle" - sounds auf verschiedenen Ereignissen, die in das Programm, ich will nicht Benutzer starten der media-player jedes mal, wenn ich tun müssen eine 'ping!' Klang.

Für die code-Projekt-link - das ist leider nur ein P/Invoke-wrapper.

Andere Tipps

Ich nicht wollen, zu verteilen Binärdateien mit meiner Anwendung noch abhängig von P/Invoke, da das Projekt laufen sollte zumindest auf Windows-und Linux.Ich bin fein mit Bündelung .Net Baugruppen, wie lange, wie Sie sind Lizenz-kompatibel mit der GPL.

Leider seine unmöglich zu vermeiden, verteilen Binärdateien, oder vermeiden Sie P/Invoke.Die .net-Klassenbibliotheken verwenden Sie P/Invoke unterhalb sowieso, die verwalteten code für die Kommunikation mit dem unmanage Betriebssystem-API an einem gewissen Punkt, um zu tun.

Die Konvertierung der OGG-Datei in PCM möglich sein sollte, die in Verwaltetem code, aber da es keine Native Unterstützung für Audio-in .net, die Sie wirklich haben 3 Optionen:

  1. Rufen Sie ein externes Programm, um den Ton wiederzugeben (wie zuvor)

  2. P/Invoke, ein C-Modul, um den Ton wiederzugeben

  3. P/Invoke, die OS-APIs, um den Ton wiederzugeben.

(4.) Wenn Sie nur diesen code ausführen, die auf windows, Sie könnten wahrscheinlich nur die DirectShow verwenden.

P/Invoke kann verwendet werden in eine cross-Plattform-Art http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

Sobald Sie Ihre PCM-Daten (mit einem OGG-C Lib oder Verwalteten Code, so etwas wie dieses http://www.robburke.net/mle/mp3sharp/ natürlich gibt es Lizenzgebühren mit MP3), benötigen Sie einen Weg, es zu spielen, leider .net bietet keine direkte Beurteilung Ihrer Soundkarte oder Methoden, um Spiel-streaming-audio -.Sie könnte konvertieren ogg-Dateien in PCM auf Start, und verwenden Sie dann System.Medien.SoundPlayer, spielen Sie die wav-Dateien generiert.Die aktuelle Methode empfiehlt Microsoft verwendet P/Invoke, um den Zugriff Sound spielen-API in das Betriebssystem http://msdn.microsoft.com/en-us/library/ms229685.aspx

Ist ein cross-Plattform-API zu spielen PCM sound OpenAL und Sie sollten in der Lage sein zu spielen (PCM -) Ton mithilfe der c# - Bindungen für OpenAL an www.taoframework.com Sie wird leider müssen kopieren eine Reihe von DLL-und .also Dateien mit der Anwendung, um für Sie zu arbeiten, wenn verteilt, aber das ist, wie ich bereits erklärt habe früher unvermeidbar.

Aufrufen von etwas, das sich im 'System.- Diagnose", um einen sound abzuspielen sieht aus wie eine ziemlich schlechte Idee für mich.Hier ist, was diese Funktion ist gedacht für:

    //
    // Summary:
    //     Starts a process resource by specifying the name of a document or application
    //     file and associates the resource with a new System.Diagnostics.Process component.
    //
    // Parameters:
    //   fileName:
    //     The name of a document or application file to run in the process.
    //
    // Returns:
    //     A new System.Diagnostics.Process component that is associated with the process
    //     resource, or null, if no process resource is started (for example, if an
    //     existing process is reused).
    //
    // Exceptions:
    //   System.ComponentModel.Win32Exception:
    //     There was an error in opening the associated file.
    //
    //   System.ObjectDisposedException:
    //     The process object has already been disposed.
    //
    //   System.IO.FileNotFoundException:
    //     The PATH environment variable has a string containing quotes.

ich denke, du solltest einen Blick fmod, die Mutter aller audio-api

fühlen Sie bitte sich frei zu träumen http://www.fmod.org/index.php/download#FMODExProgrammersAPI

Die XNA-Audio-APIs funktionieren gut .net/c# - Anwendungen, und arbeiten schön für diese Anwendung.- Ereignis ausgelöst wird, zusammen mit concurent Wiedergabe mehrerer Töne.Genau das, was Sie wollen.Oh, und Kompression als gut.

Nun, es hängt davon ab, patent-Gesetzen in einem bestimmten Land, aber es gibt keine Möglichkeit zu schreiben, ein mp3-decoder ohne Verletzung von Patenten, soweit ich weiß.Ich denke, die beste cross-Plattform, open-source Lösung für Ihr problem ist GStreamer.Es hat c# - Bindungen, die sich immer schneller weiterentwickeln.Mit und Gebäude GStreamer auf Windows ist keine leichte Aufgabe, aber. Hier ist ein guter Ausgangspunkt. Banshee project verwendet diesen Ansatz, aber es ist nicht wirklich nutzbar auf windows noch (allerdings gibt es einige fast-working nightly builds). FMOD ist auch eine gute alternative.Leider ist Sie nicht open source, und ich finde, dass die API ist irgendwie C-Stil.

Es ist ein reines C# - vorbis-decoder zur Verfügung, das ist open source:

http://anonsvn.mono-project.com/viewvc/trunk/csvorbis/

Nicht sicher, ob dies noch relevant ist.Einfachste Lösung wäre die Verwendung von NAudio,, das ist ein verwalteter open-source-audio-API in C#geschrieben.Eine andere Sache, zu versuchen, wäre die Verwendung von ffmpeg, und erstellen Sie einen Prozess, um die ffplay.exe (die richtigen Binärdateien sind unter shared-builds).

Es gibt keine Möglichkeit für Sie, dies zu tun, ohne über etwas anderes für die play Handhabung.

Sie das System verwenden.Diagnose starten und mit einer externen software, und ich bezweifle, dass du das willst, richtig?Sie wollen einfach nur X sound-Datei für die Wiedergabe im hintergrund, wenn Y passiert in Ihrem Programm, richtig?

Gewählt, weil es sieht aus wie eine interessante Frage.:D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top