Android简单的Wifi语音对讲实现

Android简单的Wifi语音对讲实现目录 1 录制数据 2 标记数据打包 3 网络发送 4 监听接受数据 5 数据解包 6 判别标记处理 7 播放数据 1 录制数据 获取录制缓存大小 int recordBuffer AudioRecord getMinBuffer 44100 采样率 AudioFormat

大家好,我是讯享网,很高兴认识大家。

目录:

1. 录制数据 2. 标记数据打包 3. 网络发送 4. 监听接受数据 5. 数据解包 6. 判别标记处理 7. 播放数据 

讯享网

1. 录制数据:

讯享网 //获取录制缓存大小 int recordBuffersize = AudioRecord.getMinBufferSize( 44100,//采样率 AudioFormat.CHANNEL_IN_MONO,//采样通道数,此处单声道 AudioFormat.ENCODING_PCM_16BIT//采样输出格式 ); //初始化录音对象 AudioRecord recorder = new AudioRecord( MediaRecord.AudioSource.MIC,//音源,此处麦克风 44100,//采样率 AudioFormat.CHANNEL_IN_MONO,//采样通道数 AudioFormat.ENCODING_PCM_16BIT,//采样输出格式 recordBuffersize//上述求得录制最小缓存 ); / 个人认为,重复使用了相同的参数,却只为了一个recorder对象, 感觉android还是可以优化这个地方的api.提供一个封装方法,不过也有可能是为了让用户更灵活选择缓存大小的需求吧. */

2. 标记数据打包并发送:

2.1 定义数据包DataPacket结构:

public class DataPacket { 
    public static final int HEAD_LENGTH = 30;//头信息大小 public static final int BODY_LENGTH = 640;//语音包大小 private byte[] recordBytes = new byte[HEAD_LENGTH + BODY_LENGTH]; public DataPacket(byte[] headInfo, byte[] bodyBytes) { for (int i = 0; i < headInfo.length; i++) { recordBytes[i] = headInfo[i]; } for (int i = 0; i < bodyBytes.length; i++) { recordBytes[i+30] = bodyBytes[i]; } } }

2.2 打包网络包

讯享网//定义信息头 String DevInfo = android.os.Build.MODEL + " Android " + android.os.Build.VERSION.RELEASE;  DatagramSocket clientSocket = new DatagramSocket(); //向192.168.1.0这个网段广播数据 InetAddress ip = InetAddress.getByName("192.168.1.0"); //获取音频数据 recorder.read(recordBytes, 0, recordBytes.length); //构建数据包 DataPacket dp = new DataPacket(DevInfo.getBytes(), recordBytes); //构建数据报文 DatagramPacket sendPacket = new DatagramPacket( dataPacket.getAllData(), dataPacket.getLength(), ip, 8000);//网络端口 //发送 clientSocket.send(sendPacket); clientSocket.close();

4. 接收数据:

DatagramSocket serverSocket = new DatagramSocket(8000); while(true){ if(isRunning) { DatagramPacket recedgp = new DatagramPacket( recordBytes, recordBytes.length); serverSocket.receive(recedgp); //接收到数据报文后,进行解包处理得出 byte[] head,body;//...省略获得方式 //通过头信息判断是否本机发送 String thisHead = new String(head); if(DevInfo.equals(thisHead)){ //本机发送不做处理返回 return; } //播放数据 play.write(body, 0, body.length); play.play(); } }

7. 播放

讯享网/ 播放器初始化 */ int playerBufferSize = AudioTrack.getMinBufferSize( 44100,//音频数据的采样率 AudioFormat.CHANNEL_OUT_MONO,//通道 AudioFormat.ENCODING_PCM_16BIT); AudioTrack player = new AudioTrack( / 这个属性关于日后的调节声音比较重要, 在Android系统中是根据AudioManager的 StreamType来调节系统声音. */ AudioManager.STREAM_MUSIC, 44100,//数据的采样率 AudioFormat.CHANNEL_OUT_MONO,//通道 AudioFormat.ENCODING_PCM_16BIT,//数据格式 playerBufferSize,//上述求得缓存大小 AudioTrack.MODE_STREAM);//流的形式播放 
小讯
上一篇 2025-02-18 16:24
下一篇 2025-02-24 18:04

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/72944.html