Android no puede grabar vídeo con la Cámara frontal, Error de inicio de MediaRecorder: -19

Tengo dos bases de código diferentes con el mismo problema.

El primero es el código copiado directamente de developer.android.com aquí: http://developer.android.com/guide/topics/media/camera.html#custom-camera

El segundo es este código:

Http://android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

Ambos funcionan bien con la cámara trasera normal, pero tan pronto como trato de usar la cámara frontal frente a obtener el error.

Esto sucede en los siguientes dispositivos:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1 (sólo tiene cámara frontal)

He intentado lo que parece 2.2 era Camera Params, así, que algunas personas dicen que se requiere con algunos dispositivos de Samsung y HTC, aunque varios artículos diferentes referencias diferentes Claves:

c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance Camera.Parameters params = c.getParameters(); params.set("cam-mode", 1); params.set("cam_mode", 1); params.set("camera-id", 1); c.setParameters(params); 

Ninguno de estos trabajos, por favor, tenga en cuenta que estoy detectando la correcta frente de frente de cámara ID que en el Nexus 7 es, por supuesto: 0. Pero los resultados son los mismos en todos los dispositivos.

He intentado usar el perfil de la baja calidad, he intentado fijar la resolución video, el codificador, el formato de la salida, el bitrate, la tarifa de marco y el tamaño video manualmente en una multitud de maneras pero ningunos que han trabajado.

Lo que me hace pensar theres nada malo con la mayor parte del código es que la cámara normal funciona bien. Por lo que mi conjetura es su algo que ver con el método prepareVideoRecorder () / prepareMediaRecorder () que configura el Media Recorder.

Tal vez un manual de grabadora de medios de codificación de los ajustes que se sabe que funcionan en una cámara frente a frente?

Tengo que decir, la cámara Android y MediaRecorder API's chupar. En comparación con iOS es un poco desordenado, por no mencionar algunos de los problemas de incompatibilidad de param alarmante y diferentes resoluciones en el paisaje del dispositivo fragmentado.

Suponiendo que puedo conseguir que funcione en mis dispositivos JB, ¿alguien sabe por experiencia si la mayoría de estos problemas se resuelven con API 15 ICS?

Yo consideraría no apoyar API 10 Gingerbread si va a ser demasiado difícil de apoyar.

Luché con este problema un poco hoy, también.

Primero, asegúrese de que sus permisos estén configurados correctamente. Específicamente, para grabar video, usted querrá:

 <uses-feature android:name="android.hardware.camera.front" /> <uses-feature android:name="android.hardware.microphone"/> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

En segundo lugar, y esta es la parte difícil, esta línea del tutorial no funciona con la cámara frontal!

 mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

Esa firma para CamcorderProfile.get () predeterminado es un perfil para la cámara de cara atrás:

Devuelve el perfil de la videocámara de la primera cámara orientada hacia atrás en el dispositivo con el nivel de calidad especificado. Si el dispositivo no tiene una cámara hacia atrás, esto devuelve null.

En su lugar, utilice http://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int) . El primer parámetro es el id de la cámara que abrió, específicamente, la cámara frontal.

De acuerdo, así que finalmente lo tengo trabajando.

El problema parece estar relacionado con los ajustes de perfil y, en particular, la velocidad de fotogramas.

En el Nexus S, mi dispositivo de prueba principal si siento la Camera.Parameters me sale:

Para la cámara trasera:
15 FPS a 30 FPS, lo suficientemente justo.

Para la cámara frontal:
7,5 FPS a 30 FPS, está bien.

Entonces compruebo los perfiles que estoy intentando utilizar ,:

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

QUALITY_LOW:
AudioBitRate: 12200
AudioChannels: 1
AudioCodec: AMR_NB audioSampleRate: 8000
Duración: 30
FileFormat: THREE_GPP
Calidad: 0
VideoBitRate: 256000
VideoCodec: H264
VideoFrameRate: 30
VideoFrameWidth: 176
VideoFrameHeight: 144

ALTA CALIDAD:
AudioBitRate: 24000
AudioChannels: 1
AudioCodec: AAC
AudioSampleRate: 16000
Duración: 60
FileFormat: MPEG_4
Calidad: 1
VideoBitRate: 3000000
VideoCodec: H264
VideoFrameRate: 30
VideoFrameWidth: 720
VideoFrameHeight: 480

Claramente, el perfil de alta calidad está destinado a la cámara trasera, ya que el frente es de sólo 640×480. Pero ambos estados 30 FPS.

Ahora….

Heres la rareza.

Si fijo ANY velocidad de fotogramas para la cámara trasera, no importa qué perfil, se bloquea con el temido: -19 error

 mediaRecorder.setVideoFrameRate(fpsInt); 

Eso no es una gran cosa porque no me importa la cámara trasera, pero es extraño, teniendo en cuenta que los perfiles están por defecto a 30 y los Params dicen que aceptan 15-30. Pero ningún int valor iv probado ha funcionado. Si omito el setVideoFrameRate su multa.

De todos modos, moviéndose hacia la Cámara Frontal.

Por lo tanto, si utilizo el perfil QUALITY_LOW y establezco la velocidad de fotogramas a 15 o menos, funciona mágicamente.

 mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); mediaRecorder.setVideoFrameRate(15); 

De hecho cualquier valor, 1 – 15 obras. Que parece raro.

Por lo tanto heres el connundrum, probablemente puedo probar para la resolución y seleccionar una resolución adecuada para la mayoría de las cámaras, aunque im también bastante seguro casi todas las cámaras frontales al mínimo VGA 640×480.

Pero, ¿qué pasa con la velocidad de fotogramas? En el caso de la Nexus S, no veo ninguna forma de que pudiera determinar el valor de 15 o menos sin apenas adivinar? ¿Debo apuntar siempre a usar la velocidad de fotogramas MÁS BAJA que devuelve la cámara?

Tomé en mirar el Galaxy Nexus y tiene 3 rangos de frecuencia de fotogramas, el primero es 15 – 15 y el segundo es 15 – 30. Su perfil de baja calidad es similar albiet mayor resolución. Si utilizo perfil bajo en Galaxy Nexus parece funcionar bien.

Con el Nexus 7, no puedo probar el CamcorderProfile sigo obteniendo punteros nulos, lo cual es raro. Dice que soporta 4 FPS – 60 FPS. Si elijo QUALITY_LOW, lo que creo que debería funcionar, se bloquea y no puedo encontrar una velocidad de fotogramas con la que funcionará. Aunque el error se refiere a setProfile, creo que el problema es con el perfil incorporado. Seguramente el punto de la API de Android es que su consistente, este es un dispositivo de buque bandera y la cámara FF está allí para la videoconferencia ¿no ?????

Por lo tanto, aunque tengo que trabajar en dos de los dispositivos que utilizan manuales de configuración personalizada para cada uno, no puedo ver una manera clara de hacerlo funcionar a través de múltiples dispositivos a través de código.

Parece que el Nexus S no se comporta de la manera que promete con respecto a la configuración de la FPS según su Camera.getParameters (). GetSupportedPreviewFpsRange ()

Im todo feliz para que utilice ajustes auto del FPS pero aparentemente no con la cámara del FF así que qué se supone que debo hacer? Tengo que establecer explícitamente el FPS en el Nexus S y en este caso a cualquier cosa de 1 a 15 FPS, a pesar de la cámara me dice que maneja 7.5 – 30 FPS.

Parece que la promesa del setProfile que arregla todas las ediciones en 2.x no era enteramente verdad.

Puedo entender si escribes la aplicación de cámara para una ROM en particular, solo la personalizas a ese hardware en particular, lo que podría explicar por qué la gente parece tener siempre aplicaciones de cámara en buggy en roms personalizadas. PERO ….. ¿Cómo funcionan las aplicaciones de grabación de video descargables? ¿Son personalizados para cada dispositivo?

¿Es por eso theres no Facebook Poke y Twitter Vine en Android todavía ???? :PAG

Mierda Google, wtf es con su cámara API?

¿Alguien conoce las mejores prácticas para determinar la resolución y la velocidad de fotogramas para TODOS los dispositivos compatibles con API 15+?

¿Es eso posible incluso, o voy a estar escribiendo el código de encargo en cada dispositivo que pruebo y después apenas ruedo los dados en el resto?

¿O es el Nexus S y el Nexus 7 sólo accidentes freak?

Intente con QUALITY_LOW porque QUALITY_HIGH no es compatible con la cámara frontal.

He estado luchando con un error -19 durante unas horas. La respuesta para mí está en la respuesta de Madhava y en particular mCamera.unlock ();

Es decir, en combinación con la primera respuesta sobre el perfil ajustado, este código

  Camera cam = Camera.open(frontCamID); cam.unlock(); recorder.setCamera(cam); 

Permite seleccionar y grabar desde la cámara frontal.

Usted debe buscar aquí http://developer.android.com/guide/topics/media/camera.html#capture-video

El orden de los comandos enumerados allí es muy importante.

He utilizado el segundo ejemplo del código de aquí ¿Cómo puedo capturar una grabación de vídeo en Android?

Y modificó las funciones de grabación de inicio

 protected void startRecording() throws IOException { mrec = new MediaRecorder(); // Works well mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); mCamera.unlock(); mrec.setCamera(mCamera); mrec.setPreviewDisplay(surfaceHolder.getSurface()); mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mrec.setOutputFile("/sdcard/zzzz.3gp"); mrec.setPreviewDisplay(surfaceHolder.getSurface()); mrec.prepare(); mrec.start(); } 

Yo tuve el mismo problema. Después de rectificar lo que fue la causa encontré sólo 1 culpable., 720 × 480 de resolución que es el valor predeterminado en la cámara. Lo cambié a cualquier cosa y sí lo puedo grabar bien

  • Android: silencie el micrófono mientras graba vídeo
  • Estabilización de video en tiempo real
  • Video androide, escuchar sonido pero no video
  • Androide. Cómo reproducir video en Surface (OpenGL)
  • Android WebView HTML5 Video Spawns MediaPlayer que vive para siempre en Samsung S4
  • Captura de cámara Android produce vídeo verde y bloque
  • Cómo convertir datos de video en base64
  • Android - Cómo iniciar la grabación de vídeo automáticamente cuando se llama a la cámara intención
  • Uso de surfaceView para capturar un video
  • Reproducción de vídeo en pantalla completa
  • Trabajar con ffmpeg en Xamarin Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.