我正在开发一个电话扬声器应用程序,以便可以在手机上收听计算机中的音频,但该应用程序只会发出噪音。客户端(计算机)是使用C#开发的,输出是一个.wav文件,该文件通过套接字传输到电话,并由对象AudioTrack在流模式下播放。 我使用Windows音频会话API(WASAPI)记录扬声器的输出。该对象有一个在有新数据可用时触发的方法,在这种方法中,我将字节数组发送到服务器(电话)。
这是Java代码:
public class Server_s implements Runnable {
private String mensaje;
private MainActivity estado;
private ServerSocket ss;
private Socket socket;
private BufferedReader entrada;
static final int frequency = 44100;
static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
boolean isPlaying;
int playBufSize;
AudioTrack audioTrack;
private boolean listo = true;
byte[] data = new byte[38400];
private BufferedInputStream input;
public Server_s(MainActivity estado){
this.estado = estado;
playBufSize=AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
Log.d("Servidor","Tamano "+playBufSize);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);
}
@Override
public void run() {
try {
ss = new ServerSocket(1995);
Log.d("Server","Started");
socket = ss.accept();
Log.d("Server","Connected");
conectado();
entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
input = new BufferedInputStream(socket.getInputStream());
audioTrack.play();
readBytes();
desconectado();
Log.d("Server","Disconnected");
} catch (Exception e) {
e.printStackTrace();
desconectado();
}
}
String s = "";
public void readBytes(){
try {
byte[] buf = new byte[playBufSize];
int numRead = 0;
while((numRead = input.read(buf,0,buf.length)) >= 0){
s = new String(buf,"US-ASCII");
int offset = 0;
while (offset < numRead) {
offset += audioTrack.write(buf, offset, numRead - offset);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void conectado() {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run()
{
estado.cambiarEstado("Conectado");
}
});
}
private void desconectado() {
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run()
{
estado.cambiarEstado("Desconectado");
}
});
if(ss != null){
try {
ss.close();
socket.close();
entrada.close();
run();
} catch (IOException e) {
e.printStackTrace();
}
}
}
希望清楚! 谢谢!