Audio-Streaming von einem socket auf Android mit Hörgeschichte
Ich versuche zu spielen, einen PCM-stream über die Hörgeschichte Klasse. Dies ist der code:
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM);
audioTrack.play();
//Reading data.
byte[] data = new byte[200];
int n = 0;
try {
while ((n = s.getInputStream().read(data)) != -1)
audioTrack.write(data, 0, n);
}
catch (IOException e) {
return;
}
Leider die audio bekomme ich ständig unterbrochen. Ich habe versucht zu schreiben, Daten in eine Datei, anstatt Sie schreiben zu der hörgeschichte, und spielen Sie mit aplay. Es scheint, es ist perfekt. Keine Unterbrechung. Gibt es etwas falsch in dem code, den ich gemeldet, wenn mithilfe Tonspur besitzt? Oder vielleicht einfach die Daten nicht ankommen in der Zeit?
Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie tun, ein paar Schecks:
Verwenden Sie Ihre code, um eine Datei Lesen. Öffnen Sie einfach die Datei als stream an.
Messen Sie Durchsatz. Jedes mal, wenn ein chunk von Daten ankommt, record time (
System. nanoTime()
) und Länge. Dann könnte man berechnen, wenn die Daten spät.Versuchen Sie, den code in einem separaten thread mit hoher Priorität.
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)
In der run() des thread-Lesen und schreiben der Daten.
Lesen der audio-Daten aus einer Variablen Latenz-stream und sendet Sie an hörgeschichte.schreiben im selben thread wird schlecht arbeiten, wie Sie beobachtet haben. Das ist ein job für 2 threads, wo man liest die Daten aus dem stream (und Puffer, die eine angemessene Menge), während die andere schreibt die audio-Daten an die hörgeschichte Objekt. Sie könnten sich mit Lesen und schreiben großer Blöcke der audio-Daten zu einer Zeit, aber die hörgeschichte Klasse erlegt Beschränkungen auf, die. Wenn die hörgeschichte thread aufwacht, nach einer write-operation, die Sie nicht tun können, bedeutende Arbeit in diesem thread, oder Sie führt dazu, dass Lücken in der audio-Ausgabe; Sie müssen es mit einem kontinuierlichen Strom von Daten.
Habe ich nicht verwendet
AudioTrack
vor, aber vergleichen Sie Ihre version mit diese Umsetzung der Hauptunterschied, den ich sehe, ist, dass Sie erstellen IhreAudioTrack
mit anderer buffersize, als Sie für Ihre eigenen Puffer:20000
vs200
. Ich würde versuchen, mit der gleichen Größe für beide.