实时语音通信

1.语音采集:客户端程序,调用音频驱动,实时采集”麦克风(mic)”的语音数据,保存到内存中。
2. 语音传输:将内存中语音数据,通过TCP/IP协议传输到服务器端。
3. 语音播放:服务器接收音频数据,并实时播放。
4. 设计可操作图形界面

5. 作为可选的扩充功能1,实现端与端之间的双向通信。

ps:服务端界面显示了本地的IP地址。

客户端和服务的都有保存音频文件输入框

 

1。服务端代码:

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


/*
 * 双向通信的服务端.
 */
public class Server extends JFrame implements ActionListener {
private    static String path;//接收文件的路径
private    static String savepath;//保存文件的路径
    
        JPanel jp1, jp2, jp3,jp4;
        JLabel jl1 = null;
        JButton captureBtn, stopBtn, playBtn, saveBtn,sendBtn,setButton;
      //连接信息和录音信息
        JLabel linkLabel=null;
        JLabel rdLabel=null;
        JLabel ipLabel=null;
        //路径信息
        JTextField  repath,svpath;
        //定义初始音频类
       audioUtils server=null;
       //获取本地IP
       InetAddress ia=null;
       
       Socket s=null;
    
     // 构造函数
        public  Server() throws UnknownHostException {
            // 组件初始化
            jp1 = new JPanel();
            jp2 = new JPanel();
            jp3 = new JPanel();
            jp4=new JPanel();
            //文本框初始化
              repath=new JTextField("输入接收录音文件保存的路径");
               svpath=new JTextField("输入要保存的录音文件路径");
            //定义连接和录音提示
             linkLabel=new JLabel("未连接");
             rdLabel=new JLabel("");
             ipLabel=new JLabel("本地IP:"+ia.getLocalHost().getHostAddress());
            
             // 定义字体
            Font myFont = new Font("宋体", Font.BOLD, 30);
            jl1 = new JLabel("实时通信系统服务端");
            jl1.setFont(myFont);
        
            captureBtn = new JButton("开始录音");
            // 对开始录音按钮进行注册监听
            captureBtn.addActionListener(this);
            captureBtn.setActionCommand("captureBtn");
            // 对停止录音进行注册监听
            stopBtn = new JButton("停止录音");
            stopBtn.addActionListener(this);
            stopBtn.setActionCommand("stopBtn");
            // 对播放录音进行注册监听
            playBtn = new JButton("播放录音");
            playBtn.addActionListener(this);
            playBtn.setActionCommand("playBtn");
            // 对保存录音进行注册监听
            saveBtn = new JButton("保存录音");
            saveBtn.addActionListener(this);
            saveBtn.setActionCommand("saveBtn");
            //对发送录音进行注册监听
            sendBtn=new JButton("发送录音");
            sendBtn.addActionListener(this);
            sendBtn.setActionCommand("sendBtn");
            //对设置ip,路径等监听
            setButton=new JButton("保存设置");
            setButton.addActionListener(this);
            setButton.setActionCommand("setButton");
            
            
            this.add(jp1, BorderLayout.NORTH);
            this.add(jp2, BorderLayout.CENTER);
            this.add(jp3, BorderLayout.SOUTH);
            this.add(jp4,BorderLayout.NORTH);
            jp3.setLayout(null);
            jp3.setLayout(new GridLayout(1, 4, 10, 10));
            jp2.add(rdLabel);
            jp2.add(linkLabel);
            jp2.add(ipLabel);
            jp3.add(captureBtn);
            jp3.add(stopBtn);
            jp3.add(playBtn);
            jp3.add(saveBtn);
            jp3.add(sendBtn);
            jp4.add(svpath);
            jp4.add(repath);
            jp4.add(setButton);
            // 设置按钮的属性
            this.captureBtn.setEnabled(false);
            this.stopBtn.setEnabled(false);
            this.playBtn.setEnabled(false);
            this.saveBtn.setEnabled(false);
            this.sendBtn.setEnabled(false);
            // 设置窗口的属性
            this.setSize(700, 500);
            this.setTitle("服务端");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
            this.setVisible(true);
            
            try {
                server=new audioUtils();
                //等待连接
                ServerSocket ss=new ServerSocket(8888);
                //阻塞方法,一直等待客户端接入
                while(true){
                //监听连接
                    
                     s=ss.accept();
                    JOptionPane.showMessageDialog(null, "连接成功....");
            
                    System.out.println("已经连接");
                    linkLabel.setText("已连接:");
                    //开启一个接收文件的线程
                    server.recied(s, new File(path));
                    
            }
                
            }
            catch (Exception e) {
            e.printStackTrace();
            linkLabel.setText("未连接:");
            }
             
        }
            
        //事件
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("captureBtn")) {
                // 点击开始录音按钮后的动作
                // 停止按钮可以启动
                captureBtn.setEnabled(false);
                stopBtn.setEnabled(true);
                playBtn.setEnabled(false);
                saveBtn.setEnabled(false);
                sendBtn.setEnabled(false);
                
                // 调用录音的方法
                capture();
                rdLabel.setText("正在录音..");
            } else if (e.getActionCommand().equals("stopBtn")) {
                // 点击停止录音按钮的动作
                captureBtn.setEnabled(true);
                stopBtn.setEnabled(false);
        

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值