потоковая передача файла MediaRecorder во время записи - PullRequest
7 голосов
/ 09 января 2011

Я пытаюсь в реальном времени получить видеопоток из точки А (телефон с ОС Android 2.1) в точку Б (мой сервер).Как бы я это сделал? Ниже подробно описаны мои попытки (немного длинные, но краткие!)


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

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

, к сожалению, обе попытки потерпели неудачу.

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

    ОШИБКА / AndroidRuntime (18532): Причина: java.lang.RuntimeException: запуск не удался.ОШИБКА / AndroidRuntime (18532): на android.media.MediaRecorder.start (собственный метод) ОШИБКА / AndroidRuntime (18532): на com.example.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 Ответ

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

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

...