目标是在两台设备之间组织语音通话。问题在于重拾部分,我得到很高的噪音,所以不可能理解这个演讲。这是我的代码:
发送部分:
public void startRecording() {
// private static final int RECORDER_SAMPLERATE = 44100;
// private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
// private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
// bufferSize = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);
int i = recorder.getState();
if (i == 1)
recorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
byte data[] = new byte[bufferSize];
bluetoothCall.sendMessage(data);
}
}, "AudioRecorder Thread");
recordingThread.start();
}
接收部分(可能问题在于此部分):
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_WRITE:
// ...
case MESSAGE_READ:
try{
// private int sampleRate = 44100 ;
// int bufferSize = AudioRecord.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
byte[] readBuf = (byte[]) msg.obj;
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.PERFORMANCE_MODE_LOW_LATENCY);
mAudioTrack.play();
mAudioTrack.write(readBuf, 0, readBuf.length);
mAudioTrack.release();
}
catch (Exception e){
}
break;
}
}
};
答案 0 :(得分:2)
VoIP质量通常受以下几个因素的影响:
VoIP实施中的大多数问题通常都是关于延迟和抖动的问题,但根据您对噪声的描述,听起来更像是丢失数据或以某种方式损坏数据。
无论哪种方式,除非你是为了学习或学术目的而这样做,否则使用可以解决这些问题的VoIP库可能会更容易 - 信令和语音通信都有很多复杂性。 VoIp电话。
Android现在有一个内置的SIP库:
这确实需要某种SIP服务器,即使你将它构建到你的客户端,也可能不是你想要的。
您还可以围绕RTP(语音数据传输部分)构建自己的解决方案,但这需要更多的工作来发现IP地址等:
您可以经常使用没有服务器的SIP客户端,但您需要计算出IP地址,更巧妙的是端口(https://stackoverflow.com/a/44449337/334402)。
如果您确实想使用SIP,则可以使用opeusource SIP服务器 - 例如: