【问题标题】:Simpe UDP optimisationSimpe UDP 优化
【发布时间】:2014-07-24 18:20:55
【问题描述】:

我正在制作一个音乐流媒体应用程序,我需要在其中通过 UDP 传输数据。 目前,我每 10 毫秒发送一次大小为 1.4 KB 的数据包。但这似乎很慢。现在我读到由于 MTU 问题,建议数据包大小为 1400。还应进行数据包调步以减少数据包丢失。 我测试了3g以上,质量损失并没有那么大。也许我可以增加我的数据包大小,或者减少节奏? 有人可以提出最佳策略吗? 另外,我将不胜感激有关 UDP 流的任何其他建议。 谢谢

发件人:

while(audio_stream.read(buf, 0, BUF_SIZE) != -1) {

                final DatagramPacket pack = new DatagramPacket(buf, BUF_SIZE,
                        InetAddress.getByName(connection.getRecIp().substring(1)),
                        Integer.parseInt(connection.getRecPort()));
                datagramSocket.send(pack);
                bytes_count += BUF_SIZE;
                Log.d("Ayush", "bytes_count : " + bytes_count);
                Thread.sleep(70L, 0);
            }

接收者:

while(receivedBytes < length) {

                final DatagramPacket pack = new DatagramPacket(new byte[BUF_SIZE], BUF_SIZE);
                try {
                    datagramSocket.receive(pack);
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
                if(pack.getLength() < BUF_SIZE/2) continue;
                mappedByteBuffer.put(pack.getData());
                receivedBytes += pack.getLength();
//Some more code for other stuff
}

【问题讨论】:

    标签: java android sockets udp audio-streaming


    【解决方案1】:

    目前我每 10 毫秒发送一次大小为 1.4 KB 的数据包。

    您是在发送音频还是视频。如果使用 320 Kbit/s MPEG,则需要 40 KB/秒或每 10 毫秒 400 字节。 128 Kbut/sec 需要每 10 毫秒 160 字节。

    但这似乎很慢。

    为什么?

    现在我了解到,由于 MTU 问题,建议数据包大小为 1400。

    MTU 接近 1500,这适用于 TCP 而不是 UDP。

    也许我可以增加我的数据包大小,或者减少节奏?

    包越大,丢失时丢失的越多。我会尝试 0.5 KB 数据包,因为这些数据包过去对我来说是一个不错的大小。

    【讨论】:

    • 我正在播放 mp3 音乐。流媒体非常缓慢。我试试 0.5KB。对不起,我的节奏实际上是 70 毫秒。我也会尝试减少这个。
    • 好的,所以如果您以 128 Kbit 或 16 kByte 的速率传输 512 个字节,则需要每秒发送 32 个字节,或每 31 毫秒发送一次。
    • 嗨,我可以再提一个建议。由于我没有正确测试的方法,您能否就更多事情发表您的意见:我正在经历大约 7% 的数据包丢失。我在想,如果我创建 x 个套接字并将文件分部分流式传输,即每个套接字上文件的流长度/x 部分,是否有助于减少数据包丢失? P.S 使用较小的数据包并将 pacing 减少到 10 确实提高了流质量,我认为数据包大小比 pacing 更重要
    • @Dexter 数据包丢失可能因一系列因素而异,包括服务器和设备本身之间的网络。你可能会发现你需要根据客户来调整你所做的事情。即,您应该从设备获得有关未命中率的反馈。您可能必须将每个数据包发送两次,例如相隔半秒,以确保您几乎每个数据包都至少收到一次。
    • 好的,我明白了,没有灵丹妙药。我将深入研究 QUIC,并可能将 TCP 作为高噪声网络的后备方案。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2015-04-13
    • 2013-09-11
    • 2023-03-09
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多