使用AudioTrack播放字节缓冲区只会产生噪音

时间:2018-06-26 15:51:13

标签: c# android server audiotrack

我正在开发一个电话扬声器应用程序,以便可以在手机上收听计算机中的音频,但该应用程序只会发出噪音。客户端(计算机)是使用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();
    }
    }
}

希望清楚! 谢谢!

0 个答案:

没有答案