2012-06-22 10 views
8

Sto cercando di sviluppare un'applicazione che richiede streaming audio live. Preferirei utilizzare una libreria open source cross-platform (windows/linux/BSD) scritta in C o C++ anche se la scrittura tramite le API Sound dei rispettivi SO è ancora un'opzione.API cross platform audio

Ho letto un po 'di varie librerie di suoni, inclusi SFML, SDL e PortAudio. Certo, non ho ancora studiato abbastanza Sound di FreeBSD e Linux (come simile è fra questi 2?)

I principali requisiti saranno

  1. ottenere audio da un microfono prescelto/i microfoni di inviare oltre la rete,
  2. invia dati a una selezione di dispositivi di output,
  3. elabora il suono (filtraggio, pulizia del rumore, flussi di multiplexing ecc.) ma questo può essere fatto una volta che ho i dati audio, la libreria stessa NON ha bisogno essere in grado di fare tutto ciò.
  4. hanno ragionevolmente bassa latenza

La mia preoccupazione principale è che queste API menzionati sembrano essere mirati principalmente per i giochi (dove il suono è di solito caricato da disco e non c'è molto, se del caso, registrazione del suono coinvolti piuttosto che in streaming sulla rete con uguale importanza tra registrazione e riproduzione

Qualcuno ha qualche suggerimento/avvertimento/suggerimento riguardo a queste o altre API audio o sui vantaggi/svantaggi di percorrere la lunga strada e implementarlo nei rispettivi sistemi operativi " API

NOTA: mentre questo: "Le domande che ci chiedono di consigliare o trovare un libro, uno strumento, una libreria di software, un'esercitazione o altre risorse fuori sede sono off-topic per Stack Overflow" DOES rende la questione off-topic, quando si considera anche " dal momento che tendono ad attirare risposte e spam contestati ", quindi non credo che questa domanda debba essere chiusa. Qualcuno che cerca una libreria come quella descritta avrà difficoltà a trovare qualsiasi cosa e le risposte a questa domanda riassumono praticamente tutte le opzioni disponibili. Questo è quindi nella "copertura generale ... strumenti software comunemente usati dai programmatori"; categoria di risposte accettate.

+0

Hai dato un'occhiata a Pulseaudio? –

+0

Scrivere per PulseAudio sembra ragionevole solo se si scrive specificamente per le distribuzioni LINUX che lo hanno già impostato – msam

risposta

7

PortAudio è una scelta eccellente per l'applicazione che si sta descrivendo: viene eseguito su tutte quelle piattaforme, è scritto in C, offre bassa latenza e dispone sia delle opzioni di I/O di callback che di blocco. Soddisfa sicuramente le tue esigenze ed è non particolarmente adatto ai giochi. In realtà, direi che ci sono altre apis che sono migliori per i giochi, mentre PortAudio è migliore per l'I/O audio generico come applicazioni voip come il tuo, lettori audio, applicazioni pro-audio, registrazione audio, radio del software, ecc.

Un'altra opzione che si potrebbe considerare è RTAudio, che non mi è familiare. La mia comprensione è che è un po 'più semplice (nessun blocco I/O AFAIK), e ha il supporto per più piattaforme, inclusi i sistemi operativi mobili, anche se la gente di PortAudio ci sta lavorando.

La tua domanda su FreeBSD e Linux: Linux usa ALSA, mentre altri Unix utilizzano l'OSS. Sia OSS che ALSA offrono livelli di compatibilità, quindi ALSA ha compatibilità OSS e viceversa, ma nella mia esperienza ci sono bug in entrambi i livelli di compatibilità. Forse le cose sono migliorate da quando l'ho usato per ultimo, però.

Alcuni desktop Linux eseguono PulseAudio su ALSA. Non sono sicuro che questo sia vero per FreeBSD. Per qualche ragione, ALSA è configurato in modalità esclusiva per impostazione predefinita sulla maggior parte dei sistemi. Sebbene questo sia facile da risolvere in teoria, i file di configurazione sono strani e la maggior parte degli utenti non lo ha fatto e non lo farà mai, il che significa che una volta che PulseAudio prende il sopravvento, non è più possibile accedere direttamente ai dispositivi ALSA, quindi si consiglia di anche un driver PulseAudio, a meno che non si desideri che gli utenti cambino la propria configurazione (cosa che si potrebbe fare se l'applicazione richiede una latenza veramente bassa).

Sono sicuro che PortAudio supporta PulseAudio, nonostante ciò che può o non può dire sul sito web. Chiederò sulla mailing list e aggiornerò qui.

UPDATE: qualcuno sulla mailing list ha pensato che è possibile utilizzare i driver Alsa per accedere a PulseAudio. Queste sono (grandi!) Notizie per me, ma è così.

2

Ritengo che SDL e OpenAL siano entrambi comuni e ampiamente supportati. A meno che questi non soddisfino le tue esigenze, ti suggerirei di non scendere ad un livello inferiore poiché perderai l'indipendenza dalla piattaforma.

Il motivo per cui sembrano orientati ai giochi è semplicemente perché è uno dei casi di utilizzo più difficili. Quindi, se puoi supportare le probabilità di giochi, sosterrai qualsiasi altra applicazione desideri (a meno del software dello studio).

Considerate il vostro obiettivo di bassa latenza. I giochi richiedono una latenza molto bassa per assicurare che gli effetti sonori siano abbinati bene alle azioni sullo schermo. Presumo che questo sia un motivo simile a quello che vuoi (quindi il tuo suono corrisponde al tuo flusso video e non ci sono pause nel canale vocale).

BTW, la tua percezione dei giochi non è corretta. Molti giochi hanno canali vocali per la comunicazione del team. Inoltre possono includere suoni procedurali ed effetti sonori.


ho trovato un altro chiamata SFML che include il supporto di registrazione. Non ne so molto, ma ho visto che può sostituire SDL.

+1

Ecco un collegamento alla parte di registrazione! http://stackoverflow.com/questions/3056113/recording-audio-with-openal – NotKyon

+0

sfortunatamente, non avevo rettificato che SDL non supporta la registrazione (che o mi manca qualcosa) quindi ora è fuori l'equazione. Guarderemo in OpenAL anche se – msam

+0

Sì, mi dispiace, ho pensato che SDL abbia registrato, ma non riesco nemmeno a trovare l'API. Forse una delle versioni più recenti ce l'ha, o era una patch. –

0

Suggerisco caldamente di svilupparlo sul framework Qt multipiattaforma (Linux/Mac/Windows) e utilizzando le proprie librerie Qt. Nel modulo QtMultimedia, è possibile utilizzare QAudioInput per acquisire audio non elaborato da un microfono. È possibile utilizzare nuovamente QtMultimedia per l'elaborazione.

Qt framework è ottimizzato per applicazioni multimediali e di gioco, quindi non perderai le prestazioni.

+0

Oltre i banali segnali acustici, nessuna delle API audio fornite da Qt è valida. Fare riferimento alla mia risposta qui: http://stackoverflow.com/questions/5600515/qt-how-to-play-sound-witout-blocking-main-thread/5602687#5602687 –

+0

Questo potrebbe essere vero per le versioni precedenti, ma ho ho usato Qt4.7 per 2 dei miei giochi con una vasta gamma di effetti sonori. –

+0

A meno che 4.7 abbia un'API del suono completamente nuova, non credo che avrebbe potuto risolvere i problemi che ho riscontrato. –

-1

linphone contiene mediastreamer2 per questo scopo esatto

2

libsoundio è una libreria C di basso livello che si adatta alle vostre esigenze.

Un avvertimento: non supporta ancora OSS (FreeBSD) o sndio (OpenBSD).