Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • ¿Cómo usar las Preferencias Compartidas en MVP sin Dagger y no hacer que Presenter dependa del contexto?
  • Android - SupportMapFragment con GoogleMaps API 2.0 dando IllegalArgumentException
  • Cómo invocar la calculadora de Android desde una aplicación
  • ¿Creación de una aplicación de SMS en Android?
  • Búsqueda en varias columnas mediante búsqueda de texto completo (FTS) con varios tokens utilizando el operador OR
  • Cómo implementar pull para actualizar en un ListFragment
  • 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.

  • Imprimir el contenido de un paquete a Logcat?
  • Androide. ¿Cómo funciona el método notifyDataSetChanged () y ListViews?
  • ¿Cómo se establece el número máximo de caracteres para un EditText en Android?
  • ¿Cómo puedo obtener Logcat para varios dispositivos que se ejecutan al mismo tiempo en Eclipse?
  • Android - acercar / alejar RelativeLayout con spread / pinch
  • Última palabra mostrada en una vista de texto
  • 5 Solutions collect form web for “La resolución de CamcorderProfile.QUALITY_HIGH produce vídeo verde parpadeante”

    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); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.