2013-09-26 2 views
2

내 논문을 위해 VoIP 응용 프로그램을 만들고 있습니다. 누군가이 시나리오에서 나를 도울 수 있는지 알고 싶습니다. AudioThread와 AudioSendThread 두 개의 스레드가 있습니다. 첫 번째 수신기는 DatagramSocket을 통해 오디오 패킷을 수신하여 전화로 재생합니다. 두 번째는 20 밀리 초의 사운드를 잡고 다른 장치로 보내는 레코더입니다. 나는 java에서 구현했지만 정말 느리다. 그래서 나는 OpenSL을 시도하기로 결정했다. 그러나 나는 이런 식으로 어떤 문서를 찾지 못했다. OpenSL을 이용한 안드로이드 음성 통화

은 AudioSendThread

public class AudioSendThread implements Runnable { 
private final static String TAG = "AudioSndThread"; 
private boolean createdAudioP = false; 
private DatagramSocket audioSndSocket; 
private String ipAddr; 
private byte[] buffer; 

public AudioSendThread(Object o){ 
    this.ipAddr = //getting IpAddress 
    audioSndSocket = (DatagramSocket)o; 
} 

@Override 
public void run() { 
    if(!createdAudioP) 
     createdAudioP = createAudioRecorder(); 
    if(createdAudioP) 
     startRecording(); 
    DatagramPacket packet = null; 
    while(true){ 
      byte[] buffer = readAudio(20); //read 20 milliseconds of audio, this is the one i would like to implement in OpenSL 
     try { 
      packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(this.ipAddr), PORT.AUDIO); 
      audioSndSocket.send(packet); 
     } catch (IOException e) { 
      Log.e(TAG, e.getMessage()); 
      return; 
     } 

    } 
} 

public static native void startRecording(); 
public static native boolean createAudioRecorder(); 
public static native byte[] readAudio(int millis); 

static { 
    System.loadLibrary("SoundUtils"); 
}} 

되고 AudioThread

public class AudioThread implements Runnable{ 
private DatagramSocket audioServSock; 

@Override 
public void run() { 
      createBufferQueueAudioPlayer(); 
    DatagramPacket packet = null; 
    Thread audioSndThread = null; 
    try { 
     this.audioServSock = new DatagramSocket(PORT.AUDIO); 
    } catch (SocketException e1) { 
     e1.printStackTrace(); 
    } 
    if(true){ 
     audioSndThread = new Thread(new AudioSendThread(this.audioServSock)); 
     audioSndThread.start(); 
    } 
      byte[] buffer = new buffer[1500]; //random size 
    packet = new DatagramPacket(buffer, 1500); 
    while(true){ 
     try { 
      audioServSock.receive(packet); 
      playAudio(buffer, packet.getLength()); //other method i would like to implement in OpenSL 
     } catch (IOException e) { 
      Log.e(TAG, Log.getStackTraceString(e)); 
      return; 
     }   
    } 
    at.stop(); 
    at.release(); 
} 

public static native void createBufferQueueAudioPlayer(); 
public static native void playAudio(byte[] buffer, int length); 

/** Load jni .so on initialization */ 
static { 
    System.loadLibrary("native-audio-jni"); 
} 

}

다른 네이티브 메소드는 NDK

감사의 NativeAudio 샘플로 촬영을 thisone 모든 어떤 제안이라도!

+0

Android NDK에는 OpenSL ES를 사용하여 녹음 및 재생하는 방법을 보여주는 'native-audio'라는 샘플 애플리케이션이 포함되어 있습니다. – Michael

+0

나는 그것을 알고, 나는이 샘플을 사용하려했지만 재생은 작동하지 않는다. 오직 mp3만으로 재생산되었다. – Oxenarf

+0

다음은 Android에서의 낮은 대기 시간 스트리밍에 대한 궁극적 인 기사입니다. http://createdigitalmusic.com/2013/05/why-mobile-low-latency-is-hard-explained-by-google-galaxy-nexus-still-android -of-choice/ –

답변

3

JNI 호출에 익숙하다는 의미 인 Android-NDK와 함께 제공되는 원시 오디오 샘플 코드를 사용해 보았습니다. 여기에 Victor Lazzarini의 멋진 블로그가 있는데, OpenSL ES를 사용하는 음성 통신을위한 오디오 스트리밍에 대한 그의 접근 방식을 설명합니다.

Android audio streaming with OpenSL ES and the NDK.

당신은 지시에 따라 장치에서 실행 here. 에서 소스 코드를 다운로드 할 수 있습니다.