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

标签 java android sockets binary buffered

我开发了一个允许通过网络广播视频流的 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();

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

最佳答案

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

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

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

关于java - 从 Android 通过套接字发送缓冲数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589852/

相关文章:

java - Map 类的 onCreate() 和 onMapReady() 函数从未运行

Android Studio错误: “Environment variable does not point to a valid JVM installation”

php - Android(Corona sdk)触发的MYSQL PHP对行/列造成麻烦

c - 绑定(bind)到设备的原始套接字未接收所有数据包

python - 运行 Ubuntu 时 Python 代码中的回溯错误

java - ClassObject.getClass、ClassName.class 和 Class.forName 之间的区别 ("ClassName")

java - 从其构造函数中保存的对象创建一个对象

java - 获取图像的拍摄日期

android - 在两列上创建 UNIQUE 约束(仅当两者都存在于数据库中时)。如果其中一列不同,我不想限制它

python - 如何在套接字之间正确中继 TCP 流量?