使用 Java 从麦克风传输音频

2023-12-02

我正在开发一个项目,需要我将音频从客户端的麦克风流式传输到服务器。下面显示的代码是我写的。当我同时运行客户端和服务器代码时,音频不会实时传输。事实上,来自客户端的音频存储在缓冲区中,当我终止客户端代码的执行时,来自服务器缓冲区的音频将输出到扬声器。我究竟做错了什么? (我正在eclipse上开发)

server:

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

//import org.apache.commons.io.output.ByteArrayOutputStream;


public class ServerStream {
    private OutgoingSoudnListener osl = new OutgoingSoudnListener();
    boolean outVoice = true;
    AudioFormat format = getAudioFormat();
    private ServerSocket serverSocket;
    Socket server;


    private AudioFormat getAudioFormat() {
        float sampleRate = 16000.0F;
        int sampleSizeBits = 16;
        int channels = 1;
        boolean signed = true;
        boolean bigEndian = false;

        return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
    }
    public ServerStream() throws IOException{
        try{
            System.out.println("Creating Socket...");
            serverSocket = new ServerSocket(3000);
            osl.runSender();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    class OutgoingSoudnListener{
        public void runSender(){
            try{
                server = serverSocket.accept();
                System.out.println("Listening from mic.");
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class,format);
                TargetDataLine mic = (TargetDataLine) AudioSystem.getLine(micInfo);
                mic.open(format);
                System.out.println("Mic open.");
                byte tmpBuff[] = new byte[mic.getBufferSize()/5];
                mic.start();
                while(outVoice) {
                    System.out.println("Reading from mic.");
                    int count = mic.read(tmpBuff,0,tmpBuff.length);
                    if (count > 0){
                        System.out.println("Writing buffer to server.");
                        out.write(tmpBuff, 0, count);
                    }               
                    }
                mic.drain();
                mic.close();
                System.out.println("Stopped listening from mic.");
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
    public static void main (String args[]) throws IOException{
        new ServerStream();

    }


}

client:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;


import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

import org.apache.commons.io.IOUtils;

public class ClientStream{

    public ClientStream() throws IOException{
        isl.runListener();
    }

    private IncomingSoundListener isl = new IncomingSoundListener();    
    AudioFormat format = getAudioFormat();
    InputStream is;
    Socket client;
    String serverName = "192.168.2.8";
    int port=3000;
    boolean inVoice = true;


    private AudioFormat getAudioFormat(){
        float sampleRate = 16000.0F;
        int sampleSizeBits = 16;
        int channels = 1;
        boolean signed = true;
        boolean bigEndian = false;

        return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
    }
    class IncomingSoundListener {
        public void runListener(){
            try{
                System.out.println("Connecting to server:"+serverName+" Port:"+port);
                client = new Socket(serverName,port); 
                System.out.println("Connected to: "+client.getRemoteSocketAddress());
                System.out.println("Listening for incoming audio.");
                DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class,format);
                SourceDataLine speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
                speaker.open(format);
                speaker.start();
                while(inVoice){
                    is = client.getInputStream();
                    byte[] data = IOUtils.toByteArray(is);  
                    ByteArrayInputStream bais = new ByteArrayInputStream(data);
                    AudioInputStream ais = new AudioInputStream(bais,format,data.length);
                    int bytesRead = 0;
                    if((bytesRead = ais.read(data)) != -1){
                        System.out.println("Writing to audio output.");
                        speaker.write(data,0,bytesRead);

       //                 bais.reset();
                    }
                    ais.close();
                    bais.close();

                }
               speaker.drain();
               speaker.close();
               System.out.println("Stopped listening to incoming audio.");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
    public static void main(String [] args) throws IOException{
            new ClientStream();
        }
    }

问题出在客户端, 在行中

byte[] data = IOUtils.toByteArray(is);

它处理对象本身,而不是内容。 所以,你必须将其更改为:

byte[] data = new byte[1024];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 从麦克风传输音频 的相关文章

随机推荐

  • WebGL:如何将值绑定到 mat4 属性?

    在某些 WebGL 应用程序中 假设我们有一个 GLSL 顶点着色器 其启动方式如下 attribute vec4 foo1 attribute vec4 foo2 attribute vec4 foo3 attribute vec4 fo
  • ServerCertificateCustomValidationCallback 自定义异常

    我想通过 HttpClientHandler 的 ServerCertificateCustomValidationCallback 属性进行自定义证书验证 但是 提供的回调只能返回 true 对于有效证书 或 false 对于无效证书 如
  • 如何在仅某些条件为 TRUE 的数组公式中包含 OR - Excel 第 2 部分

    这是这个的延伸question 回答者是XOR LX 在最初的问题中 我想计算矩阵中包含满足条件的值的行数最后一个特定于列的标准 引用的列是连续的 例如 A1 D4 但这种情况需要对不连续的列进行索引 取数据矩阵 A B C D E F G
  • 将当前Git分支设为master分支

    我在 Git 中有一个存储库 我创建了一个分支 然后对主分支和分支进行了一些更改 然后 数十次提交后 我意识到分支的状态比主分支好得多 所以我希望分支 成为 主分支并忽略主分支上的更改 我无法合并它 因为我不想将更改保留在 master 上
  • 在纯 JavaScript 中实现 setTimeout() 和 setInterval()

    我有一些支持在浏览器上运行的 JavaScript 基准测试代码 但我想在 JavaScript 引擎的控制台模式下运行它 例如 V8 中的 d8 以进行测试 我为每个 DOM 变量和函数编写了空变量和函数 例如document getEl
  • CSV 文件的 Blob 字符集

    我想使用 blob 创建一个 CSV 文件 该文件应该以 ANSI 编码 但它不起作用 var blob new Blob ufeff csvFile type text csv charset windows 1252 该文件始终使用 U
  • 什么是 zip(函数式编程?)

    我最近看到了一些 Clojure 或 Scala 抱歉我对它们不熟悉 它们确实压缩了一个列表或类似的东西 什么是 zip 它来自哪里 Zip 是指采用两个输入序列并生成一个输出序列 其中使用某个函数将输入序列中同一位置的每两个元素组合起来
  • 如何计算该程序在Python中执行了多少次?

    from itertools import permutations import random import pprint import timeit start time timeit default timer count 0 def
  • 我可以使用 Zoom.translateBy 设置初始平移吗?

    我有类似的东西 zoomable call d3 zoom scaleExtent 1 Infinity translateExtent 0 0 width height on zoom handleZoom 我似乎无法直接在缩放行为上调用
  • 使用 htmlspecialchars 函数与 PDO 准备和执行

    正在使用 PHP PDO 在表单验证和数据库查询中将特殊字符转换为 HTML 实体htmlspecialchars 功能真的有必要吗 例如 我有一个带有简单登录系统的网站 或多或少类似于 username string htmlspecia
  • 是否可以在量角器调试配置(WebStorm)中指定参数

    I m using Protractor in Webstorm and in order to use parameters in the terminal I can do protractor params url http www
  • 使用 Json.NET 序列化对象列表

    我有一个如下的对象模型 将从数据库检索的数据绑定到该模型 public class Student public virtual string serialNumber set get public virtual string stude
  • Visual Studio 代码:Paperscript

    抱歉我的英语水平 你知道任何扩展或其他东西来给 paperscript 代码着色吗 paperscript 色差示例 因为你的编辑器不认识text paperscriptMIMEtype 它不知道要应用什么语法突出显示 为了避免这种情况 最
  • 描述 Assembly 中的 pop [重复]

    这个问题在这里已经有答案了 我正在学习IA32 当我思考什么时popl DEST我认为指令正在做以下事情 movl esp DEST addl 4 esp 但当我想到popl esp 尽管这可能是一个毫无意义的指令 但我认为可能有更好的方法
  • 如何打印嵌入空值的字符串,以便用“(null)”替换“\0”

    我有一个使用 memcpy 组成的字符串 展开时 如下所示 char str AAAA x00 x00 x00 x11 x11 x11 x11 x00 x00 我想打印字符串中的每个字符 如果该字符为空 则打印出来 null 作为 0 的替
  • 带有全选复选框的可扩展列表视图:组项目单击和滚动错误

    我有一个 ExpandableListView 组名称旁边有一个复选框 展开时 子项目也带有复选框 假设我有 4 个组 有 50 个孩子 当展开一个组时 我单击全选复选框 一切正常 所有复选框都被选中 并在滚动时保持其状态 但是 如果我滚动
  • “ 远程服务器返回错误:(401) 未经授权”

    我正在尝试验证我的网址是否得到响应 换句话说 我正在尝试检查该网站的身份验证是否已成功 I used HTTP Request System Net WebRequest Create http example com HTTP Respo
  • 如何在 404 Tomcat 上重定向到外部网站

    我使用的是 spring 3 Tomcat 7 In web xml我已经定义了
  • TFS 构建定义未将 mvc 应用程序部署到 IIS

    我正在尝试使用 Visual Studio 的团队资源管理器和 TFS 创建构建定义以将 MVC 站点部署到 IIS 我遵循了名为 Team Foundation Server 2010 的持续部署 的 Pluralsight 教程 我从本
  • 使用 Java 从麦克风传输音频

    我正在开发一个项目 需要我将音频从客户端的麦克风流式传输到服务器 下面显示的代码是我写的 当我同时运行客户端和服务器代码时 音频不会实时传输 事实上 来自客户端的音频存储在缓冲区中 当我终止客户端代码的执行时 来自服务器缓冲区的音频将输出到