Java Android慢速套接字读取

Java Android慢速套接字读取,java,android,performance,sockets,Java,Android,Performance,Sockets,我正在尝试创建一个应用程序,它从麦克风录制音频,并通过一个插座将其发送到另一部手机上的服务器。为了模拟另一部手机,我目前正在本地主机上使用ServerSocket。现在我知道了,如果没有一些疯狂的压缩,我可能无法在服务器上获得44100Hz、立体声、PCM_16位音频,但我的插座的传输速度低得离谱。我得到大约16kB/s。在本地主机上 这是我的客户端(作为两个线程在服务中运行): LinkedBlockingQueue音频队列=新建LinkedBlockingQueue(100); 布尔型isR

我正在尝试创建一个应用程序,它从麦克风录制音频,并通过一个插座将其发送到另一部手机上的服务器。为了模拟另一部手机,我目前正在本地主机上使用ServerSocket。现在我知道了,如果没有一些疯狂的压缩,我可能无法在服务器上获得44100Hz、立体声、PCM_16位音频,但我的插座的传输速度低得离谱。我得到大约16kB/s。在本地主机上

这是我的客户端(作为两个线程在服务中运行):

LinkedBlockingQueue音频队列=新建LinkedBlockingQueue(100);
布尔型isRecording;
内部抽样率=44100;
int buff\u size=AudioRecord.getMinBufferSize(采样率、音频格式、立体声中的通道、音频格式、编码、PCM、16位);
void recorderThread_func()引发InterruptedException,IOException{
int s_read;
字节[]tmp_buff;
byte[]buffer=新字节[buff_size];
录音机=新录音机(
MediaRecorder.AudioSource.MIC,
抽样率,
AudioFormat.CHANNEL_立体声中的_,
AudioFormat.ENCODING_PCM_16位,
buff_大小);
记录器。开始记录();
isRecording=true;
while(isRecording){
tmp_buff=新字节[buff_size];
s_read=记录器读取(缓冲区,0,缓冲区大小);
System.arraycopy(缓冲区,0,tmp_buff,0,s_读取);
audioQueue.put(tmp_buff);
}
isRecording=false;
录音机。停止();
}
void socketThread_func()引发IOException、InterruptedException{
字节[]tmp_缓冲区;
睡眠(250);
插座audioSocket=新插座(“127.0.0.1”,2004年);
OutputStream out=audioSocket.getOutputStream();
InputStream in=audioSocket.getInputStream();
out.flush();
tmp_buffer=新字节[]{
(字节)0xde,
(字节)((buff_大小>>24)和0xff),
(字节)((buff_大小>>16)和0xff),
(字节)((buff_大小>>8)和0xff),
(字节)((buff_大小)和0xff)};
写入(tmp_缓冲区,0,5);
out.flush();
长a;
长b;
长c=1;
长d=1;
while(isRecording){
tmp_buffer=audioQueue.take();
a=系统.currentTimeMillis();
写入(tmp_缓冲区,0,缓冲大小);
out.flush();
b=系统.currentTimeMillis();
c+=b-a;
d++;
System.out.println(“速度=”+((1000*buff_size*(d++)/c));
读取(tmp_缓冲区,0,1);
如果(tmp_缓冲区[0]!=(字节)“A”)
打破
}
isRecording=false;
out.flush();
audioSocket.close();
}
这是我的服务器代码(在两个单独的线程中运行):

int buff\u size=0;
布尔显示;
LinkedBlockingQueue audioQueue=新LinkedBlockingQueue(100);
void socketThread_func()引发IOException、InterruptedException{
字节[]消息=新字节[5];
字节[]tmp_缓冲区;
int s_read;
ServerSocket audioSocket=新的ServerSocket();
audioSocket.setReceiveBufferSize(1024*1024*16);
audioSocket.bind(新的InetSocketAddress(“127.0.0.1”),2004年);
Socket connSocket=audioSocket.accept();
OutputStream out=connSocket.getOutputStream();
InputStream in=connSocket.getInputStream();
out.flush();
读入(味精,0,5);
如果(消息[0]!=((字节)0xde)){
返回;
}

buff_size=((int)msg[4]&0xff)+((int)msg[3]&0xff)这不是写入复制循环的方法。您正在为每次读取分配两个字节数组。请记住:

byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

这不是编写复制循环的方法。每次读取都要分配两个字节数组。记住以下内容:

byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

先录制,然后发送。不要同时录制和发送。还有,你使用的是什么连接?Wifi?这里可能会出现很多问题。我还没有使用任何连接。这都是在本地主机上。这就是为什么我对速度感到惊讶。我会尝试你的建议并报告。那么它是16kB/的常数?没有变化?如果这是case问题不是您的代码,而是本地主机配置/设置/限制问题。通过网络进行测试,看看是否有差异。buff_size的值是多少?@Namphibian我已经重写了服务,因此现在我有两个线程:记录器线程和套接字处理线程,它们通过b的LinkedBlockingQueue进行通信但没有改变。我提到的16kB/s只是一个近似值,实际上速度略有不同,但仍然很低。重写服务后,速度约为30kB/s-仍然太低,无法发挥任何作用。先录制,然后发送。不要同时录制和发送。还有,你使用的是什么连接?Wifi?有很多东西需要使用这里可能会出错。我还没有使用任何连接。这都是在本地主机上。这就是为什么我对速度感到惊讶。我会尝试你的建议并报告。所以它是16kB/s常量?没有变化?如果是这种情况,问题不是你的代码,而是本地主机配置/设置/限制问题。通过网络进行测试,看看是否有差异。什么你得到的是
buff_size
的t值吗?@Namphibian我重写了服务,所以现在我有两个线程:记录器线程和套接字处理线程,它们通过字节数组的LinkedBlockingQueue进行通信,但没有改变。我提到的16kB/s是一个近似值,实际上速度略有不同,但仍然很低。a重写服务后,它的速度约为30kB/s-仍然太低,没有任何用处。感谢您的建议,但它并没有解决我的问题,事实上是我的代码的早期版本,我现在意识到我应该在编辑它时保留在我的帖子中。感谢您的建议,但它并没有解决我的问题,事实上它是我的早期版本我的代码,我现在意识到我应该在编辑它时保留在我的帖子中。
byte[] buffer = new byte[8192];
int count;
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}