소켓통신 UDP를 사용하여 실시간으로 녹음된 데이터를 다른 핸드폰으로 보내려고 합니다ㅜㅜㅜ
제가 보기엔 데이터는 잘 전송되는데
받은 데이터들이 소리로 변형될때 이상한 소리가 나네요ㅠㅠㅠㅠ
몇일동안 고민해봐도 진도가 안나가네요ㅠㅠㅠ
보내는 부분
package com.pro.TelNetwork;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.util.Log;
public class NetworkUDP {
private static final int port = 7999;
// 서버에서 설정한 UDP 포트번호를 추가합니다.
RecordAudio recordTask;
String dataInString = "";
int frequency = 11025;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
// byte[] audiodata = new byte[10];
DatagramSocket socket;
DatagramPacket Packet;
// private BufferedReader networkReader;
private String myID = "";
private String myIP = "";
private String targetIP = "";
private String targetID = "";
public NetworkUDP(String targetIP) {
this.targetIP = targetIP;
}
public String run() {
recordTask = new RecordAudio();
recordTask.execute();
return dataInString;
}
private class RecordAudio extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
socket = new DatagramSocket();
InetAddress serverAddr = InetAddress.getByName(targetIP);
Log.e("udp", "targetIP : " + targetIP + ", port : " + port);
int bufferSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, audioEncoding, bufferSize);
short[] buffer = new short[bufferSize];
audioRecord.startRecording();
int r = 0;
while (true) {
int bufferReadResult = audioRecord.read(buffer, 0,
bufferSize);
byte[] buf = new byte[8];
// try {
// Thread.sleep(500);
// } catch (Exception e) {
// Log.e("error", "" + e);
// }
for (int i = 0; i < bufferReadResult; i++) {
String ss = String.valueOf((int) buffer[i]);
buf = ss.getBytes();
Packet = new DatagramPacket(buf, buf.length,
serverAddr, port);
socket.send(Packet);
Log.e("====", "buffer[i] : " + buffer[i]
+ ", (int) buffer[i] : " + (int) buffer[i]);
// Log.e("buffer", r + " : " + buf);
// socket.receive(Packet);
// String s = new String(Packet.getData());
// audiodata = s.getBytes();
// Log.e("UDP", "Receive" + s.getBytes());
}
}
// dos.close();
} catch (Throwable t) {
// TODO: handle exception
Log.e("RecordTrack", "" + t);
}
return null;
}
}
}
받는 부분
package com.pro.namespace;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
public class ReceiverActivity extends Activity {
private int port = 7999;
private DatagramSocket socket;
private DatagramPacket receivePacket;
String str;
Thread th;
String dataInString = "";
int frequency = 11025;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
PlayAudio playTask;
Boolean playTaskCheck = true;
Queue2 q;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e("UDP", "--------");
playTask = new PlayAudio();
playTask.execute();
}
private class PlayAudio extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
byte[] buf = new byte[8];
int bufferSize = AudioTrack.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
short[] audiodata = new short[bufferSize / 4];
try {
socket = new DatagramSocket(port);
receivePacket = new DatagramPacket(buf, buf.length);
Log.e("UDP", "S: Connecting...");
Log.e("IP Address", getLocalIpAddress());
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC, frequency,
channelConfiguration, audioEncoding, bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
while (true) {
// buf = temp.getBytes(); // Byte단위로 변환합니다.
// int i = 0;
for (int i = 0; i < audiodata.length; i++) {
socket.receive(receivePacket);
String temp = new String(buf, 0,
receivePacket.getLength());
audiodata[i] = Short.parseShort(temp);
Log.e("Receive",
"i : " + i + ", Short : "
+ Short.parseShort(temp));
}
audioTrack.write(audiodata, 0, audiodata.length);
}
} catch (Exception ex) {
Log.e("UDPReceiver", "S: Error", ex);
}
return null;
}
}
public String getLocalIpAddress() {
try {
Enumeration<NetworkInterface> en = NetworkInterface
.getNetworkInterfaces();
while (en.hasMoreElements()) {
NetworkInterface interf = en.nextElement();
Enumeration<InetAddress> ips = interf.getInetAddresses();
while (ips.hasMoreElements()) {
InetAddress inetAddress = ips.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("Testing", ex.toString());
}
return null;
}
}




소리 데이터를 보낼 때는 반드시 중간에 버퍼를 두고 버퍼 콘트롤 하셔야 합니다.
http://www.androidpub.com/2183734