繁体   English   中英

通过套接字从Android发送缓冲的数据

[英]Sending buffered data through a socket from Android

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

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

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

所以我的问题是:如何通过套接字发送仍在写入的文件? 由于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();

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

在这些情况下,如果只是填充一个字节数组(我的缓冲区)直到我碰到了要传输的数据的末尾或缓冲区已满,我该怎么办。 在这种情况下,缓冲区准备好传递给我的Socket传输逻辑。 诚然,我不会对视频或音频执行此操作,尽管…仅针对“常规”数据。

值得注意的是,这将为数据的接收者提供“简陋”的用户体验(它看起来像网络短时停止然后再次正常运行……缓冲区用于填充的时间)。 因此,如果您必须在视频或音频上使用缓冲方法,请注意决定使用哪种缓冲大小。

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

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

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

无论如何,您可能想要查看FileReader ,因为对该文件的读取应被阻止。

希望这可以帮助,

菲尔·莱洛

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM