ats*_*dis 5 media android voip rtp
我正在为Android构建VOIP应用程序,并使用内置的RTP工具android.net.rtp。除以下问题外,一切工作正常:
请记住,对于AudioStream,我正在使用PCMU编解码器,而远程方也是如此。
以下是一些关键代码:
初始化音频设施(一次):
public class SoundManager implements AudioManager.OnAudioFocusChangeListener {
Context appContext;
AudioManager audio;
AudioStream audioStream;
AudioGroup audioGroup;
InetAddress localAddress;
private static final String TAG = "SoundManager";
public SoundManager(Context appContext, String ip){
this.appContext = appContext;
audio = (AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE);
try {
localAddress = InetAddress.getByName(ip);
audioGroup = new AudioGroup();
audioGroup.setMode(AudioGroup.MODE_ECHO_SUPPRESSION);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
初始化AudioSession(在每次通话开始之前一次)
public int setupAudioStream() {
Log.i(TAG, "Setting up Audio Stream");
try {
audioStream = new AudioStream(localAddress);
audioStream.setCodec(AudioCodec.PCMU);
audioStream.setMode(RtpStream.MODE_NORMAL);
}
catch (SocketException e) {
e.printStackTrace();
}
return audioStream.getLocalPort();
}
Run Code Online (Sandbox Code Playgroud)
开始流式传输(在每次通话开始时一次)
public void startStreaming(int remoteRtpPort, String remoteIp) {
audio.setMode(AudioManager.MODE_IN_COMMUNICATION);
// Request audio focus for playback
int result = audio.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
try {
audioStream.associate(
InetAddress.getByName(remoteIp),
remoteRtpPort);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
try {
audioStream.join(audioGroup);
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
else {
Log.e(TAG, "Cannot receive audio focus; media stream not setup");
}
}
Run Code Online (Sandbox Code Playgroud)
停止流式传输(在每次通话结束时一次)
public void stopStreaming() {
try {
audioStream.join(null);
} catch (IllegalStateException e) {
e.printStackTrace();
}
audioGroup.clear();
if (audioStream.isBusy()) {
Log.i(TAG, "AudioStream is busy");
}
audioStream = null;
audio.setMode(AudioManager.MODE_NORMAL);
// Abandon audio focus when playback complete
audio.abandonAudioFocus(this);
}
Run Code Online (Sandbox Code Playgroud)
最后,请注意,在Android控制台(logcat)中,我看到了以下内容:
D/AudioGroup? latency: output 400, input 64'
D/AudioGroup? stream[56] is configured as PCMU 8kHz 20ms mode 0
D/AudioGroup? stream[67] is configured as RAW 8kHz 32ms mode 0
Run Code Online (Sandbox Code Playgroud)
似乎其中一个流具有相当大的延迟,加上其中之一似乎配置为RAW。虽然不确定我是否正确解释了它们
有人目睹过类似的行为吗?
最好的问候,安东尼