Question

Existe-t-il un moyen portable et non limité par un brevet de lire des fichiers audio compressés en C#/.Net ?Je souhaite jouer de courts sons "jingle" sur divers événements se produisant dans le programme.

Système.Media.SoundPlayer ne peut gérer que WAV, mais ceux-ci sont généralement trop gros pour être intégrés dans une application téléchargeable.Le MP3 est protégé par des brevets, donc même s'il existait un décodeur/lecteur entièrement géré, il ne serait pas libre de le redistribuer.Le meilleur format disponible semble être OGG Vorbis, mais je n'ai pas eu de chance de faire fonctionner les bibliothèques C# Vorbis (j'ai réussi à extraire un PCM brut avec csvorbis mais je ne sais pas comment y jouer après).

Je ne souhaite ni distribuer de binaires avec mon application ni dépendre de P/Invoke, car le projet doit fonctionner au moins sous Windows et Linux.Je suis d'accord avec le regroupement d'assemblys .Net tant qu'ils sont compatibles avec la licence GPL.

[cette question fait suite à un discussion sur la liste de diffusion sur mono-dev liste de diffusion il y a un an]

Était-ce utile?

La solution

J'ai finalement revisité ce sujet et, avec l'aide de BrokenGlass lors de l'écriture de l'en-tête WAVE, csvorbis mis à jour.J'ai ajouté un OggDecodeStream qui peut être transmis à System.Media.SoundPlayer pour lire simplement n'importe quel flux Ogg Vorbis (compatible).Exemple d'utilisation :

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

« Compatible » dans ce cas signifie « cela a fonctionné lorsque je l'ai essayé ».Le décodeur est entièrement géré, fonctionne bien sur Microsoft .Net - pour le moment, il semble y avoir une régression dans Mono SoundPlayer cela provoque une distorsion.

Dépassé:

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

Je suis surpris mais le méthode que Dinah a mentionnée fonctionne réellement.Cependant, je pensais à jouer des sons "jingle" courts sur divers événements se produisant dans le programme, je ne veux pas lancer le lecteur multimédia de l'utilisateur chaque fois que j'ai besoin de faire un "ping!" son.

Quant au lien du projet de code, il ne s'agit malheureusement que d'un wrapper P/Invoke.

Autres conseils

Je ne souhaite pas non plus distribuer des binaires avec mon application ni dépendre de P / Invoke, car le projet devrait s'exécuter au moins sur Windows et Linux.Je suis d'accord avec les assemblages .NET à l'obstacles tant qu'ils sont compatibles avec la licence avec GPL.

Malheureusement, il sera impossible d'éviter de distribuer des binaires, ou d'éviter P/Invoke.Les bibliothèques de classes .net utilisent de toute façon P/Invoke en dessous, le code géré doit communiquer avec l'API non gérée du système d'exploitation à un moment donné, pour pouvoir faire quoi que ce soit.

La conversion du fichier OGG en PCM devrait être possible dans le code managé, mais comme il n'y a pas de support natif pour l'audio dans .net, vous avez en réalité 3 options :

  1. Appelez un programme externe pour lire le son (comme suggéré précédemment)

  2. P/Invoquer un module C pour jouer le son

  3. P/Invoquez les API du système d'exploitation pour lire le son.

(4.) Si vous exécutez uniquement ce code sous Windows, vous pouvez probablement simplement utiliser DirectShow.

P/Invoke peut être utilisé de manière multiplateformehttp://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

Une fois que vous avez vos données PCM (en utilisant une OGG C Lib ou un Managed Code, quelque chose comme ceci http://www.robburke.net/mle/mp3sharp/ bien sûr, il y a des problèmes de licence avec MP3), vous aurez besoin d'un moyen de le lire, malheureusement .net ne fournit aucune évaluation directe de votre carte son ni de méthodes pour lire de l'audio en streaming.Vous pouvez convertir les fichiers ogg en PCM au démarrage, puis utiliser System.Media.SoundPlayer pour lire les fichiers wav générés.La méthode actuelle suggérée par Microsoft utilise P/Invoke pour accéder à l'API de lecture audio dans le système d'exploitation. http://msdn.microsoft.com/en-us/library/ms229685.aspx

Une API multiplateforme pour lire le son PCM est OpenAL et vous devriez pouvoir lire le son (PCM) en utilisant les liaisons c# pour OpenAL sur www.taoframework.com, vous devrez malheureusement copier un certain nombre de fichiers DLL et .so avec votre application pour qu'elle fonctionne une fois distribuée, mais cela est, comme je l'ai expliqué plus tôt, inévitable.

Appeler quelque chose qui se trouve dans « System.Diagnostics » pour jouer un son me semble une très mauvaise idée.Voici à quoi sert cette fonction :

    //
    // 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.

je pense que vous devriez jeter un oeil à fmod, qui est la mère de toutes les API audio

n'hésitez pas à rêver http://www.fmod.org/index.php/download#FMODExProgrammersAPI

Les API XNA Audio fonctionnent bien dans les applications .net/c# et fonctionnent à merveille pour cette application.Déclenchement basé sur des événements, ainsi que lecture simultanée de plusieurs sons.Exactement ce que vous voulez.Oh, et la compression aussi.

Eh bien, cela dépend des lois relatives aux brevets dans un pays donné, mais il n'y a aucun moyen d'écrire un décodeur mp3 sans violer les brevets, pour autant que je sache.Je pense que la meilleure solution open source multiplateforme pour votre problème est GStreamer.Il possède des liaisons c#, qui évoluent rapidement.Utiliser et créer GStreamer sous Windows n’est cependant pas une tâche facile. Ici est un bon point de départ. Banshee Le projet utilise cette approche, mais il n'est pas encore vraiment utilisable sur Windows (cependant, il existe des versions nocturnes presque fonctionnelles). FMOD est également une bonne alternative.Malheureusement, il n'est pas open source et je trouve que son API est en quelque sorte de style C.

Il existe un décodeur vorbis pur C# disponible et open source :

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

Je ne sais pas si cela est toujours d'actualité.La solution la plus simple serait d'utiliser NAudio, qui est une API audio open source gérée écrite en C#.Une autre chose à essayer serait d'utiliser ffmpeg et de créer un processus pour ffplay.exe (les bons binaires sont sous des versions partagées).

Il n'y a aucun moyen pour vous de le faire sans utiliser autre chose pour votre gestion de jeu.

L'utilisation de System.Diagnostic lancera un logiciel externe et je doute que vous le souhaitiez, n'est-ce pas ?Vous voulez juste que X fichier son soit lu en arrière-plan lorsque Y se produit dans votre programme, n'est-ce pas ?

Voté parce que cela semble être une question intéressante.:D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top