La resolución de CamcorderProfile.QUALITY_HIGH produce vídeo verde parpadeante
No he encontrado ninguna explicación para esto hasta ahora. Básicamente tengo una clase de grabación de vídeo que funciona espléndidamente cuando setVideoSize () está configurado a 720 x 480 en mi Samsung Galaxy S2.
Quiero que grabe en la resolución más alta posible con el uso de CamcorderProfile.QUALITY_HIGH Puedo obtener las mejores propiedades de grabación de la más alta calidad y establecerlas dentro de mi clase. Esto funciona para el formato de archivo, velocidad de fotogramas de vídeo, codificadores y velocidad de bits, sin embargo, cuando intento ajustar el tamaño del video a la anchura y altura devueltas por el CamcorderProfile (1920 x 1080), el video grabado es sólo un parpadeo verde.
- Android no puede grabar vídeo con la Cámara frontal, Error de inicio de MediaRecorder: -19
- ¿Cómo recuperar datos al grabarlos y visualizarlos como gráficos (Visualizador) en la pantalla?
- MediaRecorder.stop () colgando con Android 4.0 (ICS)
- Cómo reducir el tamaño del archivo mp3 en Android creado con MediaRecorder
- MediaRecorder.stop () se cuelga en la cámara Samsung Galaxy
Noté si cambié 720 x 480 a 720 x 481 hizo la misma cosa. Por lo tanto, sólo puedo asumir que esto sucede cuando la resolución no es compatible con el teléfono. Sin embargo, la videocámara con la que llegó el teléfono puede grabar en 1920 x 1080 y produce una grabación excelente.
Sólo puedo asumir con una resolución tan alta que necesito para establecer algunos otros parámetros de manera diferente, pero simplemente no puedo entender lo que podría ser.
¿Alguien mas ha tenido este problema?
Gracias de antemano por cualquier respuesta.
- Acceso a la secuencia de vídeo desde el dispositivo Looxcie
- Android: silencie el micrófono mientras graba vídeo
- ¿Cómo activar la vibración en la entrada de sonido?
- Problemas con la clase MediaRecorder para grabar audio - prepare () da una excepción - Permiso denegado
- ¿Por qué Camera necesita ser lanzado en onPause () en lugar de onstop () método de Activity?
- Cómo grabar el video usando la vista previa de la cámara en TextureView
- Android MediaRecorder setCaptureRate () y velocidad de reproducción de vídeo
- MediaRecorder start () falla si se llama demasiado rápido
Me encontré con esta pregunta tratando de resolver el mismo problema.
Se brinda una solución en xda developer http://forum.xda-developers.com/showthread.php?t=1104970&page=8 . Parece que usted necesita para establecer un oscuro parámetro "cam_mode" para la grabación de alta definición para trabajar:
camera = Camera.open(); Camera.Parameters param = camera.getParameters(); param.set( "cam_mode", 1 ); camera.setParameters( param );
En mediarecorder, puede utilizar
mediarecorder.setVideoSize(1920, 1080);
Aunque ahora esto también funcionará:
mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
(Este último parece tener un bitrate de vídeo de 20Mb / s, por lo que puede que desee tomar que un poco!) Me encontré con que no tenía que establecer el tamaño de vista previa a 1920×1080.
(Editar) También es necesario configurar
parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
o
param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
De lo contrario se obtiene un retraso de unos segundos antes de que la cámara se inicia!
En cuanto a por qué Samsung ha implementado la cámara de esta manera, no tengo ni idea. No es ciertamente desarrollador amigable!
Aquí es cómo he logrado 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 del grabador. Además, se requiere el hack de 'cam_mode' ya mencionado. Por lo tanto, permitió a un usuario seleccionar entre tres modos de calidad: bajo (800×480), medio (1280×720) y alto (1920×1080):
enum InternalCameraQuality { LOW, MEDIUM, HIGH }
Y al crear / poblar cámara y grabadora 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<Integer, Integer> 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<Integer, Integer> 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<Integer, Integer> 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 'cam_mode' hack sólo para la calidad media y alta, de lo contrario parpadeo verde aparecerá en el modo de baja calidad. También puede personalizar algunas otras configuraciones de perfil si es necesario.
Esperanza, eso ayudó.
He experimentado problemas similares como este en el pasado. Lo que estás haciendo parece estar bien, pero aquí hay algunas sugerencias que podrían ayudar a depurar el problema:
Asegúrese de que está seleccionando una resolución compatible
int cameraId = 0; // using back facing camera Camera camera = Camera.open(cameraId); Camera.Parameters cameraParams = camera.getParameters(); List<Camera.Size> supportedPreviewSizes = cameraParams.getSupportedPreviewSizez(); // find suitable Camera preview size from list and set your CamcorderProfile to use that new size
Después de haber localizado un tamaño de vista previa adecuado asegúrese de restablecer su SurfaceView – tendrá que cambiar el tamaño para acomodar el cambio en la relación de aspecto
MediaRecorder API utiliza SurfaceView, por lo que si su vista de superficie no está configurada correctamente, resultará en el parpadeo verde que está viendo
Asegúrese de que está utilizando una velocidad de bits de vídeo que puede soportar la nueva resolución – intente golpear la velocidad de bits de vídeo para duplicar lo que se estableció originalmente (* nota de que este efecto drásticamente su tamaño de archivo de salida)
CamcorderProfile.QUALITY_HIGH devuelve la resolución de cámara compatible más alta posible. Asegúrese de que está utilizando la identificación de la cámara correcta (frente vs atrás) – tal vez la parte trasera frente a la cámara admite 1080p, pero la cámara frente a frente no?
Espero que los consejos de ayuda!
List<Size> 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, he probado 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);