【问题标题】:Send bytes via tcp/ip with android phone faster使用 android 手机通过 tcp/ip 更快地发送字节
【发布时间】:2015-07-05 05:21:00
【问题描述】:

我在 Nexus 6 上使用适用于 Android 的 camera2 api 拍照。从我的代码到达 onImageAvailable() 的末尾到再次调用它几乎不需要任何时间。

但是,通过 tcp/ip 发送我的图片大约需要 700 毫秒。

private ImageReader.OnImageAvailableListener mOnImageAvailableListener = 
new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) 
    {
        Image image = mImageReader.acquireLatestImage();
        if(image.getPlanes().length == 0)
            return;

        ByteBuffer buffer = image.getPlanes()[0].getBuffer();
        if(buffer == null)
            return;

        byte[] pictureBytes = new byte[buffer.remaining()];
        buffer.get(pictureBytes);

        mOutputStream.write((String.valueOf(pictureBytes.length) + "....").getBytes());
        // FROM HERE
        mOutputStream.write(pictureBytes);
        // TO HERE TAKES ~700ms
        mOutputStream.flush();
}

我的连接是在另一个线程中创建的,正如 android 要求的那样,使用以下代码:

ServerSocket serverSocket = new ServerSocket(#);
Socket clientSocket = serverSocket.accept();
OutputStream outputStream = clientSocket.getOutputStream();

注意:主线程中的mOutputStream等于outputStream。我将 outputStream 传递给主线程。

我尝试过使用 BufferedOutputStream,但实际上速度较慢。

我的手机和它所连接的设备之间的链接速度是 130Mbps。对于小于 2MB 的图片,我应该能够每秒发送至少 8 张图片。

如何减少 700 毫秒的时间?谢谢!

【问题讨论】:

  • 压缩图片会有帮助
  • “图像小于 2MB”——这是一张相当低分辨率的照片。您确定吗?另外,当您检查您编写的服务器时,您对读入的字节做了什么?您的 700 毫秒可能会阻止服务器读取字节。

标签: java android tcp ip android-camera


【解决方案1】:

如果您使用 TCP,即使您与其他设备的连接速度为 130mbps,您也无法立即使用所有带宽。这是因为 TCP 拥塞控制机制称为 slow-start

在每个连接开始时,TCP 以发送少量数据开始,因为链路的容量是未知的。在收到 ACK 之前发送的流量由 拥塞窗口 定义,并且根据配置的 MSS(最大分段大小),它可能是 MSS 的 2-4 倍。确切的数量在 RFC5681 中定义:

   If SMSS > 2190 bytes:
       IW = 2 * SMSS bytes and MUST NOT be more than 2 segments
   If (SMSS > 1095 bytes) and (SMSS <= 2190 bytes):
       IW = 3 * SMSS bytes and MUST NOT be more than 3 segments
   If SMSS <= 1095 bytes:
       IW = 4 * SMSS bytes and MUST NOT be more than 4 segments

在收到每个 ACK​​ 后,拥塞窗口的大小会增加 MSS 的大小。这实际上意味着窗口大小呈指数增长。尽管指数增长使 TCP 能够非常快地达到最大带宽,但对于相对较小的文件,这种速度还不够快。即使您的连接速度为 100mbps,您也无法每秒发送 8 张图片,因为传输时间相对较短,并且在相当长的传输时间内窗口大小太小,无法让您使用可用的全部带宽.

根据往返时间(到服务器和返回),发送前 1MB 数据甚至可能需要 500 毫秒,因此您每秒发送超过 2 或 3 张图像的可能性很小.

【讨论】:

    【解决方案2】:

    我从 Java 切换到 C# 以读取字节。那是主要的瓶颈。我高达 3.33 fps;这包括写入磁盘的时间。

    但是是的,我确认图片小于 2MB。

    谢谢大家!

    【讨论】:

    • 如果阅读是瓶颈,那是你的阅读代码,而不是平台。
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多