¿Por qué algunos archivos wav se reproducen en mi aplicación c# directsound pero otros no?

StackOverflow https://stackoverflow.com/questions/100654

  •  01-07-2019
  •  | 
  •  

Pregunta

Tengo una aplicación C# que reproduce archivos WAV simples a través de DirectSound.Con los datos de prueba que tenía, el código funcionó bien.Sin embargo, cuando utilicé datos del mundo real, se produjo un error muy inútil al crear el búfer secundario:"Excepción de argumento:Valor no se encuentra dentro del rango esperado."

Los wavs de prueba tenían una velocidad de bits de 512 kbps, un tamaño de muestra de audio de 16 bits y una frecuencia de muestra de audio de 32 kHz.Los nuevos wavs son 1152 kbps, 24 bits y 48 kHz respectivamente.¿Cómo puedo hacer que directsound haga frente a estos valores más grandes, o si no, cómo puedo detectar estos valores mediante programación antes de intentar reproducir el archivo?

Estoy usando DirectX v9.00.1126 administrado y he incluido un código de muestra a continuación:

using DS = Microsoft.DirectX.DirectSound;  
...  
DS.Device device = new DS.Device();
device.SetCooperativeLevel(this, CooperativeLevel.Normal);  
...
BufferDescription bufferDesc = new BufferDescription();
bufferDesc.ControlEffects = false;  
...
try
{
    SecondaryBuffer sound = new SecondaryBuffer(path, bufferDesc, device);
    sound.Play(0, BufferPlayFlags.Default);
}
...

Información adicional:Los archivos wav del mundo real tampoco se reproducen en Windows Media Player, lo que me indica que se necesita un códec para reproducir el archivo, mientras que se reproducen bien en Winamp.

Información adicional 2:Al comparar los bytes de los datos de prueba en funcionamiento y los datos incorrectos del mundo real, puedo ver que más allá del fragmento RIFF, los datos incorrectos tienen un fragmento "bext", que Internet me informa que son metadatos asociados con la extensión de audio de transmisión, mientras que los datos de la prueba van directamente a un fragmento fmt.Hay /hay/ un fragmento fmt en los datos incorrectos, por lo que no sé si está mal formado o si los cargadores deberían buscar más datos fmt.Puedo ver si puedo obtener información sobre este fragmento rouge bext de las personas que me proporcionan los datos; si pueden eliminarlo, es posible que mi código aún funcione.

¿Fue útil?

Solución

No todas las tarjetas de sonido admiten la reproducción de muestras de 24 bits e incluso cuando lo hacen, a menudo deben abrirse exclusivamente en ese modo.Existe un problema similar con las tasas de muestreo.Es posible que su tarjeta de sonido esté funcionando a 44,1 kHz, en cuyo caso es necesario volver a muestrear 48 kHz para poder reproducirla.

He escrito una biblioteca de audio .NET de código abierto llamada NAudio lo que le permitirá saber qué frecuencia de muestreo y profundidad de bits tiene un archivo WAV determinado.También ofrece formas alternativas de reproducir audio (p. ej.a través de la onda...API) y la capacidad de remuestrear archivos utilizando el objeto remuestreador DMO.

Otros consejos

Además del problema del muestreo, WAV es sólo un formato contenedor y el audio se puede comprimir en cualquiera de una gran variedad de formatos de audio (al igual que AVI es un contenedor de vídeo).Entonces podrías usar una herramienta como Punto G para averiguar si su WAV está codificado en un formato no estándar e instale el códec.Winamp tiene más códecs instalados de forma predeterminada que WMP, lo que explicaría que Winamp los reproduce y WMP no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top