¿Cómo transmitir flujo de la videocámara a través de la red, la producción de archivo de vídeo válido, utilizando Android?

Estoy tratando de grabar grabaciones de videocámara en un flujo de red, consulte el siguiente fragmento:

ParcelFileDescriptor fd = ParcelFileDescriptor.fromSocket(socket); this.camera.lock(); // this.camera refers to an android.hardware.Camera instance. this.camera.unlock(); this.mediaRecorder = new MediaRecorder(); this.mediaRecorder.setCamera(this.camera); this.mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); this.mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); this.mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH)); this.mediaRecorder.setOutputFile(fd.getFileDescriptor()); this.mediaRecorder.prepare(); this.mediaRecorder.start(); 

Entonces estoy intentando capturarlo en el otro lado de la conexión: con Socket.getInputStream() estoy leyendo los bytes, y sí, los bytes vienen adentro. El byte se escribe realmente sobre la red.

Pero cuando intenta guardarlo en un archivo usando la clase FileOutputStream , y abrir el archivo con VLC, simplemente no se puede leer.

¿Cómo puedo hacer que el archivo sea "jugable", es decir, que sea un archivo de video válido?

Editar:

Cuando uso this.mediaRecorder.setOutputFile("/sdcard/out.mp4"); , Puedo abrir el archivo de vídeo desde Android, y se reproducirá correctamente. Sin embargo, cuando uso this.mediaRecorder.setOutputFile(fd.getFileDescriptor()); , No lo hará.

One Solution collect form web for “¿Cómo transmitir flujo de la videocámara a través de la red, la producción de archivo de vídeo válido, utilizando Android?”

El problema puede deberse al hecho de que no está configurando todo en el perfil de la videocámara.

En lugar de esto:

 this.mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH)); 

Prueba por ejemplo esto:

 CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); profile.fileFormat = MediaRecorder.OutputFormat.MPEG_4; profile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP; this.mediaRecorder.setProfile(profile); 

BTW, ¿estás intentando transmitir este video después de terminar de grabarlo, o en tiempo real mientras obtengas datos de tu videocámara?

EDITAR:

Si recuerdo correctamente el formato de archivo mpeg4 no tiene un pie de página, así que no debería haber necesidad de "esperar todo el archivo" … PERO: este tipo de archivo tiene una estructura que no puedes romper si quieres leerla. Por lo tanto, podría haber un problema si está enviando bytes de vídeo sin formato que se ha preparado en formato de archivo mpeg4 y desea abrir un archivo después de haber recibido un número aleatorio de esos bytes. Puede estar casi seguro de que no tendrá la suerte de recibir el número correcto de bytes de su vídeo.

Lo que te aconsejo hacer es:

  1. Revisalo. Por ejemplo: envíe un vídeo al otro lado y utilice algún tipo de software que le permita comprobar la estructura del archivo. Tal vez uno de ellos le dirá si su archivo tiene la estructura correcta. Puedo tratar de vincular algunas herramientas, pero no he probado ninguna de ellas, así que es posible que necesite buscar algo más (si ninguno de ellos funciona lo suficientemente bien). Usted puede intentar por ejemplo esto o aquello .

  2. Si el paso 1. confirma que su archivo se está cortando en un lugar equivocado, entonces puede intentar controlarlo de alguna manera. Por ejemplo, al informar al receptor de los lugares del archivo, que cuando se utiliza para cortarlo, no resultará en romper la estructura (le permitirá abrir el archivo).

  3. La alternativa sería tratar de enviar algún tipo de frames de video "raw". Y por "raw" me refiero a algún tipo de datos de bajo nivel de la cámara que puede enviar y aplicar el códec específico en el lado receptor. No he intentado nunca hacer eso así que usted puede ser que necesite comprobar si es incluso posible (conseguir este tipo de datos).

  • Silencio de MediaRecorder al inicio de la grabación (¿Retardo?)
  • Android MediaRecorder produce video corrupto con líneas verdes
  • Uso de MediaPlayer para reproducir un archivo AMR creado por MediaRecorder falla con muri null
  • Android MediaRecorder API mantiene el recorte de la velocidad de bits de vídeo
  • Cómo cambiar framerate cuando se utiliza clase MediaRecorder
  • AudioSource.VOICE_CALL no funciona en android 4.0 pero funciona en android 2.3
  • Cómo cambiar la velocidad de fotogramas de la cámara para crear vídeo de cámara lenta o lapso de tiempo en Android
  • ¿Es posible reducir el tiempo de cambio de contexto
  • ¿Cómo recuperar datos al grabarlos y visualizarlos como gráficos (Visualizador) en la pantalla?
  • MediaRecorder - setOrientationHint () excepción / error
  • Android API8 setDisplayOrientation no afecta en absoluto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.