2012-06-22 26 views
8

Rozważam stworzenie aplikacji, która będzie wymagać transmisji strumieniowej audio na żywo. Wolałbym korzystać z biblioteki Open Source opartej na wielu platformach (Windows/Linux/BSD) napisanej w języku C lub C++, chociaż pisanie jej przy użyciu interfejsów dźwiękowych odpowiednich systemów operacyjnych nadal jest opcją.platforma dźwięku z interfejsem API

Czytałem trochę o różnych bibliotekach dźwięku, w tym SFML, SDL i PortAudio. Prawdą jest, że nie zostały jeszcze zbadane wystarczająco o dźwięku w FreeBSD i Linux (jak podobne jest to pomiędzy tymi 2?)

głównych wymagań będzie

  1. uzyskać dźwięk z wybranego mikrofonu/mikrofonów wysłać na sieć,
  2. wysyła dane do wybranych urządzeń wyjściowych,
  3. przetwarza dźwięk (filtrowanie, czyszczenie szumów, strumienie multipleksów itp.), ale można to zrobić, gdy już mam dane audio, sama biblioteka NIE potrzebuje aby móc to zrobić.
  4. mają dość niską latencję

Moim głównym problemem jest to, że te wymienione API wydają się być skierowane głównie do gier (gdzie dźwięk jest zazwyczaj ładowane z dysku i nie ma zbyt wiele, jeśli w ogóle, nagrywanie dźwięku zaangażowany zamiast przesyłane strumieniowo przez sieć z równą wagą między nagrywaniem a odtwarzaniem. Czy ktoś ma jakieś wskazówki/ostrzeżenia/sugestie dotyczące tych lub innych interfejsów dźwiękowych API lub o zaletach/wadach długiej drogi i implementacji tego w odpowiednich systemach operacyjnych? Interfejsy API?

UWAGA: , a jednocześnie: "Pytania z prośbą o zalecenie lub znalezienie książki, narzędzia, biblioteki oprogramowania, samouczka lub innych zasobów poza terenem serwisu są nie na temat" Przepełnienia stosu ". Czynią to pytanie nietypowym, gdy się również bierze pod uwagę" ponieważ mają tendencję do przyciągania upartych odpowiedzi i spamu "wtedy nie sądzę, aby to pytanie zostało zamknięte. Ktoś, kto szuka takiej biblioteki, jak to opisano, będzie miał trudności ze znalezieniem czegokolwiek, a odpowiedzi na to pytanie w praktyce podsumowują wszystkie dostępne opcje. Dzieje się tak dlatego, że "ogólnie obejmuje ... narzędzia programowe powszechnie używane przez programistów;" kategoria przyjętych odpowiedzi.

+0

Czy obejrzałeś Pulseaudio? –

+0

Pisanie dla PulseAudio wydaje się uzasadnione tylko wtedy, gdy pisze się specjalnie dla dystrybucji LINUX, które już ją skonfigurowały. – msam

Odpowiedz

7

PortAudio to doskonały wybór dla opisywanej aplikacji - działa na wszystkich tych platformach, jest napisany w języku C, zapewnia niewielkie opóźnienia i ma zarówno opcje wywołania zwrotnego, jak i blokowania opcji we/wy. Zdecydowanie spełnia twoje wymagania i jest nie szczególnie ukierunkowany na gry. W rzeczywistości, powiedziałbym, że są inne apisy, które są lepsze w grach, podczas gdy PortAudio jest lepszy dla ogólnych operacji wejścia/wyjścia audio, takich jak aplikacje typu VoIP, takie jak twoje, odtwarzacze audio, aplikacje pro-audio, nagrywanie dźwięku, oprogramowanie radiowe, itd.

Inną opcją, którą możesz rozważyć, jest RTAudio, z którym nie jestem zaznajomiony. Rozumiem, że jest to trochę prostsze (brak blokowania A/S/AFAIK) i ma wsparcie dla większej liczby platform, w tym systemów mobilnych, ale ludzie PortAudio pracują nad tym.

Twoje pytanie na temat FreeBSD a Linux: Linux używa ALSA, podczas gdy inne uniksy używają OSS. Zarówno OSS, jak i ALSA oferują warstwy kompatybilności, więc ALSA ma kompatybilność z OSS i na odwrót, ale z mojego doświadczenia wynika, że ​​są błędy w obu warstwach kompatybilności. Może rzeczy się poprawiły odkąd ostatni raz je użyłem.

Niektóre komputery stacjonarne z systemem Linux uruchamiają PulseAudio na ALSA. Nie jestem pewien, czy tak jest w FreeBSD. Z jakiegoś powodu, ALSA jest domyślnie skonfigurowana w trybie wyłączności na większości systemów. Chociaż jest to łatwe do naprawienia w teorii, pliki konfiguracyjne są dziwne i większość użytkowników tego nie zrobiła i nigdy tego nie zrobi, co oznacza, że ​​po przejęciu PulseAudio nie można już uzyskać dostępu bezpośrednio do urządzeń ALSA, więc warto mieć także sterownik PulseAudio, chyba że chcesz, aby użytkownicy zmieniali konfigurację (co może się zdarzyć, jeśli twoja aplikacja wymaga naprawdę małego opóźnienia).

Jestem prawie pewna, że ​​PortAudio obsługuje PulseAudio, pomimo tego, co może lub nie może powiedzieć na stronie internetowej. Zapytam o listę mailingową i zaktualizuję ją tutaj.

AKTUALIZACJA: ktoś na liście adresowej pomyślał, że możesz użyć sterowników Alsa, aby uzyskać dostęp do PulseAudio. To (wspaniała!) Wiadomość dla mnie, ale tak jest.

2

Uważam, że SDL i OpenAL są zarówno powszechne, jak i szeroko obsługiwane. O ile nie spełnią one twoich potrzeb, sugeruję, aby nie przechodzić na niższy poziom, ponieważ utracisz niezależność od platformy.

Powodem, dla którego wydają się być nastawione na gry, jest to, że jest to jeden z trudniejszych przypadków użycia. Jeśli więc możesz wspierać gry, możesz wspierać wszystko, czego potrzebuje inna aplikacja (nie licząc oprogramowania studyjnego).

Weź pod uwagę cel, jakim jest małe opóźnienie. Gry wymagają bardzo małego opóźnienia, aby efekty dźwiękowe były dobrze dopasowane do działań na ekranie. Zakładam, że jest to podobny powód, dla którego tego chcesz (aby twój dźwięk pasował do twojego strumienia wideo i nie było przerw w kanale głosowym).

BTW, twoje postrzeganie gier jest nieprawidłowe. Wiele gier posiada kanały głosowe użytkowników do komunikacji w zespole. Dodatkowo mogą obejmować proceduralne efekty dźwiękowe i dźwiękowe.


Znalazłem inny numer SFML, który zawiera obsługę nagrywania. Nie wiem zbyt wiele o tym, ale widziałem, że może zastąpić SDL.

+1

Oto link do części nagrywającej! http://stackoverflow.com/questions/3056113/recording-audio-with-openal – NotKyon

+0

Niestety, nie poddałem się weryfikacji, że SDL nie obsługuje nagrywania (to albo coś mi brakuje), więc teraz jest poza równanie. Zajrzę do OpenAL, ale – msam

+0

Tak, przepraszam za to, myślałem, że SDL nagrywa, ale nie mogę też znaleźć API. Być może jest to jeden z nowszych wydań lub łatka. –

0

Sugerowałbym, abyś opracował go na platformie Qt (Linux/Mac/Windows) dla wielu platform i używając własnych bibliotek Qt. W module QtMultimedia możesz użyć QAudioInput do przechwytywania nieprzetworzonego dźwięku z mikrofonu.Możesz ponownie użyj do przetwarzania QtMultimedia.

Struktura Qt jest bardzo zoptymalizowana pod kątem aplikacji multimedialnych i gier, więc nie tracisz na wydajności.

+0

Poza trywialnymi dźwiękami żadna z Qt dostarczających dźwiękowych API nie jest dobra. Zapoznaj się z moją odpowiedzią tutaj: http://stackoverflow.com/questions/5600515/qt-how-to-play-sound-witout-blocking-main-thread/5602687#5602687 –

+0

To może być prawdą dla wcześniejszych wersji, ale mam używał Qt4.7 na 2 moje gry z szeroką gamą efektów dźwiękowych. –

+0

O ile 4.7 nie ma zupełnie nowego API dźwięku, nie uwierzyłbym, że mógłby rozwiązać problemy, które znalazłem. –

-1

linphone zawiera mediastreamer2 na dokładnym tego celu

2

libsoundio to biblioteka C niski poziom, który pasuje do Twoich wymagań.

Jedna uwaga: nie obsługuje jeszcze OSS (FreeBSD) ani sndio (OpenBSD).

Powiązane problemy