2012-02-28 9 views
7

Chciałbym zrobić kilka projektów z dźwiękiem w C# .NET 4.0 w przyszłości, więc zebrałem próbki kodu do nagrywania dźwięku, pracy z plikami WAVE itp. Ale co mam 'można znaleźć to:Wykres w czasie rzeczywistym (przebieg)

Jak mogę narysować przebiegi audio/spektrogramy w czasie rzeczywistym (ish)? Oczywiście tworzenie bitmapy w pamięci i ładowanie jej do ramki graficznej byłoby bardzo powolne, prawda? Jaki jest najłatwiejszy sposób?

Dzięki!

+0

Wygląda duplikatu pytanie - sprawdź: http://stackoverflow.com/questions/5606367/how-to-create- sound-spectrogram-in-c (C#, despite link) – holtavolt

+1

Do wyświetlania przebiegu w czasie rzeczywistym możesz zajrzeć do grafiki sprzętowej z akceleracją - nie sądzę, że biedny stary GDI + byłby w stanie poradzić sobie zbyt dobrze. Powiedziałbym, że najlepszą rzeczą do zrobienia jest po prostu wysłanie pierścienia-bufora zawierającego dane audio bezpośrednio na kartę graficzną w celu renderowania przez moduł cieniujący do tekstury. Możesz nawet zrobić FFT w module cieniującym, jeśli chcesz :) – MattDavey

+0

Chciałbym znać odpowiedź również na tę. Jak podaje portal Forum, Direct2D jest najszybszym API do malowania ekranu .NET, ale nigdy nie widziałem aplikacji WinForms, która go używa. Czy musisz używać WinForms? –

Odpowiedz

1

Można użyć interfejsu GDI + opartego na modelu Graphics and Drawing in Windows Forms, aby bezpośrednio narysować treść. Będzie to znacznie szybsze niż renderowanie do bitmapy i wyświetlanie w ramce graficznej dla stale zmieniającej się zawartości.

+0

Cóż, dla spektrogramu, musiałbym narysować to, co zasadniczo jest bitmapą. Czy GDI + radzi sobie z tym dobrze? – John

+0

@John Stosunkowo dobrze - nadal będzie szybszy niż rysowanie w bitmapie i renderowanie. –

+0

Nie zgadzam się. Rysowanie na ekranie jest wolniejsze niż rysowanie do bitmapy i jej zmienianie. Próbowałem go ze stoperem. Linia 5K. Oto wyniki: Sterowanie na ekranie: 2772ms Bitmapa i zmiana: 85ms Podwójnie buforowana kontrola na ekranie: 2657ms – Onur

1

Po prostu maluj bezpośrednio na odpowiedniej powierzchni sterującej, tzn. Na panelu. Uzyskaj kontekst graficzny kontrolki i zaktualizuj go w zdarzeniu Paint za pomocą funkcji Invalidate(). Za każdym razem, gdy tracisz ważność, Paint nazywa się automagicznie. Tutaj chcesz umieścić logikę rysowania.

Najlepszym sposobem na aktualizację jest użycie DrawImageUnscaled(). Obraz jest sama najszybciej wykonane metodą LockBits wyjaśnił doskonale tutaj:

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