La resolución de CamcorderProfile.QUALITY_HIGH produce un video verde parpadeante

No he encontrado ninguna explicación para esto hasta ahora. Básicamente tengo una clase de grabación de video que funciona espléndidamente cuando setVideoSize () se establece en 720 x 480 en mi Samsung Galaxy S2.

Quiero que grabe en la resolución más alta posible, así que use CamcorderProfile.QUALITY_HIGH Puedo obtener las propiedades de grabación de más alta calidad y configurarlas dentro de mi clase. Esto funciona para formato de archivo, velocidad de cuadro de video, codificadores y velocidad de bits, sin embargo, cuando bash establecer el tamaño de video según el ancho y la altura devueltos por la CamcorderProfile (1920 x 1080), el video grabado es solo un parpadeo verde.

Noté que si cambiaba 720 x 480 a 720 x 481, hacía lo mismo. Por lo tanto, solo puedo suponer que esto sucede cuando el teléfono no admite la resolución. Sin embargo, la videocámara con la que vino el teléfono puede grabar en 1920 x 1080 y produce una excelente grabación.

Solo puedo suponer con una resolución tan alta que necesito establecer algunos otros parámetros de manera diferente, pero no puedo entender cuáles podrían ser.

¿Alguien mas ha tenido este problema?

Gracias de antemano por cualquier respuesta.

Me encontré con esta pregunta tratando de resolver el mismo problema.

Se entrega una solución al desarrollador xda http://forum.xda-developers.com/showthread.php?t=1104970&page=8 . Parece que necesita configurar un parámetro oscuro “cam_mode” para que funcione la grabación de alta definición:

camera = Camera.open(); Camera.Parameters param = camera.getParameters(); param.set( "cam_mode", 1 ); camera.setParameters( param ); 

En mediarecorder, puede usar

 mediarecorder.setVideoSize(1920, 1080); 

aunque esto ahora también funcionará:

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

(Este último parece tener una velocidad de bits de video de 20 Mb / s, por lo que es posible que desee reducirlo un poco). Descubrí que no tenía que establecer el tamaño de vista previa en 1920×1080.

(editar) También necesitas configurar

 parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 

o

 param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 

de lo contrario, se produce un retraso de unos segundos antes de que la cámara comience.

En cuanto a por qué Samsung ha implementado la cámara de esta manera, no tengo ni idea. ¡Ciertamente no es amigable para desarrolladores!

Aquí es cómo me las arreglé para hacer que esto funcione en Samsung Galaxy S2. El punto crítico aquí es establecer la misma resolución tanto en los parámetros de la cámara como en el tamaño del video de la grabadora. Además, ya se ha mencionado el “cam_mode” hack. Entonces, permití que un usuario seleccionara entre tres modos de calidad: bajo (800×480), medio (1280×720) y alto (1920×1080):

 enum InternalCameraQuality { LOW, MEDIUM, HIGH } 

y al crear / poblar la cámara y el grabador lo hice

 // signature types are irrelevant here File start(DeviceHandler handler, FileHelper fh) throws IOException { file = fh.createTempFile(".mp4"); camera = Camera.open(); setCameraParameters(camera); camera.setPreviewDisplay(getHolder()); camera.unlock(); recorder = new MediaRecorder(); recorder.setCamera(camera); setRecorderParameters(recorder); recorder.prepare(); recorder.start(); return file; } void setCameraParameters(Camera camera) { Camera.Parameters param = camera.getParameters(); // getParams() simply returns some field holding configuration parameters // only the 'quality' parameter is relevant here if (getParams().quality != InternalCameraQuality.LOW) { // Samsung Galaxy hack for HD video param.set("cam_mode", 1); } Pair resolution = getResolution(getParams().quality); param.setPreviewSize(resolution.first, resolution.second); param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); camera.setParameters(param); } void setRecorderParameters(MediaRecorder recorder) { recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); Pair resolution = getResolution(getParams().quality); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); profile.videoFrameWidth = resolution.first; profile.videoFrameHeight = resolution.second; recorder.setProfile(profile); recorder.setOutputFile(file.getAbsolutePath()); recorder.setPreviewDisplay(getHolder().getSurface()); } Pair getResolution(InternalCameraQuality quality) { final int width, height; switch (quality) { case LOW: width = 800; height = 480; break; case MEDIUM: width = 1280; height = 720; break; case HIGH: width = 1920; height = 1080; break; default: throw new IllegalArgumentException("Unknown quality: " + quality.name()); } return Pair.create(width, height); } 

Tenga en cuenta que debe utilizar el truco ‘cam_mode’ solo para calidad media y alta, de lo contrario, el parpadeo verde aparecerá en el modo de baja calidad. También es posible que desee personalizar algunas otras configuraciones de perfil si lo necesita.

Hope, eso ayudó.

  List ls = parameters.getSupportedPreviewSizes(); Size size = ls.get(1); sizes 1 ----------960 720 sizes 2 ----------800 480 sizes 3 ----------720 480 sizes 5 -----------640 384 sizes 6 ----------576 432 sizes 7 ----------480 320 

esta es la lista de tamaños y más en Android.

Ok, probé muchas variantes y la única Versión que funciona bien en dispositivos reales es:

 CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); // THREE_GPP works well but only on Phones // camcorderProfile.fileFormat = MediaRecorder.OutputFormat.THREE_GPP; // so better you use MPEG_4 for most Devices and PC camcorderProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4; camcorderProfile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP; mrec.setProfile(camcorderProfile); 

He experimentado problemas similares como este en el pasado. Lo que está haciendo parece estar bien, pero aquí hay algunas sugerencias que pueden ayudar a resolver el problema:

Asegúrese de seleccionar una resolución admitida

 int cameraId = 0; // using back facing camera Camera camera = Camera.open(cameraId); Camera.Parameters cameraParams = camera.getParameters(); List supportedPreviewSizes = cameraParams.getSupportedPreviewSizez(); // find suitable Camera preview size from list and set your CamcorderProfile to use that new size 

Después de que haya localizado un tamaño de vista previa adecuado, asegúrese de restablecer su SurfaceView; deberá cambiar el tamaño para adaptarse al cambio en la relación de aspecto.

La API MediaRecorder usa SurfaceView, por lo que si su vista de superficie no está configurada correctamente, dará como resultado el parpadeo verde que está viendo

Asegúrese de utilizar una velocidad de bits de video que pueda admitir la nueva resolución: intente boost la velocidad de bits del video para duplicar el valor establecido originalmente (* tenga en cuenta que esto afecta drásticamente el tamaño del archivo de salida)

CamcorderProfile.QUALITY_HIGH devuelve la resolución de cámara admitida más alta posible. Asegúrese de que está utilizando la identificación correcta de la cámara (frontal y posterior). ¿Tal vez la cámara trasera sea compatible con 1080p pero la cámara frontal no?

Espero que los consejos ayuden!