我开发了允许通过网络广播视频流的 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();
但这对我来说听起来很脏……有更时尚的解决方案吗?