android 局域网对讲机

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 19:05   41   0

参考了一些代码,实现了局域网的实时语音对讲功能,只要同网段局域网即可通话,文字聊天,传输文件等,包含了飞鸽传输的功能。

主要是录音发送和接收播放录音比较重要。录音线程:

public class AudioSend extends Thread {
  Person person = null;

  public AudioSend(Person person) {
   this.person = person;
   // android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
  }

  @Override
  public void run() {
   super.run();
   Socket socket = null;
   OutputStream os = null;
   AudioRecord recorder = null;
   try {
    socket = new Socket(person.ipAddress, Constant.AUDIO_PORT);
    socket.setSoTimeout(5000);
    os = socket.getOutputStream();
    // 获得录音缓冲区大小
    int bufferSize = AudioRecord.getMinBufferSize(FlyGeonApplication.getInstance().sampRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
      AudioFormat.ENCODING_PCM_16BIT);
    Log.e("", "录音缓冲区大小"+bufferSize);

    // 获得录音机对象
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, FlyGeonApplication.getInstance().sampRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
      AudioFormat.ENCODING_PCM_16BIT, bufferSize * 10);

    recorder.startRecording();// 开始录音
    byte[] readBuffer = new byte[640];// 录音缓冲区

    int length = 0;

    while (!isStopTalk) {
     length = recorder.read(readBuffer, 0, 640);// 从mic读取音频数据
     if (length > 0 && length % 2 == 0) {
      os.write(readBuffer, 0, length);// 写入到输出流,把音频数据通过网络发送给对方
     }
    }
    recorder.stop();
    recorder.release();
    recorder = null;
    os.close();
    socket.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

接收播放线程

 public class AudioPlay extends Thread {
  Socket socket = null;

  public AudioPlay(Socket socket) {
   this.socket = socket;
   // android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
  }

  @Override
  public void run() {
   super.run();
   try {
    InputStream is = socket.getInputStream();
    // 获得音频缓冲区大小
    int bufferSize = android.media.AudioTrack.getMinBufferSize(FlyGeonApplication.getInstance().sampRate,
      AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
    Log.e("", "播放缓冲区大小"+bufferSize);

    // 获得音轨对象
    AudioTrack player = new AudioTrack(FlyGeonApplication.getInstance().getVoiceMode(), FlyGeonApplication.getInstance().sampRate,
      AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize,
      AudioTrack.MODE_STREAM);

    // 设置喇叭音量
    player.setStereoVolume(1.0f, 1.0f);

    // 开始播放声音
    player.play();
    byte[] audio = new byte[160];// 音频读取缓存
    int length = 0;

    while (!isStopTalk) {
     length = is.read(audio);// 从网络读取音频数据
     byte[] temp = audio.clone();
     if (length > 0 && length % 2 == 0) {
      // for(int
      // i=0;i<length;i++)audio[i]=(byte)(audio[i]*2);//音频放大1倍
      player.write(audio, 0, temp.length);// 播放音频数据
     }
    }
    player.stop();
    player.release();
    player = null;
    is.close();
    socket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

AudioTrack player = new AudioTrack(FlyGeonApplication.getInstance().getVoiceMode(), FlyGeonApplication.getInstance().sampRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize,
AudioTrack.MODE_STREAM);

其中第二个参数与机器有关,一般为8000。我在解决这个问题时 就是遍历一遍常见的可能数值,直到正确为止。

第一个参数是声音的播放模式,可以为听筒模式和扬声器模式。由于扬声器模式会有回音,所以一般用听筒模式即可。

以下是软件截图











以下是程序包,解压为apk即可安装

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP