Я пытаюсь передать видеопоток из точки А (телефон Android 2.1) в точку Б (мой сервер) в режиме реального времени. Как бы я это сделал? Ниже подробно описаны мои попытки (немного длинные, но краткие!)
Цель состоит в том, чтобы передать часовое видео, записанное с помощью телефона, на сервер без приостановки/остановки потока. задержка до нескольких минут не является проблемой. Я пробовал три подхода
- поток FileInputStream, который читает из FileDescriptor целевого видео
- вызовите MediaRecoder.setOutputFile в FD сокета-отправителя. этот сокет соединяется с LocalSocketServer, назначением которого является сокет-приемник.
- открыть сокет на моем сервере и дать setOutputFile его FD
к сожалению, обе попытки не увенчались успехом.
- Регистрирует только 24 байта всякий раз, когда я вызываю FileInputStream.available(), и фактическое количество байтов только после того, как я вызываю Recorder.stop()
дает мне эту красиво бесполезную трассировку стека
ОШИБКА/AndroidRuntime (18532): причина: java.lang.RuntimeException: сбой запуска. ОШИБКА/AndroidRuntime(18532): в android.media.MediaRecorder.start(собственный метод) ОШИБКА/AndroidRuntime(18532): в com.example.demovideo.DemoVideo.initializeCamera(...) ...
та же ошибка 2
фрагменты кода (части опущены)
1)
fileOut = new FileOutputStream(pathToFile);
...
recorder.setOutputFile(fileOut.getFD());
recorder.prepare()
recorder.start()
// in an Async Thread
fileIn = FileInputStream(fileOut.getFD);
while (recording) {
fos.flush();
Log.w("---", "bytesAvailable: " + fileIn.available()); //always returns 24
Thread.sleep(1000);
}
2)
// in a Thread
server = new LocalServerSocket(SOCKET_ADDRESS);
while (true){
receiver = server.accept();
if (receiver != null){
InputStream input = receiver.getInputStream();
... // processing would go here
} }
sender = new LocalSocket();
sender.connect(new LocalSocketAddress(SOCKET_ADDRESS));
recorder.setOutputFile(sender.getFileDescriptor());
...
recorder.prepare();
recorder.start(); // <- error
- правильно сохраняет неповрежденное видео на sd
- работает, если вместо этого я использую setOutputFile(pathToFile). сокеты также работают, когда я запускаю
sender.getOutputStream().write(message.getBytes());