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

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

person Community    schedule 09.01.2011    source источник
comment
Я пытаюсь реализовать ту же функцию. Но я не понимаю вашего метода. Вы устанавливаете recorder.setOutputFile два раза: один раз для файла, другой для сокета. Я думаю, что рекордер будет работать с новым идентификатором файла при каждом изменении, а не с несколькими идентификаторами файлов.   -  person user1914692    schedule 29.05.2013
comment
1) и 2) два отдельных примера   -  person    schedule 29.05.2013
comment
Если они отдельные, то как реализовать две задачи одновременно? На самом деле, если вы выполняете две задачи по отдельности, это должно быть проблемой. Для потоковой передачи см. Spydroid-ipcamera в code.google.   -  person user1914692    schedule 30.05.2013
comment
@ebaum Можете ли вы сообщить какие-либо новости о задаче? У меня такая же проблема. Может в 19 году у нас есть какой-то более свежий подход? Этот подход по-прежнему лучший или, может быть, вы можете предложить что-то еще?   -  person Ponomarenko Oleh    schedule 07.08.2019


Ответы (1)


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

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

person Peter Knego    schedule 09.01.2011
comment
Я использую... galaxy S. Я не ожидал этого, спасибо за улов! Если бы я установил сокет приемника для вывода в файл, сработали бы 2 или 3? - person ; 09.01.2011
comment
Здравствуйте, тоже самое пытаюсь сделать... Вы случайно не пробовали на телефоне Huawei IDEOS или HTC G1? Если нет, могу ли я получить доступ к APK и протестировать его? Спасибо. - person Rob; 03.05.2011
comment
На G1 тогда работало (около 1,5 лет назад), на другом телефоне не знаю. АПК находится на www.livecliq.net. Я не знаю о текущем состоянии проекта. - person Peter Knego; 03.05.2011
comment
У меня было что-то похожее, работало. Мы создали ParcelFileDescriptor, обернутый вокруг файлового дескриптора сокетов; используя метод ParcelFileDescriptor.fromSocket(socket). К сожалению; это больше невозможно на леденец. stackoverflow.com/questions/26990816/. Я искал альтернативные схемы передачи информации с помощью FileStreams, но столкнулся с множеством трудностей. Есть ли у кого-нибудь решение/пример для подключения MediaRecorder к java.net.Socket? - person user1743524; 23.12.2014
comment
@user1743524 user1743524 вы нашли решение этой проблемы? - person Roman Samoilenko; 12.09.2017