¿Cómo grabar un video directamente en Helix Server desde mi dispositivo Android?

Soy nuevo al desarrollo del lado del servidor. Quiero trabajar en una aplicación y necesito grabar un video en Helix Server desde mi dispositivo Android a través de mi aplicación. He instalado el servidor Helix en una PC con Windows Server.

En la aplicación de Android, estoy intentando subir un video grabado en el servidor Helix. He implementado mi aplicación para grabar el video en la tarjeta SD, pero me gustaría grabar y guardar ese video en Helix Server directamente. He implementado mi aplicación de Android de la siguiente manera:

public class NewRecordingVideo extends Activity implements SurfaceHolder.Callback { private MediaRecorder recorder; boolean flag = false; boolean startedRecording = false; boolean stoppedRecording = false; SurfaceHolder mHolder; SurfaceView videoSView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.activity_main); recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); videoSView = ((SurfaceView)findViewById(R.id.surfaceView1)); mHolder=videoSView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ((Button)findViewById(R.id.startBtn)).setOnClickListener( new OnClickListener() { @Override public void onClick(View arg0) { if(startedRecording == false) { recorder.start(); startedRecording = true; Toast.makeText(NewRecordingVideo.this, "Your video is recording", Toast.LENGTH_LONG).show(); } else if (startedRecording == true && stoppedRecording == false) { recorder.stop(); recorder.release(); recorder = null; stoppedRecording = true; } } }); ((Button)findViewById(R.id.stopBtn)).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { recorder.stop(); recorder.release(); recorder = null; stoppedRecording = true; Toast.makeText(NewRecordingVideo.this, "Your video recorded ", Toast.LENGTH_LONG).show(); finish(); } }); } public Surface getSurface() { return mHolder.getSurface(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { try { Socket socket = new Socket("IP address", 8008); ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket); Log.v("find about connection","====>"+socket.isConnected()); recorder.setOutputFile("/sdcard/recording.3gp"); // Here I would like to record my video (recording.3gp) on helix server directly recorder.setPreviewDisplay(mHolder.getSurface()); recorder.prepare(); } catch (Exception e) { String message = e.getMessage(); recorder.release(); recorder = null; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (recorder != null) { recorder.release(); recorder = null; } } } 

Del código anterior: ¿Cómo puedo guardar mi archivo de grabación de vídeo directamente en el servidor Helix? ¿Debería realizar alguna implementación en el desarrollo del servidor?

La relación entre el tamaño de un vídeo y una capacidad de carga de red en un intervalo de tiempo dado es baja para cargar / grabar simultáneamente el flujo de vídeo, a menos que el usuario tenga una conexión celular LTE muy rápida.

Sin embargo, cuando la grabación se realiza, puede cargar el archivo a su servidor a través de un protocolo FTP. Se recomienda dar a cada archivo registrado un Universal Unique Identifier (UUID) para poder hacer la diferencia entre todos los otros archivos grabados. He utilizado este código (no probado para Android, pero funciona bien en JavaSE 7). Ya que es un proceso bastante largo (pero rápido), te hice un resumen. (Niza, ¿eh?)

Resumen

1) Genere un UUID con UUID.randomUUID().toString(); Que se utilizará durante todo el proceso para identificar el archivo grabado.
2) Grabe el archivo con el nombre "sdcard/" + uuid + ".3gp"
3) Cuando termine la grabación, cargue el archivo en su servidor mediante una carga FTP.
4) Pida a su servidor remoto que ejecute el script PHP que haga lo que tenga que hacer con el archivo grabado, como la manipulación de la base de datos, etc. (si existe tal script, si no necesita hacer esto, simplemente omita esto paso).
5) Pida a su servidor remoto que elimine el archivo, si es necesario. (Hecho a través de otro script PHP)

Código

 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.net.URLConnection; public class FTPUploader { static void doUpload(String uuid) { File fileSource = new File("/sdcard/" + uuid + ".3gp"); // Or new File("/sdcard/recording.3gp"); String fileName = fileSource.getName(); /** YOUR SERVER'S INFORMATIONS **/ String userName = "USERNAME"; String password = "PASSWORD"; String ftpServer = "FTP.SERVER.COM"; /****/ StringBuffer sb = new StringBuffer("ftp://"); sb.append(userName); sb.append(':'); sb.append(password); sb.append('@'); sb.append(ftpServer); sb.append("/"); /**WARNING: Path extension; it will be added after connection *The file must be at your server's root. Otherwise the PHP script won't detect it. **/ sb.append(fileName); sb.append(";type=i"); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { URL url = new URL(sb.toString()); URLConnection urlc = url.openConnection(); bos = new BufferedOutputStream(urlc.getOutputStream()); bis = new BufferedInputStream(new FileInputStream(fileSource)); int i; // read byte by byte until end of stream while ((i = bis.read()) != -1) { bos.write(i); } } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) try { bis.close(); } catch (IOException ioe) { ioe.printStackTrace(); System.out.println("IO exception after if bis " + ioe); } if (bos != null) try { bos.close(); } catch (IOException ioe) { ioe.printStackTrace(); System.out.println("IO exception after if " + ioe); } } } } import java.util.UUID; public class Main { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String uuid = UUID.randomUUID().toString(); //Assuming you set your file's name as uuid + ".3gp" FTPUploader.doUpload(uuid); //Launches a FTP Upload //Then, if you want to ask your server to "process" the file you gave him, you can perform a simple HTTP request: try { String url = "http://YOURSITE.COM/shell.php"; String charset = "iso-8859-1"; String param1 = uuid; String query = String.format("id=%s", URLEncoder.encode(param1, charset)); URLConnection connection = new URL(url + "?" + query).openConnection(); connection.setRequestProperty("Accept-Charset", charset); connection.getInputStream(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //This try {}catch{} requests a PHP script: this script is "triggered" just like if it was loaded in your web browser, with as parameter the file UUID (`shell.php?id=UUID`), so that he knows wich file on his server he has to process. } 

BONUS : Si quieres eliminar el archivo de tu servidor cuando hayas terminado, puedes ejecutar la misma línea que antes, pero reemplazar "shell.php" por otro script PHP al que puedes llamar "delete.php". Contendría las líneas siguientes:

 <?php $recordedFile = $_GET['id'] . ".3gp"; unlink($recordedFile); ?> 

Por ejemplo: Después de la solicitud http://www.YOURSERVER.com/delete.php?id=123456789 borra http://www.YOURSERVER.com/123456789.3gp en su servidor.

Otro código de ejemplo

Hace pocas semanas, he creado una aplicación Java (lo llamé Atom …) que analiza la voz y responde a todas las preguntas (utilizando la API de reconocimiento de voz de Google y la API Wolfram | Alpha). Usted debe definitivamente echar un vistazo a él en GitHub , hay todos los archivos utilizados, tanto en el lado de escritorio y lado del servidor . Espero haber ayudado!

EDITAR: Para trabajar con su servidor Helix

He encontrado este tutorial sobre cómo administrar y usar FTP en simplehelix.com , y este video Windows Server 2008 R2 – Configuración de un servidor FTP . Sólo tiene que seguir las instrucciones, pero omita el paso Logging en una cuenta FTP, ya que sólo explica cómo administrar los archivos desde un cliente de aplicación (como FileZilla o CuteFTP). Esto se hace con el fragmento de Java que he escrito anteriormente. Además, si puede ayudarte, encontré este video .

NOTA: En el primer código (Java), a menos que el directorio raíz al que acceda el servidor FTP sea la carpeta que contenga todos los archivos multimedia, tendrá que reemplazar sb.append("/"); Por la ruta de acceso a la carpeta donde se encuentran / deben ubicarse los archivos multimedia. Ejemplo de formulario, sb.append("/username/media/"); .

Como dijo @guillaume, el mejor enfoque para resolver este problema es cargar el archivo grabado desde su dispositivo a su base de datos usando el protocolo FTP.

Hice un proyecto similar en el que los dispositivos Android necesitaban acceso a una base de datos remota. Esto se logró utilizando el protocolo HTTP del sistema android. Este tutorial realmente se rompió y se describe cómo escribir el script PHP, cómo funciona el protocolo HTTP en android y cómo funciona el script en conjunción con la base de datos remota:

http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.