33 votos

CamcorderProfile.QUALITY_HIGH resolución produce verde parpadeo de vídeo

No he encontrado ninguna explicación para este tan lejos. Básicamente tengo una grabación en vídeo de la clase que funciona espléndidamente cuando setVideoSize() es el conjunto de 720 x 480 en mi Samsung Galaxy S2.

Yo lo quiero para grabar en la resolución más alta posible para el uso de CamcorderProfile.QUALITY_HIGH puedo conseguir los varios más alta calidad de grabación de propiedades y colocarlos dentro de mi clase. Esto funciona para el formato de archivo, velocidad de fotogramas de vídeo, codificadores y la tasa de bits, sin embargo cuando intento configurar el tamaño de vídeo de la anchura y la altura devuelto por el CamcorderProfile (1920 x 1080), el vídeo grabado es sólo un verde parpadeo.

Me di cuenta de que si he cambiado de 720 x 480 720 x 481 lo hizo la misma cosa. Por lo tanto, sólo puedo suponer que esto sucede cuando la resolución no es compatible con el teléfono. Sin embargo, la cámara de video del teléfono llegó con puede grabar en 1920 x 1080 y se produce una grabación excelente.

Sólo puedo suponer con una resolución de alta necesito para configurar otros parámetros de forma diferente, pero yo no puedo averiguar lo que podría ser.

Ha alguien tuvo este problema?

Gracias de antemano por las respuestas.

20voto

SGS2camera Puntos 156

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

Una solución está dada en desarrollador de xda 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 el trabajo:

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

En mediarecorder, a continuación, puede utilizar

mediarecorder.setVideoSize(1920, 1080);

aunque ahora también trabajo:

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

(Este último parece tener un bitrate de vídeo de 20Mb/s, por lo que usted puede ser que desee tomar que bajara un poco!) Me encontré con que no tenía para establecer el tamaño de la vista previa de 1920x1080.

(edit) también deberá establecer

parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

o

param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

de lo contrario se obtiene un retraso de un par de segundos antes de que la cámara comienza!

En cuanto a por qué Samsung ha implementado la Cámara de esta manera, no tengo idea. Ciertamente no es amigable al desarrollador!

8voto

Tvaroh Puntos 666

Aquí es cómo me las arreglé para hacer este trabajo en el Samsung Galaxy S2. El punto crítico aquí es establecer la resolución del mismo, tanto en los parámetros de la cámara y la grabadora de vídeo de tamaño. Además, ya se ha mencionado 'cam_mode' hack es necesario. Así que, me permite a un usuario seleccionar entre tres modos de calidad: baja (800x480), medio(1280 x 720), y alta(1920x1080):

enum InternalCameraQuality {
    LOW, MEDIUM, HIGH
}

y a la hora de crear/rellenar la cámara y la grabadora me hizo

// 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 solo para la mediana y de alta calidad, de lo contrario verde parpadeante aparecerá en baja calidad modo. También es posible que desee personalizar algún otro perfil de configuración si es necesario.

La esperanza, que la ayudó.

1voto

user1628121 Puntos 25
        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.

1voto

Tom Puntos 151

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);

0voto

jagsaund Puntos 1321

He tenido los mismos problemas como este en el pasado. Lo que estamos haciendo parece estar bien, pero aquí están algunas sugerencias que le pueden ayudar a depurar el problema:

Asegúrese de seleccionar 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 que usted haya localizado un adecuado tamaño de la vista previa asegúrese de restablecer su SurfaceView -- usted necesitará cambiar su tamaño para acomodar el cambio en la relación de aspecto

MediaRecorder API utiliza el SurfaceView así que si su superficie vista no se configuran correctamente se producirá la verde parpadeo que estamos viendo

Asegúrese de que está utilizando una tasa de bits de vídeo que puede apoyar la nueva resolución, tratar de chocar la tasa de bits de vídeo para el doble de lo que se estableció originalmente para (*nota: esta drásticamente los efectos de su salida tamaño de archivo)

CamcorderProfile.QUALITY_HIGH devuelve el mayor posible compatible resolución de la cámara. Asegúrese de que está utilizando la correcta identificación de la cámara (frente a frente de nuevo) -- tal vez la parte trasera frente a la cámara soporta 1080p, pero la cámara frontal no?

La esperanza de los consejos de ayuda!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X