마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

클라이언트에서 audiorecord로 녹음한 것을 서버에서 play

0 추천

클라이언트에서 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();
}
}

 

송아지이 (120 포인트) 님이 2013년 4월 2일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...