Domanda

Ecco cosa voglio fare:

Voglio consentire all'utente di fornire al mio programma alcuni dati audio (tramite un ingresso microfonico), quindi trattenerli per 250 ms, quindi emetterli nuovamente attraverso gli altoparlanti.

L'ho già fatto utilizzando Java Sound API.Il problema è che è un po' lento.Ci vogliono almeno circa 1-2 secondi dal momento in cui viene emesso il suono al momento in cui il suono viene nuovamente sentito dagli altoparlanti, e non ho ancora provato a implementare la logica del ritardo.Teoricamente non dovrebbero esserci ritardi, ma ci sono.Capisco che devi aspettare che la scheda audio riempia il suo buffer o altro, e la dimensione del campione e la frequenza di campionamento hanno qualcosa a che fare con questo.

La mia domanda è questa:Devo continuare lungo il percorso Java cercando di farlo?Se possibile, voglio ridurre il ritardo a 100 ms.Qualcuno ha esperienza nell'uso del driver ASIO con Java?Presumibilmente è più veloce..

Inoltre, sono un tipo .NET.Ha senso invece avere a che fare con .NET?E il C++?Sto cercando la tecnologia giusta da utilizzare qui e forse un buon esempio di come leggere/scrivere flussi di input/output audio utilizzando la piattaforma tecnologica suggerita.Grazie per l'aiuto!

È stato utile?

Soluzione

Ho usato JavaSound in passato e l'ho trovato meravigliosamente traballante (e continua a cambiare tra una release VM). Se ti piace C #, usa, basta usare le API DirectX. Ecco un esempio di fare un po 'quello che si vuole fare con DirectSound e C #. È possibile utilizzare i plug-in di effetti per eseguire i vostri 250 ms eco.

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/12/25/capturing-and-streaming-sound-by-using-directsound-with-c aspx

Altri suggerimenti

Potresti voler esaminare JACK, un'API audio progettata per l'elaborazione del suono a bassa latenza.Inoltre, Google lo rileva presentazione elegante [PDF] sull'utilizzo di JACK con Java.

Teoricamente non dovrebbero esserci ritardi, ma ci sono.

Ebbene, è impossibile avere un ritardo pari a zero.Il meglio che puoi sperare è un ritardo impercettibile (in termini di percezione umana).Potrebbe essere utile se descrivi il tuo algoritmo di base per leggere e scrivere i dati audio, in modo che le persone possano identificare possibili problemi.

Un potenziale problema con l'utilizzo di un linguaggio di garbage collection come Java è che il GC verrà eseguito periodicamente, interrompendo l'elaborazione per un periodo di tempo arbitrario.Tuttavia, sarei sorpreso se fosse> 100 ms nell'utilizzo normale.Se GC è un problema, la maggior parte delle JVM fornisce algoritmi di raccolta alternativi che puoi provare.

Se si sceglie di andare giù per la C / C ++ percorso, mi raccomando utilizzando PortAudio ( http://portaudio.com/ ). Funziona con quasi tutto su più piattaforme e ti dà il controllo a basso livello dei driver audio senza avere a che fare con le varie tecnologie driver audio che è intorno.

Ho usato PortAudio su più progetti, ed è una vera gioia da usare. E la licenza è permissiva.

Se la bassa latenza è il vostro obiettivo, non si può battere C.

libsoundio è una libreria di basso livello C in tempo reale ingresso e uscita audio. Viene fornito anche con un esempio programma che fa esattamente quello che vuoi -. piping l'ingresso microfono all'uscita altoparlanti

E 'certamente ottenibile con JavaSound per ottenere fine alla latenza end nel campo da baseball di 100-150ms.

  1. La causa primaria di latenza delle dimensioni del buffer delle linee di cattura e riproduzione. La dimensione è impostata all'apertura delle linee:

    • capture: TargetDataLine#open(AudioFormat format, int bufferSize)
    • la riproduzione: SourceDataLine#open(AudioFormat format, int bufferSize)

Se il buffer è troppo grande causerà la latenza in eccesso, ma se è troppo piccola causerà la riproduzione stuttery. Quindi è necessario trovare un equilibrio per le vostre esigenze di applicazioni e la vostra potenza di calcolo.

La dimensione del buffer di default può essere controllato con DataLine#getBufferSize quando si chiama #open(AudioFormat format). La dimensione predefinita varierà in base alla AudioFormat e sembra essere orientati per alta latenza, balbettare applicazioni di riproduzione liberi (per esempio internet in streaming). Se si sta sviluppando un'applicazione bassa latenza, la dimensione del buffer di default è troppo grande e deve essere cambiato.

Nel mio test con un 16-bit PCM <=>, una dimensione di buffer di 1024 byte è stato abbastanza vicino all'ideale per bassa latenza.

  1. Il secondo e spesso trascurato causa di latenza audio è qualsiasi altra attività svolto nei fili di cattura o di riproduzione. Per esempio, la registrazione dei messaggi di consolare può introdurre 10 di ms di latenza. Spegnerlo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top