클라이언트에서 start recording 버튼을 누르면
RecordAudiore를 사용하여 녹음을하고
서버로 스트리밍으로 전송해서
실시간으로 음성을 들을 수 있도록 만들려고 합니다
하지만, 실행해보면 소리가 제대로 전달되지 않고
지지직 거리는 소리만 들립니다
초보라서 그런지 문제들 해결하는게 어렵네요ㅠㅠ
잘못된 부분이 있는지 도움부탁드립니다
클라이언트소스(record)
public class Udpclient extends Activity implements OnClickListener{
DatagramSocket socket;
DatagramPacket packet, packets;
RecordAudio recordTask;
Button start_rec;
boolean isRecording = false;
boolean isPlaying = false;
BufferedOutputStream bufferedStreamInstance;
int frequency=44100;
int channelconfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioencoding=AudioFormat.ENCODING_PCM_16BIT;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_udpclient);
start_rec = (Button)findViewById(R.id.start_recording);
start_rec.setOnClickListener(this);
}
public void onClick(View v){
if(v == start_rec){
record();
}
}
public void record(){
start_rec.setEnabled(false);
recordTask = new RecordAudio();
recordTask.execute();
}
private class RecordAudio extends AsyncTask<Void, Integer, Void>{
protected Void doInBackground(Void... params){
isRecording = true;
try {
socket = new DatagramSocket();
int bufferread=0;
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(isRecording){
int bufferreadresult = audioRecord.read(buffer, 0, buffersize);
byte[] buf = new byte[64];
for(int i=0; i<bufferreadresult; i++){
String ss = String.valueOf((int)buffer[i]);
buf = ss.getBytes();
packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.0.10"), 9001);
socket.send(packet);
}
}
audioRecord.stop();
} catch(Throwable t){
Log.e("AudioRecord", "Recording Failed");
}
return null;
}
}
서버소스(play)
public class Udpserver extends Activity implements OnClickListener{
TextView output, cli_result;
DatagramSocket socket;
DatagramPacket packet, receivepacket;
Button play_audio;
PlayAudio playTask;
boolean isPlaying = false;
int frequency=44100;
int channelconfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioencoding=AudioFormat.ENCODING_PCM_16BIT;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_udpserver);
output = (TextView)findViewById(R.id.output);
cli_result = (TextView)findViewById(R.id.client_result);
play_audio = (Button)findViewById(R.id.connect);
play_audio.setOnClickListener(this);
}
public void onClick(View v){
if(v == play_audio){
play();
}
}
public void play(){
play_audio.setEnabled(true);
playTask = new PlayAudio();
playTask.execute();
}
private class PlayAudio extends AsyncTask<Void, Integer, Void>{
protected Void doInBackground(Void... params){
isPlaying = true;
byte[] buf = new byte[64];
int buffersize = AudioTrack.getMinBufferSize(frequency, channelconfiguration, audioencoding);
short[] audiodata = new short[buffersize/4];
try{
socket=new DatagramSocket(9001);
receivepacket= new DatagramPacket(buf, buf.length);
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelconfiguration, audioencoding, buffersize*4, AudioTrack.MODE_STREAM);
audioTrack.play();
while(isPlaying){
for(int i=0; i<audiodata.length; i++){
socket.receive(receivepacket);
String temp = new String(buf, 0, receivepacket.getLength());
audiodata[i]=Short.parseShort(temp);
}
audioTrack.write(audiodata, 0, audiodata.length);
}
}catch(Exception ex){
Log.e("udpreceiver", "s:error");
}
return null;
}
}
public void onDestroy() {
super.onDestroy();
socket.close();
}
}