【问题标题】:Sending buffered data through a socket from Android从 Android 通过套接字发送缓冲数据
【发布时间】:2011-08-01 04:24:13
【问题描述】:

我开发了允许通过网络广播视频流的 Android 应用程序的第一部分。目前,我正在以非常直接的方式发送视频,如下所示:

Socket socket = new Socket(InetAddress.getByName(hostname), port);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
recorder.setOutputFile(pfd.getFileDescriptor());

但不幸的是,它不是很流畅。我想在通过套接字发送数据流之前对其进行缓冲。我尝试的一种方法是使用Android API for recording media 将流写入文件中,并使用另一个线程将文件流式传输到计算机上的服务器。

所以我的问题是:如何通过套接字发送仍在写入的文件? 由于BufferedInputStream没有阅读的阻塞方法,所以我尝试做这样的事情,但没有任何成功

while (inputStream.available() >= BUFFER_SIZE) {
  inputStream.read(buffer);
  outputStream.write(buffer);
}
outputStream.flush();

但是当我这样做时,如果网络比数据流快,我很快就会脱离循环。

有没有“好”的方法来做到这一点?我想进行主动等待,但这不是一个好的解决方案,尤其是对于手机。另一种方法是做这样的事情:

while (true) {
  while (inputStream.available() < BUFFER_SIZE) {
    wait(TIME); 
  }
  inputStream.read(buffer);
  outputStream.write(buffer);
}
outputStream.flush();

但这对我来说听起来很脏……有更时尚的解决方案吗?

【问题讨论】:

    标签: java android sockets binary buffered


    【解决方案1】:

    如果只是填充一个字节数组(我的缓冲区),直到我到达即将传输的数据的末尾,或者缓冲区已满,我在这些情况下会做什么。在这种情况下,缓冲区已准备好传递给我的 Socket 传输逻辑。诚然,我不会在视频或音频上这样做……只是在“常规”数据上。

    值得注意的是,这会给该数据的接收者带来“混乱”的用户体验(看起来网络可能会在短时间内停止,然后再次正常运行......缓冲区用于填满的时间)。因此,如果您必须对视频或音频使用缓冲方法,请注意您决定使用的缓冲区大小。

    对于像视频这样的东西,我的经验是使用基于流的逻辑而不是缓冲的,但您显然有一些不同且有趣的要求。

    【讨论】:

    • 您好,感谢您的回答!不幸的是,在这种情况下,由于数据量大,缓冲解决方案无法工作......而且带有非常小数据包的流式传输 - 并且数量众多 - 会导致我使用的网状网络中的数据丢失。
    • 我承认当您要求缓冲解决方案时我很好奇,但我同意视频缓冲会导致不好的答案。有趣的是,流媒体似乎对你也不起作用——至少在这种情况下是这样。这一直是流技术的权衡之一是几个数据包休息一下。大多数情况下,这对用户来说是无法察觉的,但我可以看到网络如何使该声明无效。
    【解决方案2】:

    我想不出一种很好的方法,但一种选择可能是创建一个本地套接字对,使用该对的“客户端”端作为 MediaRecorder 输出 fd,并在本地服务器之间缓冲套接字和远程服务器。这样,您可以在本地服务器上阻塞,直到有数据为止。

    另一种可能性是使用基于文件的管道/fifo(因此磁盘不会填满),但我不记得 Java 层是否公开了 mkfifo 功能。

    无论如何,您可能想查看FileReader,因为读取它应该会阻塞。

    希望这会有所帮助,

    菲尔·莱洛

    【讨论】:

    • 好的,菲尔,感谢您的解决方案!我实现了它,它似乎工作得很好:)
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2016-02-17
    • 2017-08-26
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多