java python - Android:Streaming von Audio über TCP-Sockets



application framework (3)

Ohne die genaue Ausnahme zu kennen, die Sie bekommen, ist es schwer zu wissen, was genau falsch ist. Es würde auch helfen, den Code zu sehen, den du benutzt, um out1 zu erstellen (das ist dein Socket-Code).

Etwas, auf das Sie achten sollten, ist die Menge der von recordInstance.read() gelesenen Daten; Es kann sein, dass Sie nicht einen ganzen bufferSize Datenblock daraus erhalten, Sie müssen also nur darauf achten, die Bytes 0 bis bufferRead-1 in Ihren Ausgangs-Socket zu schreiben.

Für meine App muss ich Audio von MIC auf einem Android-Telefon aufnehmen und über TCP an das andere Android-Telefon senden, wo es abgespielt werden muss.

Ich benutze AudioRecord und AudioTrack Klasse. Dies funktioniert gut mit einer Datei - schreiben Sie Audio mit DataOutputStream in die Datei und lesen Sie mit DataInputStream .

Wenn ich jedoch denselben Stream von einem Socket anstelle einer Datei erhalte und versuche, dorthin zu schreiben, erhalte ich eine Ausnahme.

Ich kann nicht verstehen, was möglicherweise schief gehen könnte. Jede Hilfe würde sehr geschätzt werden.

EDIT: Das Problem ist gleich, auch wenn ich mit größeren Puffergrößen (65535 Bytes, 160000 Bytes) versuche.

Dies ist der Code:

Recorder:

int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

byte[] tempBuffer = new byte[bufferSize];

recordInstance.startRecording();

while (/*isRecording*/) {
      bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
      dataOutputStreamInstance.write(tempBuffer);
}

Der obige DataOutputStream wird erhalten als:

BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff);

Könntest du bitte einen Blick darauf werfen und mich wissen lassen, was ich hier falsch machen könnte?

Vielen Dank,


Ich habe das mit einiger Hilfe und nur teilweise funktioniert.

Ich begann mit dem Code unter http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html , änderte die Streams von File in die Streams von Socket und änderte das isAvailable () in if (inputStream .read (byteArray)! = -1).

Live-Streaming von Audio über TCP findet jetzt statt.

Jedoch,

Alles, was ich am anderen Ende höre, ist Rauschen, und ich suche jetzt nach dem richtigen Parametersatz für AudioRecorder und AudioTrack - Frequenz, Kanalkonfiguration und -codierung, Audioquelle usw.

Wenn Sie eine Idee dazu haben, lassen Sie es mich bitte wissen.

Vielen Dank,

EDIT: Es war ein dummer Fehler von meiner Seite. Zusätzlich zu all dem, was ich oben gesagt habe, benutze inputStream auf der Playerseite und outputStream auf der Rekorderseite und Byte-Arrays anstelle von Kurzschlüssen und es wird funktionieren. :)


Zeichenarrays ( char[] ) können nach der Verwendung gelöscht werden, indem jedes Zeichen auf Null und Strings nicht gesetzt wird. Wenn jemand das Speicherabbild irgendwie sehen kann, wird bei Verwendung von Strings ein Kennwort im Klartext angezeigt. Wenn jedoch char[] verwendet wird, ist das Kennwort nach dem Löschen von Daten mit Nullen sicher.





java android sockets dataoutputstream