求助贴:关于Android实时语音传送到电脑中播延迟太大的解决方法。

狂暴de吉仔 2015-05-14 11:44:26
RT,关于Android实时语音传送到电脑中播延迟太大的解决方法。

我还是在校的大学生,太深层的东西还没学到,只好请教大神。

就是我们团队在做这个Android实时语音的时候,开启语音线程,使用流传送Android录音的音频到电脑播放,电脑接收并播放的时候能够很明显的感觉到有0.5S——1S的延迟,就是并不能让人感觉这是实时播放的。

贴上部分代码:
这个是Android设置录音缓存大小的,不知道有没有用,因为是借鉴网上的代码,不是很懂其中的问题
	RecordPlayThread() {
recBufSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
playBufSize = AudioTrack.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
Log.e("test", "bufsize: "+recBufSize);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, audioEncoding, recBufSize);
}


这是Android录音和传送线程:
	public void run() {
socket = new Socket();
try {
socket.connect(localInetSocketAddress, 3000);
// TODO TIMEOUT是否影响发送延迟?
byte[] buffer = new byte[recBufSize];
//byte[] buffer = new byte[32];
DataOutputStream localOutputStream = new DataOutputStream(
socket.getOutputStream());
audioRecord.startRecording();// 开始录制
int bufReadLen = audioRecord.read(buffer, 0, buffer.length);
while (recording) {
audioRecord.read(buffer, 0, buffer.length);
localOutputStream.write(buffer, 0, bufReadLen);
// TODO 或者是发送缓存的影响?
}
audioTrack.stop();
audioRecord.stop();
} catch (Throwable t) {
}
}


这是PC端接收播放类
	class LoopDataThread extends Thread {
private Socket s;//接收线程传过来的socket
private InputStream is;//socket里面的input流
private AudioFormat format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, 44100.0f, 16, 1, 2, 44100.0f,
false);
private SourceDataLine line;
private byte[] data;

public LoopDataThread() {
try {
MouseUI.message.append("接收语音 ...\n");
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
format);
line = (SourceDataLine) AudioSystem.getLine(info);
} catch (Exception e) {
e.printStackTrace();
}
}

public void run() {
synchronized (WavPlayer.this.sockets) {
WavPlayer.this.sockets.add(this.s);
}
try {
line.open(format);
line.start();
data = new byte[32];
int i=1;
while (true) {

if (isAct) {
line.open(format);
MouseUI.message.append(i+" open ...\n");
} else {
line.close();
MouseUI.message.append(i+" close...\n");
}
is.read(data);
line.write(data, 0, data.length);
MouseUI.message.append(i+" play ...\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


现在主要考虑问题不知道是不是发送的缓存太大,导致录音好录一段时间才会启动发送
但是尝试过吧buffsize设置大小为32后,整个录音与播放过程的延迟并没有太大变化。

希望各位大牛不吝赐教,谢谢啦
...全文
122 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
儿大不由爷 2015-05-14
  • 打赏
  • 举报
回复
这个延迟是正常的,数据捕获,组包(编码),发送,接收,解包(解码),播放都是需要时间的

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧