поток файла MediaRecorder во время записи
Я пытаюсь получить видеопоток из точки A (2.1 Android phone) в точку B (мой сервер) в режиме реального времени. Как мне это сделать? подробно ниже приведены мои попытки (немного длинные, но краткие!)
цель состоит в том, чтобы получить часовое видео, записанное с телефона на сервер без паузы/остановки потока. задержка до нескольких минут не проблема. Я пробовал три подхода
- поток FileInputStream, который считывает из этот Файл видео пунктом
- вызов MediaRecoder.setOutputFile on FD сокета "отправителя". этот розетка подключается к LocalSocketServer, чьи назначения является сокетом "приемника".
- откройте сокет для моего сервера и предоставление setOutputFile его FD
к сожалению, обе попытки провалились.
- регистрирует только 24 байта, когда я позвоните FileInputStream.доступный(), и только фактическое количество байтов после того, как я запись звонков.stop ()
-
дает мне это красиво бесполезно трассировка стека
ошибка / AndroidRuntime (18532): вызвано: java.ленг.RuntimeException: ошибка запуска. Ошибка / AndroidRuntime (18532): на android.сми.MediaRecorder.start (собственный метод) Ошибка / AndroidRuntime (18532): at com.образец.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());
1 ответов
Я создал мобильное приложение для потоковой передачи видео на сервер с этим подходом, и это сработало. Так что это должен быть правильный подход. Позже, когда я больше не был частью проекта, я получил сообщения о том, что этот подход не работал с некоторыми новыми телефонами - особенно Samsung Galaxy S. проблема заключалась в том, что эти телефоны сбрасывали видеоданные экономно, возможно, один раз в минуту. Какой телефон вы используете, чтобы проверить это?
& 3. MediaRecorder оберткой родная библиотека. Я предполагаю, что эта библиотека хочет, чтобы конкретный файл записывался не в трубу. На уровне файловой системы файлы и каналы выглядят одинаково, но нельзя иметь случайный доступ к трубе (поиск).