transmitir un archivo MediaRecorder durante la grabación

Estoy tratando de obtener una transmisión de video desde el punto A (teléfono Android 2.1) hasta el punto B (mi servidor) en tiempo real. ¿Cómo lo haría? A continuación se detallan mis intentos (¡un poco largos, pero concisos!)


El objetivo es grabar un video de una hora de duración con el teléfono en el servidor sin pausar / detener la transmisión. un retraso de hasta varios minutos no es un problema. He probado tres enfoques

  1. enhebrar un FileInputStream que lee del FileDescriptor del destino del video
  2. llame a MediaRecoder.setOutputFile en el FD de un conector 'remitente'. este zócalo se conecta a un LocalSocketServer, cuyo destino es un zócalo 'receptor'.
  3. abrir un socket a mi servidor y dar setOutputFile su FD

lamentablemente ambos intentos han fracasado.

  1. Solo registra 24 bytes cada vez que llamo a FileInputStream.available (), y el número real de bytes solo después de llamar a Recorder.stop ()
  2. me da este seguimiento de pila maravillosamente inútil

    ERROR / AndroidRuntime (18532): Causado por: java.lang.RuntimeException: error de inicio. ERROR / AndroidRuntime (18532): en android.media.MediaRecorder.start (método nativo) ERROR / AndroidRuntime (18532): en com.example.demovideo.DemoVideo.initializeCamera (...) ...

  3. mismo error 2

fragmentos de código (partes omitidas)

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. guarda correctamente un video no dañado en sd
  2. funciona si uso setOutputFile (pathToFile) en su lugar. los enchufes también funcionan cuando corro sender.getOutputStream().write(message.getBytes());

preguntado el 09 de enero de 11 a las 09:01

Estoy tratando de implementar la misma función. Pero no entiendo tu método. Configura recorder.setOutputFile dos veces: una vez en un archivo, la otra en un socket. Creo que la grabadora funcionará con el nuevo ID de archivo cada vez que lo cambie, en lugar de con varios ID de archivo. -

1) y 2) son dos ejemplos separados:

Si están separados, ¿cómo se implementan las dos tareas al mismo tiempo? En realidad, si realiza las dos tareas por separado, debería ser un problema de dificultad. Para la tarea de transmisión, consulte Spydroid-ipcamera en code.google -

@ebaum ¿Puede darnos alguna actualización sobre la tarea? Tengo el mismo problema. ¿Quizás en el '19 tengamos un enfoque más fresco? ¿Sigue siendo el mejor enfoque o tal vez pueda sugerir algo más? -

1 Respuestas

  1. Creé una aplicación de transmisión de video de móvil a servidor con este enfoque y funcionó. Entonces este debería ser el enfoque correcto. Más tarde, cuando ya no formaba parte del proyecto, recibí informes de que este enfoque no funcionaba con algunos teléfonos más nuevos, sobre todo Samsung Galaxy S. El problema era que estos teléfonos eliminaban los datos de video con moderación, tal vez solo una vez por minuto. ¿Qué teléfono estás usando para probar esto?

  2. & 3. MediaRecorder es un envoltorio de una biblioteca nativa. Supongo que esta biblioteca quiere un archivo concreto para escribir, no una tubería. A nivel de sistema de archivos, los archivos y las tuberías tienen el mismo aspecto, pero no se puede tener acceso aleatorio a una tubería (búsqueda).

Respondido el 09 de enero de 11 a las 13:01

Estoy usando el ... galaxy S. No lo vi venir, ¡gracias por la captura! Si tuviera que configurar el conector del receptor para que salga a un archivo, ¿funcionarían 2 o 3? - usuario426957

Hola, también estoy tratando de hacer lo mismo ... ¿Por casualidad probaste un teléfono Huawei IDEOS o HTC G1? Si no, ¿puedo acceder al APK y probarlo? Gracias. - Robar

Funcionó en G1 en ese momento (hace aproximadamente 1.5 años), no sé sobre el otro teléfono. El apk está en www.livecliq.net. No sé sobre el estado actual del proyecto. - Peter Knego

Tenía algo similar que funcionó. Creamos un ParcelFileDescriptor que se envuelve alrededor de un descriptor de archivo de sockets; utilizando un método ParcelFileDescriptor.fromSocket (socket). Desafortunadamente; esto ya no es posible en piruletas. stackoverflow.com/questions/26990816/…. He estado buscando esquemas alternativos para transferir información con FileStreams pero me he encontrado con muchas dificultades. ¿Alguien tiene alguna solución / ejemplo para conectar un MediaRecorder a java.net.Socket? - user1743524

@ user1743524 ¿ha encontrado una solución para esto? - Samoilenko romano

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.