поток файла MediaRecorder во время записи

Я пытаюсь получить видеопоток из точки A (2.1 Android phone) в точку B (мой сервер) в режиме реального времени. Как мне это сделать? подробно ниже приведены мои попытки (немного длинные, но краткие!)


цель состоит в том, чтобы получить часовое видео, записанное с телефона на сервер без паузы/остановки потока. задержка до нескольких минут не проблема. Я пробовал три подхода

  1. поток FileInputStream, который считывает из этот Файл видео пунктом
  2. вызов MediaRecoder.setOutputFile on FD сокета "отправителя". этот розетка подключается к LocalSocketServer, чьи назначения является сокетом "приемника".
  3. откройте сокет для моего сервера и предоставление setOutputFile его FD

к сожалению, обе попытки провалились.

  1. регистрирует только 24 байта, когда я позвоните FileInputStream.доступный(), и только фактическое количество байтов после того, как я запись звонков.stop ()
  2. дает мне это красиво бесполезно трассировка стека

    ошибка / AndroidRuntime (18532): вызвано: java.ленг.RuntimeException: ошибка запуска. Ошибка / AndroidRuntime (18532): на android.сми.MediaRecorder.start (собственный метод) Ошибка / AndroidRuntime (18532): at com.образец.demovideo.DemoVideo.initializeCamera(...) ...

  3. Ошибка 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
  1. правильно сохраняет неповрежденное видео к sd
  2. работает, если я использую setOutputFile(pathToFile) вместо этого. сокеты также работают при запуске sender.getOutputStream().write(message.getBytes());

1 ответов


  1. Я создал мобильное приложение для потоковой передачи видео на сервер с этим подходом, и это сработало. Так что это должен быть правильный подход. Позже, когда я больше не был частью проекта, я получил сообщения о том, что этот подход не работал с некоторыми новыми телефонами - особенно Samsung Galaxy S. проблема заключалась в том, что эти телефоны сбрасывали видеоданные экономно, возможно, один раз в минуту. Какой телефон вы используете, чтобы проверить это?

  2. & 3. MediaRecorder оберткой родная библиотека. Я предполагаю, что эта библиотека хочет, чтобы конкретный файл записывался не в трубу. На уровне файловой системы файлы и каналы выглядят одинаково, но нельзя иметь случайный доступ к трубе (поиск).