目录:
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);