example - Android no puede grabar video con la cámara frontal, el inicio de MediaRecorder ha fallado:-19
record video android studio (6)
Tengo dos bases de código diferentes con el mismo problema.
El primero es un código copiado directamente desde 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 recibo el error.
Esto sucede en los siguientes dispositivos:
Nexus S 4.1.2
Galaxy Nexus 4.1.2
Nexus 7 4.2.1 (solo tiene cámara frontal)
También probé lo que parece ser una cámara de 2.2 parametros, que algunas personas afirman que es necesaria con algunos dispositivos Samsung y HTC, aunque varios artículos diferentes hacen referencia a diferentes claves de cadena:
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, también tenga en cuenta que estoy detectando la identificación correcta de la cámara frontal que en el Nexus 7 es, por supuesto: 0. Pero los resultados son los mismos en todos los dispositivos.
He intentado usar un perfil de baja calidad. He intentado configurar manualmente la resolución de video, el codificador, el formato de salida, la velocidad de bits, la velocidad de fotogramas y el tamaño de video de muchas maneras, pero ninguna ha funcionado.
Lo que me hace pensar que no hay nada malo con la mayoría del código es que la cámara normal funciona bien. Así que supongo que tiene algo que ver con el método prepareVideoRecorder () / prepareMediaRecorder () que configura Media Recorder.
¿Tal vez una configuración de codificación manual de Media Recorder que se sabe que funciona en una cámara frontal?
Tengo que decir que la API de Android y la API MediaRecorder son una mierda. Comparado con iOS, es un desastre, sin mencionar algunos de los temibles problemas de incompatibilidad de param y diferentes resoluciones en el panorama fragmentado de los dispositivos.
Asumiendo que puedo hacer que funcione en mis dispositivos JB, ¿alguien sabe por experiencia si la mayoría de estos problemas se resuelven con API 15 ICS?
Consideraría no apoyar API 10 Gingerbread si va a ser demasiado difícil de soportar.
He estado luchando con un error -19 durante unas pocas 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 establecer perfil, este código
Camera cam = Camera.open(frontCamID);
cam.unlock();
recorder.setCamera(cam);
Me permite seleccionar y grabar desde la cámara frontal.
Luché un poco con este problema un poco hoy también.
Primero, asegúrese de que sus permisos estén configurados correctamente. Específicamente, para grabar video, 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 () se establece de manera predeterminada en un perfil para la cámara trasera:
Devuelve el perfil de la cámara de video de la primera cámara trasera en el dispositivo en el nivel de calidad especificado. Si el dispositivo no tiene cámara trasera, esto devuelve nulo.
En su lugar, use http://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int) . El primer parámetro es la identificación de la cámara que abrió, específicamente, la cámara frontal.
Yo tuve el mismo problema. Después de rectificar cuál fue la causa, encontré solo 1 culpable. Resolución de 720 × 480 que está predeterminada en la cámara. Lo cambié a cualquier cosa y sí puedo grabarlo bien😎
deberías mirar aquí http://developer.android.com/guide/topics/media/camera.html#capture-video
el orden de los comandos allí enumerados es muy importante.
utilicé el segundo ejemplo del código de aquí ¿Cómo puedo capturar una grabación de video en Android?
y modificó las funciones de inicio de grabación
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();
}
intente con QUALITY_LOW porque QUALITY_HIGH no es compatible con la cámara frontal.
De acuerdo, finalmente lo tengo funcionando.
El problema parece relacionarse definitivamente con la configuración del perfil y, en particular, la velocidad de fotogramas.
En el Nexus S, mi dispositivo de prueba principal si pruebo la cámara.Parámetros que obtengo:
Para la cámara trasera:
15 FPS a 30 FPS, es suficiente.
Para la cámara frontal orientada:
7.5 FPS a 30 FPS, está bien.
Luego verifico los perfiles que intento usar:
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 la parte frontal es de solo 640x480. Pero ambos declaran 30 FPS.
Ahora....
Aquí está la rareza.
Si configuro CUALQUIER velocidad de cuadros para la cámara trasera, sin importar el perfil, falla con el temido error: -19
mediaRecorder.setVideoFrameRate(fpsInt);
Eso no es gran cosa porque no me importa la cámara trasera, pero es extraño, teniendo en cuenta que los perfiles están predeterminados a 30 y los Params dicen que aceptan 15-30. Pero ningún valor int iv probado ha funcionado. Si omito el setVideoFrameRate está bien.
De todos modos, pasar a la cámara frontal.
Entonces, si utilizo el perfil QUALITY_LOW Y configuro la velocidad de fotogramas en 15 o menos, funciona mágicamente.
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);
De hecho cualquier valor, 1 - 15 funciona. Lo cual parece extraño.
Así que aquí está el enigma, probablemente pueda sondear la resolución y seleccionar una resolución apropiada para la mayoría de las cámaras, aunque también estoy bastante seguro de que casi todas las cámaras frontales tienen un VGA mínimo de 640x480.
Pero, ¿qué pasa con la velocidad de fotogramas? En el caso del Nexus S, ¿no veo ninguna manera de poder determinar el valor de 15 o menos sin solo adivinar? ¿Debería intentar siempre usar la velocidad de fotogramas MÁS BAJA que devuelve la cámara?
Eché un vistazo al Galaxy Nexus y tiene 3 rangos de velocidad de cuadro, el primero es 15 - 15 y el segundo es 15 - 30. Su perfil de baja calidad es similar a una resolución más alta. Si utilizo perfil bajo en Galaxy Nexus parece funcionar bien.
Con el Nexus 7, no puedo sondear los perfiles de la videocámara. Obtengo punteros nulos, lo cual es extraño. Dice que es compatible con 4 FPS - 60 FPS. Si elijo QUALITY_LOW que crees que debería funcionar, se bloquea y no puedo encontrar una velocidad de fotogramas con la que funcione. Aunque el error se relaciona con setProfile, creo que el problema está en el perfil integrado. Seguramente el punto de la API de Android es que es consistente, este es un dispositivo de nave de bandera y la cámara FF está ahí para videoconferencia, ¿no es así ?????
Por lo tanto, aunque lo tengo trabajando en dos de los dispositivos que usan configuraciones personalizadas manuales para cada uno, no veo una forma clara de hacerlo funcionar en múltiples dispositivos a través del código.
Parece que el Nexus S no se comporta de la manera que promete con respecto a la configuración del FPS según Camera.getParameters (). GetSupportedPreviewFpsRange ()
Estoy feliz de que use la configuración automática de FPS, pero aparentemente no es así con la cámara FF, ¿qué se supone que debo hacer? Tengo que establecer explícitamente el FPS en el Nexus S y en este caso a cualquier valor de 1 a 15 FPS, a pesar de que la cámara me dice que maneja de 7.5 a 30 FPS.
Parece que la promesa del setProfile de arreglar todos los problemas en 2.x no era del todo cierto.
Puedo entender si estás escribiendo la aplicación de la cámara para una ROM en particular, solo la personalizas en ese hardware en particular, lo que podría explicar por qué las personas parecen tener siempre aplicaciones de cámara defectuosas en roms personalizadas. PERO ..... ¿cómo funcionan las aplicaciones descargables de grabación de video? ¿Están personalizados para cada dispositivo?
¿Es esto por lo que aún no hay Facebook Poke y Twitter Vine en Android? :PAG
Mierda Google, wtf es con su API de la cámara?
¿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, o voy a escribir código personalizado en cada dispositivo que pruebo y luego simplemente tirar los dados sobre el resto?
¿O es que el Nexus S y el Nexus 7 son simplemente extraños accidentes?