Avete presente quei siti web che permettono di ascoltare tracce audio? E quelle barre che vanno su e giù senza senso anche se non si sente niente? Ecco, capisco che un player come quello di Flash o Silverlight possa non implementare l'analisi dell'audio, ma questa tecnica l'ho vista applicata anche in applicazioni client, anche scritte in WPF.
Mi è venuta quindi voglia di provare ad implementare una visualizzazione a barre dell'audio che si ascolta e di conseguenza ho cominciato dall'inizio: dalla teoria. Prima di tutto bisogna sapere che nel digitale le tracce audio sono campionate, un po' come i frame nei video, tantissime volte al secondo. Questi sample per esempio, a qualità CD sono 44100 al secondo e occupano 16bit per ogni canale e ovviamente più è alto il sample, maggiore è la qualità. Questa serie di byte si possono considerare come tante di sinusoidi, ciascuna delle quali possiede una frequenza e un'ampiezza. Queste informazioni si possono ottenere applicando un algoritmo di nome Fast Fourier Transform (FFT) e sfruttarle per creare spettri audio. Non sono un comuque un esperto ne di matematica ne di audio, quindi se siete interessati vi rimando a questa buona guida.
A questo punto mi serviva un modo per caricare i byte delle tracce audio e un sistema veloce per applicare FFT. In giro si trovano esempi che usano le API waveIn*** e waveOut***, ma sono limitati ai file wav che contengono solamente campionature pure. Ho deciso quindi di usare DirectShow che, sebbene sia più complesso, è potentissimo, ci sono filtri di ogni genere e tramite un SampleGrabber posso intercettare i sample in uscita dopo che sono stati decodificati. Questo mi permette quindi di aprire qualsiasi file audio compatibile con DirectShow. Considerando che FFT può essere applicato solo ad un set che sia una potenza di 2, che più sample prendo e più è preciso, ma che ad ogni secondo devo garantire una certa fluidità delle barre, ho deciso di campionare 4096 sample al secondo, così da garantire circa 11 frame al secondo.
Ovviamente, visto che ve ne ho parlato qualche giorno fa, ho usato C++ CLI per creare una DLL mixed dove una classe managed utilizza una unmanaged la quale crea il grafo DirectShow, prepara i filtri ed esegue l'analisi dell'audio, limitando quindi al minimo l'interop e ottenendo il massimo delle prestazioni. Ogni sample ottenuto viene raggruppato per range di frequenza e memorizzato il picco. Ho creato poi un element AudioVisualization in WPF che ad intervalli regolari interroga i picchi e tramite animation mostra le barre. Il risultato è buono e il rendering basato su WPF permette di realizzare qualsiasi tipo di visualizzazione.
Ho creato inoltre un'applicazione demo dallo skin molto semplice; purtroppo il mio grafico di fiducia ultimamente è molto occupato (a giocare :-D). Ecco un video dimostrativo:
Video: Reyalp
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Visual Studio 11 beta: le novità di WPF 4.5, l'1 marzo 2012 alle 19:32
- Controllo WPF: AdvancedListBox, il 24 ottobre 2007 alle 19:24
- Multithreading WPF nel Binding, il 21 ottobre 2007 alle 23:40
- Com'è fatto il formato BAML di WPF?, il 12 settembre 2007 alle 21:31
- WPF attached properties + extension methods, il 10 giugno 2007 alle 22:12