通过TCP实现的流式语音传输

5
我可以帮您进行翻译。以下是翻译的结果,保留了原有的HTML标签:

我编写了一个从客户端到服务器通过TCP流传输音频的应用程序,但是它不起作用,也就是说没有可听的输出。您能否检查我的代码并告诉我哪里出了问题?

客户端:

public void startStreaming() {


   Thread streamThread = new Thread(new Runnable() {

       @Override
       public void run() {
            try {

                int minBufSize =AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

                Log.d("VD ", "Bufer intioalised "+minBufSize);

                short[] buffer=new short[minBufSize];


                Log.d("VS","Buffer created of size .c" + minBufSize);
              //  DatagramPacket packet;

                final InetAddress destination = InetAddress.getByName(target.getText().toString());
                port=Integer.parseInt(target_port.getText().toString());

                Socket socket=new Socket(destination,port);

                DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
                Log.d("VS", "Address retrieved.c");


                if (minBufSize != AudioRecord.ERROR_BAD_VALUE) {
                    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize);
                Log.d("VS", "Recorder initialized.c");}


                if (recorder.getState() == AudioRecord.STATE_INITIALIZED){
                    Log.d("VS", "Recorder working....c");
                    recorder.startRecording();}

                BufferedWriter input;
                while(status == true) {


                    //reading data from MIC into buffer
                  int  bufferReadResult = recorder.read(buffer, 0, buffer.length);


                      dos.write(buffer,0,bufferReadResult);

                  dos.flush();



                }

            } catch(UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                Log.e("IOException message:",e.getMessage().toString());


            }



        }

服务器:

public void startStreaming() { Thread streamThread = new Thread(new Runnable() {

开始流媒体传输:

public void startStreaming() { Thread streamThread = new Thread(new Runnable() {

    @Override
    public void run() {



        try {

            int  minBufSize =1024;//recorder.getMinBufferSize(sampleRate,channelConfig,audioFormat);


            ServerSocket serversocket = new ServerSocket(50005);



             // DatagramSocket socket = new DatagramSocket(50005);


              byte[] buffer = new byte[1024];


                  if (minBufSize != AudioRecord.ERROR_BAD_VALUE) {



                      speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);


                      speaker.play();
                      Log.d("VR", "spekaer playing...");
                  }
            //  }




                  Log.d("VR", ""+status);
                  BufferedReader input;
                  InputStream is;
                  ObjectInputStream ois;
                  ByteArrayInputStream baiss;
                  socket = serversocket.accept();
                    DataInputStream dis=new DataInputStream(new BufferedInputStream(socket.getInputStream()));


                        while(status == true) {

                              //DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

                            InputStream in = socket.getInputStream();

                            Log.d("content :", socket.getOutputStream().toString());


                            int i=0;
                            while (dis.available() > 0 && i < buffer.length) {
                                buffer[i]=(byte) dis.readShort();
                              i++;
                            }

       speaker.write(buffer,0,buffer.length);

请给我您最好的帮助。

(这是您需要翻译的内容)

请停止编辑我的问题。帮我解决这个问题。 - Ryan110
1
请首先解释这应该如何工作。然后解释哪些部分正常工作。然后解释你具体遇到什么问题。完成这些步骤后,我们将查看代码。 - greenapps
请先解释这个应该如何工作。然后解释哪些部分正常工作。接着解释你具体遇到了什么问题。一旦完成,我们将查看代码。 - greenapps
recorder.read(buffer, 0, buffer.length) 将录制的音频放入缓冲区。然后通过简单的循环将其转换为字节并发送(刷新)到服务器。你知道我的问题是什么吗?我传输声音时会出现重复的嘟嘟声!!声音不清晰。 - Ryan110
无意义的编码。您不需要循环来发送该缓冲区。如果bufferReadResult例如为800,则发送800次完整的缓冲区。此外,您首先将该缓冲区中的字节转换为字符串,然后再使用getBytes()转换为字节。结果也是,您发送了与缓冲区中记录的不同字节。 - greenapps
显示剩余9条评论
1个回答

1
答案在评论中。服务器和客户端都需要更好地实现read()/write()。

你能看一下我的新话题吗?http://stackoverflow.com/questions/31584287/cant-we-use-audiotrack-and-audiorecord-in-same-project - Ryan110
你能分享完整的代码吗?我有类似的问题,需要将PC麦克风的声音通过TCP/IP发送到Android。 - boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接