当前位置: 首页 > 面试题库 >

Java-通过Java套接字广播语音

颜永怡
2023-03-14
问题内容

我创建了一个服务器应用程序,该应用程序从客户端接收声音,然后广播此声音,该声音以字节存储,然后将字节发送回连接到服务器的客户端。现在,我目前仅使用一个客户端进行测试,客户端正在接收语音,但是声音一直在卡顿。有人可以告诉我我做错了吗?

我想我理解为什么声音播放不流畅但不了解如何解决问题的部分原因。

代码是波纹管的。

客户端:

将声音发送到服务器的部分

     public void captureAudio()
     {


      Runnable runnable = new Runnable(){

     public void run()
     {
          first=true;
          try {
           final AudioFileFormat.Type fileType = AudioFileFormat.Type.AU;                      
           final AudioFormat format = getFormat();
           DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
           line = (TargetDataLine)AudioSystem.getLine(info);               
           line.open(format);
           line.start();
                int bufferSize = (int) format.getSampleRate()* format.getFrameSize();
                byte buffer[] = new byte[bufferSize];

                    out = new ByteArrayOutputStream();
                    objectOutputStream = new BufferedOutputStream(socket.getOutputStream());
                    running = true;
                    try {                      
                        while (running) {                         
                            int count = line.read(buffer, 0, buffer.length);
                            if (count > 0) {
                                objectOutputStream.write(buffer, 0, count);
                                out.write(buffer, 0, count);
                                InputStream input = new ByteArrayInputStream(buffer);
                                final AudioInputStream ais = new AudioInputStream(input, format, buffer.length /format.getFrameSize());

                            }                           
                        }
                        out.close();
                        objectOutputStream.close();
                    }
                    catch (IOException e) {                    
                        System.exit(-1);
                        System.out.println("exit");
                    }
          }
          catch(LineUnavailableException e) {
            System.err.println("Line Unavailable:"+ e);
            e.printStackTrace();
            System.exit(-2);
          }
          catch (Exception e) {
           System.out.println("Direct Upload Error");
           e.printStackTrace();
          }
     }

     };

     Thread t = new Thread(runnable);
     t.start();

     }

从服务器接收数据字节的部分

    private void playAudio() {
     //try{


    Runnable runner = new Runnable() {

    public void run() {
        try {
            InputStream in = socket.getInputStream();
            Thread playTread = new Thread();

            int count;
            byte[] buffer = new byte[100000];
            while((count = in.read(buffer, 0, buffer.length)) != -1) {

                PlaySentSound(buffer,playTread);
            }
        }
        catch(IOException e) {
                System.err.println("I/O problems:" + e);
                System.exit(-3);
        }
      }
    };

    Thread playThread  = new Thread(runner);
    playThread.start();
  //}
  //catch(LineUnavailableException e) {
   //System.exit(-4);
  //}
    }//End of PlayAudio method

    private void PlaySentSound(final byte buffer[], Thread playThread)
    {

    synchronized(playThread)
    {

    Runnable runnable = new Runnable(){

    public void run(){
        try
        {

                InputStream input = new ByteArrayInputStream(buffer);
                final AudioFormat format = getFormat();
                final AudioInputStream ais = new AudioInputStream(input, format, buffer.length /format.getFrameSize());
                DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
                sline = (SourceDataLine)AudioSystem.getLine(info);
                sline.open(format);
                sline.start();              
                Float audioLen = (buffer.length / format.getFrameSize()) * format.getFrameRate();

                int bufferSize = (int) format.getSampleRate() * format.getFrameSize();
                byte buffer2[] = new byte[bufferSize];
                int count2;


                ais.read( buffer2, 0, buffer2.length);
                sline.write(buffer2, 0, buffer2.length);
                sline.flush();
                sline.drain();
                sline.stop();
                sline.close();  
                buffer2 = null;


        }
        catch(IOException e)
        {

        }
        catch(LineUnavailableException e)
        {

        }
    }
    }; 
   playThread = new Thread(runnable);
   playThread.start();
   }


   }

问题答案:

您将声音数据包非常随机地分割为1000000字节,然后在客户端上播放它们,而不考虑在服务器端计算出的采样率和帧大小,因此最终将声音分成两部分一起。

您需要对服务器发送的相同块进行解码,就像在客户端发送它们一样。也许使用http
multipart(在其中拆分数据非常容易)发送它们,然后通过套接字进行基本操作比较容易。最简单的方法是使用apache commons
http客户端,在此处查看:http
:
//hc.apache.org/httpclient-3.x/methods/multipartpost.html




 类似资料:
  • 问题内容: 我正在使用Java应用程序,需要通过套接字连接尽快将500,000个整数的数组从一台Android手机发送到另一台Android手机。无论是使用ObjectOutputStreams,ByteBuffers还是低级的掩码和移位转换,主要的瓶颈似乎都是在转换整数,以便套接字可以使用它们。通过套接字从一个Java应用程序向另一个Java应用程序发送int []的最快方法是什么? 这是到目前

  • 问题内容: 这就是我到目前为止 我的代码存在问题,返回null。 当我打印对象的内容时,我得到的是标题部分 后面跟着一个空行以及许多带有不同字符的行,例如。 再次我的问题是函数返回null。 提前致谢。 问题答案: 为什么不想使用简单的HTTP URL从主机获取图像?我的意思是: 如果要使用普通套接字,则必须解析http响应并手动从http答复中提取数据:读/跳过标头,读取二进制数据并将其传递给(

  • 问题内容: 我有2个java netbeans项目,一个是Server,另一个是Client。我已经创建了一个Message类,该类要传递给服务器,并在服务器上进行修改后以另一种方式返回给客户端。我在两个项目中都包含了Message类。我使用和传递对象。服务器和客户端之间的连接正常,并且对象通过,但在服务器上,当我从using 方法读取对象时,将其类型转换为类。但是在服务器上抛出 ClassNot

  • 问题内容: 我喜欢NodeJS的某些功能,特别是JQuerification,通过socket.io的websocket兼容性,我不能与JSP一起使用的视图和CSS引擎(当然还有异步调用)。至少据我所知。因此,我计划在后端为Java的情况下创建应用程序,前端由NodeJS生成。前端表单将数据发送到NodeJS,后者将通过NodeJS和Java后端之间的套接字连接将其传递到Java后端。因此,Nod

  • 请问,有任何简单的方法流(广播)媒体文件(ogg,mp3,SPX..)通过Node.js和Socket.io从服务器到客户机(浏览器)?

  • 问题内容: 我正在尝试开发一个非常简单的客户端/服务器,其中客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 当前,程序仅创建一个空文件。我不是一个出色的Java开发人员,因此不胜感激。 这是接收客户端发送的内容的服务器部分。 这是客户端部分 问题答案: 在Java中复制流的正确方法如下: 希望我每次在论坛上发布时都能获得一美元。