web-dev-qa-db-fra.com

Android ne peut pas enregistrer de vidéo avec une caméra frontale, le démarrage de MediaRecorder a échoué: -19

J'ai deux bases de code différentes avec le même problème.

Le premier est du code directement copié de developer.Android.com ici:http://developer.Android.com/guide/topics/media/camera.html#custom-camera

Le second est ce code:

http://Android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

Les deux fonctionnent bien avec la caméra arrière normale, mais dès que j'essaie d'utiliser la caméra qui fait face à l'avant, j'obtiens l'erreur.

Cela se produit sur les appareils suivants:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1 (il n’a que la caméra orientée vers l’avant)

J'ai également essayé ce qui ressemble à l'appareil photo d'époque de la version 2.2, que certaines personnes prétendent être nécessaire avec certains appareils Samsung et HTC, bien que plusieurs articles différents fassent référence à différentes clés de chaîne:

c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);

Aucune de ces méthodes ne fonctionne, veuillez également noter que je détecte le bon identifiant de caméra frontale, qui sur le Nexus 7 est bien sûr: 0. Mais les résultats sont les mêmes sur tous les appareils.

J'ai essayé d'utiliser un profil de qualité médiocre, j'ai essayé de régler manuellement la résolution vidéo, l'encodeur, le format de sortie, le débit binaire, la fréquence d'images et la taille de la vidéo, mais aucune n'a fonctionné.

Ce qui me fait penser qu’il n’ya aucun problème avec la plupart du code, c’est que la caméra normale fonctionne bien. Donc, je suppose que cela a quelque chose à voir avec la méthode prepareVideoRecorder ()/prepareMediaRecorder () qui configure l’enregistreur multimédia.

Peut-être des paramètres de codage manuel de Media Recorder connus pour fonctionner sur une caméra frontale?

Je dois dire que la caméra Android et l'API MediaRecorder sont vraiment nuls. Par rapport à iOS, c'est un peu le bordel, sans parler de certains problèmes d’incompatibilité inquiétants et de résolutions différentes dans le paysage fragmenté des appareils.

En supposant que je puisse le faire fonctionner sur mes périphériques JB, est-ce que quelqu'un sait d'expérience si la plupart de ces problèmes sont résolus avec API 15 ICS?

J'envisagerais de ne pas prendre en charge API 10 Gingerbread s'il est trop difficile à prendre en charge.

22
Madhava Jay

D'accord, je finis par le faire fonctionner.

Le problème semble définitivement lié aux paramètres du profil et en particulier à la fréquence d'images.

Sur le Nexus S, mon périphérique de test principal si je sonde la caméra. Les paramètres suivants sont obtenus:

Pour la caméra arrière:
15 FPS à 30 FPS, assez bien.

Pour la caméra frontale:
7,5 FPS à 30 FPS, d'accord.

Ensuite, je vérifie les profils que j'essaie d'utiliser:

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

QUALITY_LOW:
audioBitRate: 12200
audioChannels: 1
audioCodec: AMR_NB audioSampleRate: 8000
durée: 30
fileFormat: THREE_GPP
qualité: 0
videoBitRate: 256000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 176
videoFrameHeight: 144 

HAUTE QUALITÉ:
audioBitRate: 24000
audioChannels: 1
audioCodec: AAC
audioSampleRate: 16000
durée: 60
fileFormat: MPEG_4
qualité: 1
videoBitRate: 3000000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 720
videoFrameHeight: 480 

Il est clair que le profil de haute qualité est destiné à la caméra arrière, vu que son orientation avant n’est que de 640x480 . Mais ils indiquent tous les deux une vitesse de 30 images par seconde.

À présent....

Heres l'étrangeté.

Si je règle N'IMPORTE QUELLE fréquence d'images pour la caméra orientée vers l'arrière, quel que soit son profil, il se bloque avec l'erreur redoutée: -19

mediaRecorder.setVideoFrameRate(fpsInt);

Ce n'est pas grave, car je me moque de la caméra arrière, mais c'est bizarre, étant donné que les profils ont une valeur par défaut de 30 et que les paramètres indiquent qu'ils en acceptent 15 à 30. Mais aucune valeur int iv essayée n'a fonctionné. Si j'omets le setVideoFrameRate son amende.

Quoi qu'il en soit, passer à la caméra orientée vers l'avant.

Ainsi, si j'utilise le profil QUALITY_LOW ET si je règle le taux de trame sur 15 ou moins, cela fonctionne comme par magie.

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);

Enfait n'importe quelle valeur, 1 - 15 œuvres. Ce qui semble bizarre.

Donc, voici la connundrum, je peux probablement chercher la résolution et choisir une résolution appropriée pour la plupart des appareils photo, bien que je sois également assez confiant pour la quasi-totalité des appareils photo frontaux avec un minimum de VGA 640x480.

Mais qu'en est-il de la fréquence d'images? Dans le cas du Nexus S, je ne vois aucun moyen de déterminer la valeur de 15 ou moins sans deviner quoi que ce soit? Devrais-je toujours utiliser le paramètre LE PLUS BAS? taux de trame renvoyé par la caméra?

Je me suis penché sur le Galaxy Nexus et il dispose de 3 plages de fréquences d'images, la première est comprise entre 15 et 15 et la seconde entre 15 et 30 . Son profil de qualité médiocre est similaire à une résolution supérieure similaire albiet . profil bas sur Galaxy Nexus, il semble bien fonctionner.

Avec le Nexus 7, je n'arrive pas à sonder le caméscopeProfil. Je continue à avoir des pointeurs nuls, ce qui est bizarre…. Je ne trouve pas de fréquence d'images avec laquelle il fonctionnera . Bien que l'erreur se rapporte à setProfile, je pense que le problème est lié au profil intégré . Le point fondamental de l'API Android est qu'il est cohérent, il s'agit d'un dispositif de navire drapeau et la caméra FF est là pour la vidéoconférence isnt it ?????

Ainsi, alors que je travaille sur deux des périphériques avec des paramètres personnalisés manuels pour chacun, je ne vois pas comment le faire fonctionner clairement sur plusieurs périphériques à l'aide de code.

Il semble que le Nexus S ne se comporte pas comme il l’avait promis en ce qui concerne la définition du FPS selon Camera.getParameters (). GetSupportedPreviewFpsRange ()

Je suis tout à fait content d'utiliser les paramètres Auto FPS, mais apparemment, cela ne va pas avec la caméra FF, alors que dois-je faire? Je dois régler explicitement le FPS sur le Nexus S et dans ce cas entre 1 et 15 FPS, bien que la caméra vidéo me dise qu'elle gère un débit de 7,5 à 30 FPS.

On dirait que la promesse de setProfile de résoudre tous les problèmes de la version 2.x n'était pas tout à fait vraie.

Je peux comprendre que si vous écrivez dans l'application Camera pour un ROM particulier, vous la personnalisiez uniquement avec ce matériel particulier, ce qui pourrait expliquer pourquoi les gens semblent toujours avoir des applications buggy pour les caméras sur leurs roms personnalisées. MAIS ..... comment fonctionnent les applications d'enregistrement vidéo téléchargeables? Sont-elles personnalisées pour chaque appareil?

Est-ce pourquoi il n'y a pas encore de Facebook Poke et Twitter Vine sur Android ???? : P

Merde Google, wtf est avec votre API de caméra?

Quelqu'un connaît-il les meilleures pratiques pour déterminer la résolution et le débit d'images de TOUS les périphériques compatibles API 15+?

Est-ce même possible ou vais-je écrire un code personnalisé sur chaque appareil que je teste et lancer ensuite les dés sur le reste?

Ou est-ce que le Nexus S et le Nexus 7 sont de simples accidents?

24
Madhava Jay

J'ai aussi un peu lutté avec ce problème aujourd'hui.

Tout d'abord, assurez-vous que vos autorisations sont correctement configurées. Plus précisément, pour enregistrer une vidéo, vous aurez besoin de:

<uses-feature Android:name="Android.hardware.camera.front" />
<uses-feature Android:name="Android.hardware.microphone"/>

<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Deuxièmement, et c’est la partie la plus délicate, cette ligne du tutoriel ne fonctionne pas avec la caméra de face!

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

Cette signature pour CamcorderProfile.get () utilise par défaut un profil pour la caméra orientée vers l'arrière:

Renvoie le profil du caméscope pour le premier appareil photo orienté vers l'arrière de l'appareil avec le niveau de qualité donné. Si le périphérique n'a pas de caméra orientée vers l'arrière, cela renvoie null.

À la place, utilisez http://developer.Android.com/reference/Android/media/CamcorderProfile.html#get(int,%20int) . Le premier paramètre est l'identifiant de la caméra que vous avez ouverte, en particulier la caméra frontale.

37
spitzanator

essayez avec QUALITY_LOW car QUALITY_HIGH n'est pas pris en charge par la caméra avant.

2
user2157737

Je suis aux prises avec une erreur -19 depuis quelques heures maintenant. La réponse pour moi est dans la réponse de Madhava et en particulier mCamera.unlock ();

i.e. En combinaison avec la première réponse à propos du profil défini, ce code 

        Camera cam = Camera.open(frontCamID);
        cam.unlock();
        recorder.setCamera(cam);

Me permet de sélectionner et d’enregistrer depuis la caméra frontale. 

1
Tim Smith

vous devriez regarder ici http://developer.Android.com/guide/topics/media/camera.html#capture-video

l'ordre des commandes répertoriées ici est très important.

j'ai utilisé le deuxième exemple de code à partir d'ici Comment capturer un enregistrement vidéo sur Android?

et modifié les fonctions de démarrage de l'enregistrement

protected void startRecording() throws IOException 
{
    mrec = new MediaRecorder();  // Works well

    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();

    mCamera.unlock();
    mrec.setCamera(mCamera);

    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 

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

    mrec.setOutputFile("/sdcard/zzzz.3gp");
    mrec.setPreviewDisplay(surfaceHolder.getSurface());

    mrec.prepare();
    mrec.start();
}
0
Arkady

J'ai eu le même problème. Après avoir rectifié la cause, je n’ai trouvé qu’un coupable. Je l'ai changé pour n'importe quoi et oui je peux bien l'enregistrer ????

0
Ankushkushal