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

UDP통신 실시간 AudioRecord, AudioTrack 질문입니다.

0 추천
private class RecordAudio extends AsyncTask<Void, Integer, Void> {
        protected Void doInBackground(Void... params) {
            isRecording = true;
            try {
                serverSocket = new DatagramSocket();
                int bufferread = 0;
 
                int buffersize = AudioRecord.getMinBufferSize(DATA_DIC.frequency, DATA_DIC.channelconfiguration, DATA_DIC.audioencoding);
                AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, DATA_DIC.frequency,
                        DATA_DIC.channelconfiguration, DATA_DIC.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[4096];
 
                    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(Util.getLocalIpAddress()), DATA_DIC.UDP_PORT);
                        packet = new DatagramPacket(buf, buf.length, clientAddr, DATA_DIC.UDP_PORT_AUDIO);
                        serverSocket.send(packet);
                        Log.d("RecordAudio", ""+i);
                    }
                }
                audioRecord.stop();
            } catch (Throwable t) {
                Log.e("AudioRecord", "Recording Failed");
            }
            return null;
        }
    }
 
 
 
 
private class PlayAudio extends AsyncTask<Void, Integer, Void> {
        protected Void doInBackground(Void... params) {
            isPlaying = true;
            byte[] buf = new byte[4096];
 
            int buffersize = AudioTrack.getMinBufferSize(DATA_DIC.frequency, DATA_DIC.channelconfiguration,
                    DATA_DIC.audioencoding);
            short[] audiodata = new short[buffersize];
 
            try {
                socket = new DatagramSocket(DATA_DIC.UDP_PORT_AUDIO);
                receivepacket = new DatagramPacket(buf, buf.length);
 
                AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, DATA_DIC.frequency,
                        DATA_DIC.channelconfiguration, DATA_DIC.audioencoding, buffersize, 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);
                        Log.d(tag, "PlayAudio"+i);
                    }
                    audioTrack.write(audiodata, 0, audiodata.length);
                     
                }
                startUDP("audio 확인완료");
            } catch (Exception ex) {
                Log.e("udpreceiver", "s:error");
            }
            Log.d(tag, "audioThread");
            return null;
        }
    }
 
 
 
    public static final int frequency = 44100;
    public static final int channelconfiguration = AudioFormat.CHANNEL_IN_MONO;
    public static final int audioencoding = AudioFormat.ENCODING_PCM_16BIT;

지금 단말끼리 무전기처럼 구현해보려고 하는데요 지금상황은 전달하고자하는 폰에서 말을하면 듣는 폰에서는 한 5초 정도? 뒤에 소리가 한번 들리고 마는데 소리가 제대로 가는건지 아니면 소리가 듣는데서 잘못된건지 감을 못잡겠습니다 ㅠㅠ 한번들리는것도 한음 득! ? 이런 소리 ㅎㅎㅎ 큰소리로 말하면 들리는 소리가 커지고 작게 말하면 들리는 소리가 작은거같아서 말한게 한꺼번에 몰아서 오는것같기도 한데 ㅠㅠ 다른분들은 다하던데 도와주세요~

윤슈슈슈 (3,030 포인트) 님이 2015년 11월 26일 질문

답변 달기

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