Я пытаюсь в реальном времени получить видеопоток из точки А (телефон с ОС 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());