2012-02-28 27 views
7

Me gustaría hacer algunos proyectos con audio en C# .NET 4.0 en el futuro, así que reuní algunas muestras de código para grabación de audio, trabajando con archivos WAVE, etc. Pero lo que no tengo 'sido capaz de encontrar es:Gráfico gráfico en tiempo real (forma de onda)

¿Cómo puedo dibujar formas de onda de audio/espectrogramas en tiempo real (ISH)? Obviamente, crear un mapa de bits en memoria y cargarlo en un cuadro de imagen sería muy lento, ¿no? Entonces, ¿cuál es la forma más fácil?

Gracias!

+0

Parece una pregunta duplicado - echa un vistazo a: http://stackoverflow.com/questions/5606367/how-to-create- sonido-espectrograma-en-c (C#, a pesar del enlace) – holtavolt

+1

Para la visualización de la forma de onda en tiempo real, es posible que desee examinar los gráficos acelerados por hardware: no creo que el viejo GDI + pueda soportarlo demasiado bien. Yo diría que lo mejor que puede hacer es simplemente enviar un buffer de anillo que contenga los datos de audio directamente a la tarjeta de gráficos para que un sombreador los represente a una textura. Incluso podrías hacer la FFT en el shader si quisieras :) – MattDavey

+0

Me encantaría saber la respuesta a esta también. La tradición del foro afirma que Direct2D es la API de pintura de pantalla .NET más rápida, pero nunca he visto una aplicación WinForms que la use. ¿Debe usar WinForms? –

Respuesta

1

Puede usar el Graphics and Drawing in Windows Forms basado en GDI + para dibujar su contenido directamente. Esto será mucho más rápido que renderizar en un mapa de bits y mostrar en un cuadro de imagen para cambiar constantemente el contenido.

+0

Bueno, para un espectrograma, tendría que dibujar lo que esencialmente equivale a un mapa de bits. ¿GDI + maneja esto bien? – John

+0

@John Relativamente bien: todavía será más rápido que dibujar en un mapa de bits y renderizado. –

+0

No estoy de acuerdo. Dibujar el control en pantalla es más lento que dibujar en un mapa de bits y cambiarlo. Lo intenté con cronómetro. Línea 5K. Aquí están los resultados: Control en pantalla: 2772ms Mapa de bits y cambio: 85ms Control en pantalla con doble buffer: 2657ms – Onur

1

Simplemente pinte directamente en una superficie de control adecuada, es decir, un panel. Obtenga el contexto de gráficos del control y actualícelo en el evento Paint usando la función Invalidate(). Cada vez que invalida, Paint se llama automágicamente. Aquí es donde quieres poner tu lógica de dibujo.

La mejor manera de actualizarlo es utilizar DrawImageUnscaled(). La imagen en sí se hizo más rápido con el método LockBits, explicó excelentemente aquí:

http://www.bobpowell.net/lockingbits.htm

Cuestiones relacionadas