Um Streaming-Verzögerungen auszuschließen, habe ich zuerst den gesamten Stream in ein Array geladen und dann das Audio durch Schleifen über die vorab ausgefüllten abgespielt Array. Trotzdem verbessern sich die Dinge überhaupt nicht.
Jetzt läuft K900 Android 4.1.2, während das Android SDK, das ich verwendet habe, für API23 ist. Ich meine, wenn ich die Definition der AudioTrack-Klasse öffne, öffnet es die Klassendatei von API23. Verursacht es ein Problem?
Code: Select all
int bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT);
if (bufferSize == AudioTrack.ERROR || bufferSize == AudioTrack.ERROR_BAD_VALUE) {
bufferSize = SAMPLE_RATE * 2;
}
int readBytes;
int bufSize=2123880;//size of the file being streamed
byte[] buffer=new byte[bufSize];
//bufferSize*=2;
DataInputStream in = new DataInputStream(socket.getInputStream());
readBytes=0;
while(true) {
try {
if(in.available()>0){
readBytes+=in.read(buffer, readBytes, in.available());
// audioTrack.write(buffer,0,readBytes);
}else{
break;
}
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
//audioTrack.release();
break;
} catch (IOException e) {
e.printStackTrace();
//audioTrack.release();
break;
}
}
in.close();
readBytes=0;
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT,
bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
while(readBytes 0) {
readBytes = in .read(buffer, 0, buffer.length);
audioTrack.write(buffer, 0, readBytes);
}
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
audioTrack.release(); in .close();
socket.close();
break;
} catch (IOException e) {
e.printStackTrace();
audioTrack.release(); in .close();
socket.close();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Mobile version