visual - reproducir video en c#
¿Cómo puedo reproducir archivos de sonido comprimido en C#de forma portátil? (9)
Llamar a algo que se encuentra en ''System.Diagnostics'' para reproducir un sonido me parece una idea bastante mala. Aquí es para lo que está diseñada esa función:
//
// 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.
¿Existe una forma portátil, no restringida a la patente, de reproducir archivos de sonido comprimido en C # / .Net? Quiero reproducir sonidos cortos de "jingle" en varios eventos que ocurren en el programa.
System.Media.SoundPlayer solo puede manejar WAV, pero normalmente son demasiado grandes para incrustarlos en una aplicación descargable. MP3 está protegido con patentes, por lo que incluso si hubiera un descodificador / reproductor totalmente administrado, no sería redistribuible. El mejor formato disponible parece ser OGG Vorbis, pero no tuve suerte para conseguir que funcionen las bibliotecas C # Vorbis (logré extraer un PCM en bruto con csvorbis pero no sé cómo jugarlo después).
No quiero distribuir ningún binario con mi aplicación ni dependo de P / Invoke, ya que el proyecto debería ejecutarse al menos en Windows y Linux. Estoy bien con la agrupación de ensamblados .Net, siempre que sean compatibles con la licencia GPL.
[esta pregunta es un seguimiento de una discusión de la lista de correo en la lista de correo mono-dev hace un año]
No quiero distribuir binarios con mi aplicación ni depender de P / Invoke, ya que el proyecto debería ejecutarse al menos en Windows y Linux. Estoy bien con la agrupación de ensamblados .Net, siempre que sean compatibles con la licencia GPL.
Desafortunadamente será imposible evitar la distribución de binarios o evitar P / Invoke. Las bibliotecas de la clase .net usan P / Invoke debajo de todos modos, el código administrado tiene que comunicarse con la API del sistema operativo que no se administra en algún momento para poder hacer cualquier cosa.
La conversión del archivo OGG a PCM debería ser posible en el código administrado, pero como no hay soporte nativo para audio en .net, realmente tiene 3 opciones:
Llame a un programa externo para reproducir el sonido (como se sugirió anteriormente)
P / Invoca un módulo C para reproducir el sonido
P / Invoque las API de OS para reproducir el sonido.
(4.) Si solo está ejecutando este código en Windows probablemente podría simplemente usar DirectShow.
P / Invoke se puede utilizar de forma cruzada http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names
Una vez que tenga sus datos de PCM (usando un OGG C Lib o Managed Code, algo así como http://www.robburke.net/mle/mp3sharp/, por supuesto, hay problemas de licencia con MP3), necesitará una forma de jugar Desafortunadamente, .net no proporciona ninguna evaluación directa de su tarjeta de sonido o métodos para reproducir audio en tiempo real. Puede convertir los archivos ogg a PCM al inicio y luego usar System.Media.SoundPlayer para reproducir los archivos wav generados. El método actual que Microsoft sugiere utiliza P / Invoke para acceder a Sound Playing API en el sistema operativo http://msdn.microsoft.com/en-us/library/ms229685.aspx
Una API multiplataforma para reproducir sonido PCM es OpenAL y usted debería poder reproducir sonido (PCM) usando los enlaces c # para OpenAL en www.taoframework.com, desafortunadamente necesitará copiar una cantidad de archivos DLL y .so con su aplicación para que funcione cuando se distribuye, pero esto es, como he explicado anteriormente inevitable.
No hay forma de que hagas esto sin usar otra cosa para el manejo de tu juego.
Usando System.Diagnostic se lanzará un software externo y dudo que lo desee, ¿no? Solo quiere que el archivo de sonido X se reproduzca en segundo plano cuando ocurre Y en su programa, ¿verdad?
Votado porque parece una pregunta interesante. :RE
Creo que deberías echarle un vistazo a fmod, que es la madre de todas las aplicaciones de audio
Siéntete libre de soñar con http://www.fmod.org/index.php/download#FMODExProgrammersAPI
Las API XNA Audio funcionan bien en aplicaciones .net / c # y funcionan muy bien para esta aplicación. Activación basada en eventos, junto con la reproducción concurent de múltiples sonidos. Exactamente lo que quieres Ah, y la compresión también.
Bueno, depende de las leyes relacionadas con patentes en un país determinado, pero no hay forma de escribir un decodificador de mp3 sin violar patentes, hasta donde yo sé. Creo que la mejor solución de código abierto multiplataforma para su problema es GStreamer . Tiene enlaces de c #, que evolucionan rápidamente. Sin embargo, usar y construir GStreamer en Windows no es una tarea fácil. Aquí hay un buen punto de partida. El proyecto Banshee usa este enfoque, pero todavía no se puede usar en Windows (sin embargo, hay algunas compilaciones nocturnas casi funcionales). FMOD es también una buena alternativa. Desafortunadamente, no es de código abierto y encuentro que su API tiene un estilo C de alguna manera.
Hay un descodificador puro de C # vorbis disponible que es de código abierto:
No estoy seguro si esto todavía es relevante. La solución más simple sería usar NAudio , que es una API administrada de audio de código abierto escrita en C #. Otra cosa para probar sería utilizar ffmpeg y crear un proceso para ffplay.exe (los binarios correctos están en compilaciones compartidas).
Finalmente revisé este tema y, usando la ayuda de BrokenGlass al escribir el encabezado WAVE , actualicé csvorbis. Agregué un OggDecodeStream que se puede pasar a System.Media.SoundPlayer
para reproducir simplemente cualquier transmisión de Ogg Vorbis (compatible). Ejemplo de uso:
using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read))
{
var player = new SoundPlayer(new OggDecodeStream(file));
player.PlaySync();
}
''Compatible'' en este caso significa ''funcionó cuando lo probé''. El decodificador está completamente administrado, funciona bien en Microsoft .Net - por el momento, parece haber una regresión en SoundPlayer
de Mono que causa distorsión.
Anticuado:
System.Diagnostics.Process.Start("fullPath.mp3");
Estoy sorprendido, pero el método que menciona Dinah realmente funciona. Sin embargo, estaba pensando en tocar sonidos cortos de "jingle" en varios eventos que ocurren en el programa, no quiero iniciar el reproductor multimedia del usuario cada vez que necesito hacer un ''ping''. sonar.
En cuanto al enlace del proyecto de código, desafortunadamente solo se trata de un contenedor de P / Invoke.