Rekompresja audio w dshow

0

Witam, mam dziwny problem z rekompresją dźwięku, a raczej ze zmianą jego formatu.
Piszę aplikację która za pomocą FFT przekłada pliki muzyczne na widok samogrającego pianina. Założyłem sobie że program będzie akceptował tylko pliki w formacie mono, więc zaszła potrzeba na rekompresor.

Wybór rekompresora padł na DirectShow z wiadomych powodów - szeroka gama typów plików na wejściu, od wav do avi, rmvb. Skleiłem sobie graf który wypluwa do pliku gołe sample PCM mono 16bit 44100sampli/s:
File Source->ACM Wrapper (decoder)->ACM Wrapper (encoder)->Sample Grabber (file writer)->Null Renderer
Pierwszy ACM Wrapper zapewnia mi na wyjściu format PCM.
Drugi ACM Wrapper zapewnia że sample są mono 16 bit 44100.

Problem:
Gdy na wejściu jest sygnał o amplitudzie ponad połowy zakresu (przykładowo ponad +-16383 dla 16-bitowych sampli), to drugi ACM Wrapper wypluwa przesterowany dźwięk, jakby ktoś zapomniał podzielić sumę przez ilość kanałów.

Rozwiązałem to wstawiając jeszcze jeden Sample Grabber pomiędzy oba ACM Wrapper'y który zwyczajnie dzieli sample przez ilość kanałów.File Source->ACM Wrapper (decoder)->Sample Grabber (samples[]/=nChannels)->ACM Wrapper (encoder)->Sample Grabber (file writer)->Null RendererMa to ten plus, że nie ma już żadnego przesterowania, ale drugą stroną medalu jest zbędne przyciszenie dźwięku gdy jakiś inny ACM Wrapper u kogoś innego nie będzie miał tego buga.

Jakieś sugestie? Tylko nie proponujcie niestandardowych filtrów, których nie ma w popularnych codec-pakach.

0

jeśli dobrze rozumiem, problem...
próbowałeś ręcznie na etapie ostatniego filtra gdy masz dostęp już do bufora surowych próbek przetwarzać tylko dane jednego kanału ?
próbki dla dźwięku dwukanałowego na etapie wave powinny być zapisane naprzemiennie L,R,L,R,... - ilość kanałów i długość każdej próbki znasz, wiec teoretycznie nie powinno być problemów wyciągnięcia jednego kanału. No, chyba, ze musisz połączyć dwa kanały w jeden - wtedy zmiksuj je 'ręcznie' .

1 użytkowników online, w tym zalogowanych: 0, gości: 1