Android简单的Wifi语音对讲实现

目录:

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);//流的形式播放

你可能感兴趣的:(Android多媒体学习)