http://hkk.iteye.com/blog/1248259

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

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

Java代码  
  1. public class AudioSend extends Thread {
  2. Person person = null;
  3. public AudioSend(Person person) {
  4. this.person = person;
  5. // android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
  6. }
  7. @Override
  8. public void run() {
  9. super.run();
  10. Socket socket = null;
  11. OutputStream os = null;
  12. AudioRecord recorder = null;
  13. try {
  14. socket = new Socket(person.ipAddress, Constant.AUDIO_PORT);
  15. socket.setSoTimeout(5000);
  16. os = socket.getOutputStream();
  17. // 获得录音缓冲区大小
  18. int bufferSize = AudioRecord.getMinBufferSize(FlyGeonApplication.getInstance().sampRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
  19. AudioFormat.ENCODING_PCM_16BIT);
  20. Log.e("", "录音缓冲区大小"+bufferSize);
  21. // 获得录音机对象
  22. recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, FlyGeonApplication.getInstance().sampRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
  23. AudioFormat.ENCODING_PCM_16BIT, bufferSize * 10);
  24. recorder.startRecording();// 开始录音
  25. byte[] readBuffer = new byte[640];// 录音缓冲区
  26. int length = 0;
  27. while (!isStopTalk) {
  28. length = recorder.read(readBuffer, 0, 640);// 从mic读取音频数据
  29. if (length > 0 && length % 2 == 0) {
  30. os.write(readBuffer, 0, length);// 写入到输出流,把音频数据通过网络发送给对方
  31. }
  32. }
  33. recorder.stop();
  34. recorder.release();
  35. recorder = null;
  36. os.close();
  37. socket.close();
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }

接收播放线程

Java代码  
  1. public class AudioPlay extends Thread {
  2. Socket socket = null;
  3. public AudioPlay(Socket socket) {
  4. this.socket = socket;
  5. // android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
  6. }
  7. @Override
  8. public void run() {
  9. super.run();
  10. try {
  11. InputStream is = socket.getInputStream();
  12. // 获得音频缓冲区大小
  13. int bufferSize = android.media.AudioTrack.getMinBufferSize(FlyGeonApplication.getInstance().sampRate,
  14. AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
  15. Log.e("", "播放缓冲区大小"+bufferSize);
  16. // 获得音轨对象
  17. AudioTrack player = new AudioTrack(FlyGeonApplication.getInstance().getVoiceMode(), FlyGeonApplication.getInstance().sampRate,
  18. AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize,
  19. AudioTrack.MODE_STREAM);
  20. // 设置喇叭音量
  21. player.setStereoVolume(1.0f, 1.0f);
  22. // 开始播放声音
  23. player.play();
  24. byte[] audio = new byte[160];// 音频读取缓存
  25. int length = 0;
  26. while (!isStopTalk) {
  27. length = is.read(audio);// 从网络读取音频数据
  28. byte[] temp = audio.clone();
  29. if (length > 0 && length % 2 == 0) {
  30. // for(int
  31. // i=0;i<length;i++)audio[i]=(byte)(audio[i]*2);//音频放大1倍
  32. player.write(audio, 0, temp.length);// 播放音频数据
  33. }
  34. }
  35. player.stop();
  36. player.release();
  37. player = null;
  38. is.close();
  39. socket.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }

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

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

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

以下是软件截图


 
 

apk下载地址

  • jywdjj.zip (762.3 KB)

android 局域网对讲机相关推荐

  1. android对讲机 服务端,Android的WIFI局域网对讲机

    https://blog.csdn.net/z979451341/article/details/79280749 (三)Android局域网内语音对讲 基于UDP语音传输 https://blog. ...

  2. 基于 P2P 技术的 Android 局域网内设备通信实践

    Android 局域网内的多设备通信方式有多种,其中常见的方式有: 基于 TCP/UDP 的 Socket 通信 基于 Bluetooth 的近场通信 基于 Wifi 的 Wi-Fi Direct 连 ...

  3. android 局域网 发现,局域网内android设备发现及通讯

    最近一个项目需要实现在局域网内android手机操控另一个没有显示屏的android设备(音箱),具体实现就是手机端向音箱端发送命令字符串,音箱端通过解析命令字符串来完成操作,而手机端也要实时显示音箱 ...

  4. Android 局域网扫描

    本篇简单介绍通过UDP广播扫描局域网设备IP,并且通过ZMQ进行通信. UDP连接 主要流程: 1.1 Step1:主机发送广播信息,并指定接收端的端口(9000) 广播地址(255.255.255. ...

  5. vlc android局域网rtsp,VLC mosaic分屏显示多路RTSP媒体流问题。

    局域网环境内有两台Android机,装了Spydroid来获取传送RTSP媒体流,配置如下: Video Encoder: H.264 Resolution: 640*480 Framerate: 8 ...

  6. Android局域网实现FTP文件上传下载客户端与服务端

    文章目录 前言 一.FTP是什么? 二.使用步骤 1 服务端 1.1 服务端的代码实现 2 客户端 2.1 客户端的代码实现 附件 前言 最近在公司的项目中,使用到了 局域网通信,不同的设备直接传递消 ...

  7. android局域网视频传输,[Android]如何通过局域网从计算机播放本地视频

    与移动电话相比,计算机具有功能强大和存储容量大的优势,但是我们越来越依赖于移动电话等移动设备. 很少打开计算机. 我可以使用计算机为手机等移动设备服务吗?通过在同一网络中设置计算机文件夹共享,移动设备 ...

  8. Android局域网对讲,基于Android系统机器人局域网对讲方法与流程

    本发明涉及智能机器人管理方法,具体涉及一种实现手机端与智能机器人对讲的方法. 背景技术: IP网络对讲采用领先的VOIP技术,将模拟音频信号转化成数字信号,在局域网和广域网上进行双向传送.IP网络对讲 ...

  9. android局域网udp视频对讲,Android基于UDP语音对讲系列(一)

    Android 两部手机通过UDP在局域网内通信 最近学习了一下socket通信相关的知识,决定从UDP进行文字传输开始做起.华为手机效果如图: 我的另一部是小米手机:网络IP为192.168.1.1 ...

最新文章

  1. alert()的功能_前端实现简单的图片上传小图预览功能
  2. CentOS7 续续
  3. Druid 连接池的实用 配置详解
  4. adb启动失败 ADB server didn't ACK
  5. 定点c程序之五:定点数的字长效应
  6. Python的魔法方法 .
  7. x210-II WinCE启动10s,还可继续优化
  8. 【华为云技术分享】华为云多元计算+AI 打造企业级智能数据湖
  9. iOS 关于NSString的一些方法
  10. windows环境下kafka源代码开发环境搭建
  11. 【测试】ESP8266ESP32wifi中继器测试数据
  12. python 串口接收多线程与界面通信_Python之PyQT多线程串口代码分析
  13. 普莱得电器递交注册:上半年营收3.7亿 拟募资5.6亿
  14. 74hc595级联c语言程序,stm32使用三片74HC595级联程序代码
  15. 又是一年金九银十!一起看看这些大厂面试真题查漏补缺吧,程序员翻身之路
  16. vue实现PDF文件导出
  17. css 超出显示省略号
  18. opencv android安装教程,opencv for android安装教程.doc
  19. C++中常见异常错误
  20. 英语词组的日常积累(有点长,接近300个)

热门文章

  1. MyBatis—MyBatis注解开发
  2. 使用Python暴力破解密码
  3. oppo人岗匹配测评_在测试中使用匹配器
  4. html怎么引入JavaScript代码
  5. 读书笔记:《持续交付》
  6. 利用青龙面板给天翼云盘实现天翼云盘自动签到
  7. ES6转码工具的安装
  8. 微信小程序健身记录管理
  9. Hibernate 中的attachDirty,attachClean,merge,findByProperty和findByExample
  10. 同步整流和非同步整流有什么区别?