27 votes

CamcorderProfile.QUALITY_HIGH résolution produit vert clignote vidéo

Je n'ai pas trouvé d'explication à cette mesure. Fondamentalement, j'ai une vidéo de l'enregistrement de classe qui fonctionne magnifiquement lorsque setVideoSize() est de 720 x 480 sur mon Samsung Galaxy S2.

Je veux enregistrer dans la plus haute résolution possible, donc à l'aide d'CamcorderProfile.QUALITY_HIGH je peux obtenir les différents plus haute qualité d'enregistrement de propriétés et de les mettre dans ma classe. Cela fonctionne pour le format de fichier, le taux d'image vidéo, des encodeurs et des taux de bits, cependant lorsque je tente de définir la taille de la vidéo pour la largeur et la hauteur renvoyé par la CamcorderProfile (1920 x 1080), la vidéo enregistrée est juste un vert de scintillement.

J'ai remarqué que si j'ai changé de 720 x 480 720 x 481 il fait la même chose. Par conséquent, je ne peux que supposer que ce qui se passe quand la résolution n'est pas prise en charge par le téléphone. Cependant, le caméscope, le téléphone est venu avec peut enregistrer en 1920 x 1080 et il produit un excellent enregistrement.

Je ne peux que supposer, avec une haute résolution, j'ai besoin de définir d'autres paramètres différemment, mais je ne peux pas comprendre ce qu'ils pourraient être.

Quelqu'un d'autre a eu ce problème?

Merci d'avance pour toutes les réponses.

16voto

SGS2camera Points 156

Je suis tombé sur cette question d'essayer de résoudre le même problème.

Une solution est donnée sur xda developer http://forum.xda-developers.com/showthread.php?t=1104970&page=8. Il semble que vous devez définir un obscur paramètre "cam_mode" pour l'enregistrement en haute définition de travail:

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

Dans mediarecorder, vous pouvez ensuite utiliser

mediarecorder.setVideoSize(1920, 1080);

bien que ce sera désormais également le travail:

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

(Ce dernier semble avoir un bitrate vidéo de 20 mo/s, de sorte que vous pouvez prendre vers le bas un peu!) J'ai trouvé que je n'avais pas à régler la taille de l'aperçu de 1920x1080.

(edit) Vous devez également définir

parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

ou

param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

sinon vous avez un délai de quelques secondes avant que l'appareil commence!

Pourquoi Samsung a mis en place la Caméra de cette façon, je n'ai aucune idée. Ce n'est certainement pas le développeur de l'environnement!

6voto

Tvaroh Points 666

Voici comment j'ai réussi à faire ce travail sur Samsung Galaxy S2. Le point crucial ici est de mettre la même résolution dans les paramètres de la caméra et l'enregistreur de la taille de la vidéo. Aussi, déjà mentionné "cam_mode" hack est nécessaire. Donc, j'ai permis à un utilisateur de choisir entre trois modes de qualité: faible (800x480), moyen(1280 x 720) et haute(1920x1080):

enum InternalCameraQuality {
    LOW, MEDIUM, HIGH
}

et lors de la création/remplissage de la caméra et enregistreur je n'ai

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

Notez que vous devez utiliser le "cam_mode" hack seulement pour les moyennes et haute qualité, sinon, vert clignote apparaît en bas de la qualité mode. Aussi, vous pouvez personnaliser certains autres paramètres de profil si vous avez besoin d'.

L'espoir, qui m'ont aidé.

0voto

jagsaund Points 1321

J'ai connu les mêmes problèmes de ce genre dans le passé. Ce que vous faites semble être bien, mais voici quelques suggestions qui pourraient vous aider à déboguer le problème:

S'assurer de la sélection d'une résolution prise en charge

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

Après que vous avez localisé approprié aperçu de la taille veillez à réinitialiser votre SurfaceView-vous aurez besoin de redimensionner pour s'adapter à la modification de l'aspect ratio

MediaRecorder API utilise la SurfaceView donc, si votre surface d'affichage n'est pas configuré correctement, il en résultera dans le vert de scintillement que vous voyez

Assurez-vous d'utiliser un débit binaire vidéo qui peut soutenir la nouvelle résolution -- essayez de heurter le débit binaire vidéo de double de ce qu'elle a été créée à l'origine (*notez que ce n'considérablement les effets de la production de votre taille)

CamcorderProfile.QUALITY_HIGH les rendements les plus élevés possibles pris en charge la résolution de la caméra. Assurez-vous d'utiliser la bonne id de la caméra (avant vs retour) -- peut-être l'arrière face à la caméra prend en charge 1080p mais l'avant face à la caméra ne fonctionne pas?

Espérons que les conseils de l'aide!

0voto

user1628121 Points 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

ce sont la liste des tailles et plus dans android.

0voto

Tom Points 151

Ok, j'ai testé de nombreuses variantes et la seule Version qui fonctionne bien sur de véritables Dispositifs est:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X