Я разрабатываю первую часть приложения для 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();
Но это звучит довольно грязно для меня ... Есть ли более изящное решение?