webentwicklung-frage-antwort-db.com.de

Android kann mit der Frontkamera keine Videos aufnehmen, MediaRecorder-Start fehlgeschlagen: -19

Ich habe zwei verschiedene Codebasen mit dem gleichen Problem.

Der erste ist Code, der direkt von developer.Android.com hier kopiert wurde:http://developer.Android.com/guide/topics/media/camera.html#custom-camera

Der zweite ist der folgende Code:

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

Beide funktionieren gut mit der normalen Rückfahrkamera, aber sobald ich versuche, die Frontkamera zu verwenden, erhalte ich den Fehler.

Dies geschieht auf folgenden Geräten:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1 (es hat nur eine Frontkamera)

Ich habe versucht, wie es aussieht, als ob 2.2 Camera Params der Ära gilt, von dem einige behaupten, dass es bei einigen Samsung- und HTC-Geräten erforderlich ist, obwohl mehrere verschiedene Artikel auf unterschiedliche String-Schlüssel verweisen:

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

Nichts davon funktioniert. Beachten Sie auch, dass ich die korrekte Front-Kamera-ID erkenne, die auf dem Nexus 7 natürlich lautet: 0. Die Ergebnisse sind jedoch auf allen Geräten gleich.

Ich habe versucht, ein niedriges Qualitätsprofil zu verwenden. Ich habe versucht, die Videoauflösung, den Encoder, das Ausgabeformat, die Bitrate, die Bildrate und die Videogröße manuell auf eine Vielzahl von Arten einzustellen, jedoch keine, die funktioniert hat.

Ich denke, dass mit den meisten Codes nichts falsch ist, dass die normale Kamera gut funktioniert. Meine Vermutung hat also etwas mit der prepareVideoRecorder ()/preparMediaRecorder () - Methode zu tun, die den Media Recorder einrichtet.

Vielleicht eine manuelle Kodiereinstellung für den Medienrekorder, die für eine Frontkamera bekannt ist?

Ich muss sagen, die Android Camera und MediaRecorder API sind scheiße. Verglichen mit iOS ist es ein bisschen chaotisch, ganz zu schweigen von den gruselig aussehenden Param-Inkompatibilitätsproblemen und unterschiedlichen Auflösungen in der fragmentierten Gerätelandschaft.

Weiß jemand aus Erfahrung, ob die meisten dieser Probleme mit API 15 ICS gelöst werden?

Ich würde erwägen, API 10 Gingerbread nicht zu unterstützen, wenn es zu schwer zu unterstützen wäre.

22
Madhava Jay

Okay, ich habe es endlich so funktioniert.

Das Problem scheint sich eindeutig auf die Profileinstellungen und insbesondere auf die Bildrate zu beziehen.

Auf dem Nexus S, meinem Haupttestgerät, wenn ich die Camera.Parameter abführe, bekomme ich:

Für die hintere Kamera:
15 FPS bis 30 FPS, fair genug.

Für die Frontkamera:
7,5 FPS bis 30 FPS, okay.

Dann überprüfe ich die Profile, die ich verwenden möchte:

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

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

QUALITY_HIGH:
audioBitRate: 24000
audioChannels: 1
audioCodec: AAC
audioSampleRate: 16000
Dauer: 60
fileFormat: MPEG_4
qualität: 1
videoBitRate: 3000000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 720
videoFrameHeight: 480 

Natürlich ist das Hochqualitätsprofil für die Rückfahrkamera gedacht, da die Vorderseite nur 640x480 beträgt .., jedoch beide 30 FPS.

Jetzt....

Hier ist die Komik.

Wenn ich für die rückwärts gerichtete Kamera eine beliebige Bildrate einstelle, stürzt sie mit dem gefürchteten Fehler -19 ab

mediaRecorder.setVideoFrameRate(fpsInt);

Das ist keine große Sache. Ich interessiere mich nicht für die hintere Kamera, aber es ist seltsam, wenn man bedenkt, dass die Profile standardmäßig auf 30 eingestellt sind und die Params sagen, dass sie 15 bis 30 akzeptieren. Aber kein int-Wert, den ich versucht habe, hat funktioniert. Wenn ich den setVideoFrameRate ommit, ist das in Ordnung.

Wie auch immer, zur Frontkamera vorrücken.

Wenn ich also das QUALITY_LOW-Profil verwende und die Bildrate auf 15 oder niedriger eingestellt habe, funktioniert es magisch.

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

Infact jeder Wert, 1 - 15 Werke. Was seltsam erscheint.

Also hier ist das Connundrum, ich kann wahrscheinlich nach der Auflösung suchen und eine geeignete Auflösung für die meisten Kameras auswählen, obwohl ich auch fast alle Frontkameras bei einem Minimum an VGA 640x480 recht zuversichtlich bin.

Aber was ist mit der Framerate? Im Fall des Nexus S sehe ich keine Möglichkeit, den Wert von 15 oder niedriger zu bestimmen, ohne nur zu raten.? Soll ich immer den niedrigsten Wert verwenden? Bildrate, die von der Kamera zurückgegeben wird?

Ich habe mir das Galaxy Nexus angesehen und es hat 3 Frameratenbereiche, der erste ist 15 - 15 und der zweite 15 - 30. Sein niedriges Qualitätsprofil ist ähnlich hoch wie die höhere Auflösung Geringes Profil auf dem Galaxy Nexus scheint gut zu funktionieren.

Mit dem Nexus 7 kann ich die Camcorder-Profile nicht abtasten. Ich bekomme immer wieder Nullzeiger, was seltsam ist .. Sie sagt, dass sie 4 FPS - 60 FPS unterstützt. Wenn ich QUALITY_LOW wähle, sollte das funktionieren, stürzt es ab und Ich kann keine Framerate finden, mit der es funktioniert .. .. Obwohl sich der Fehler auf setProfile bezieht, denke ich, dass das Problem mit dem eingebauten Profil zusammenhängt. Wahrscheinlich ist der Punkt der Android-API, dass es konsistent ist Flag Schiffsgerät und die FF-Kamera gibt es für Videokonferenzen ist es nicht ?????

Während ich also auf zwei Geräten mit manuellen benutzerdefinierten Einstellungen für jedes Gerät arbeiten kann, kann ich nicht erkennen, dass es über Code auf mehreren Geräten funktioniert.

Es scheint, dass sich der Nexus S nicht so verhält, wie er es in Bezug auf die Einstellung der FPS gemäß Camera.getParameters () verspricht. GetSupportedPreviewFpsRange ()

Ich bin sehr glücklich darüber, Auto-FPS-Einstellungen zu verwenden, aber anscheinend funktioniert das bei der FF-Kamera nicht. Was soll ich also tun? Ich muss die FPS auf dem Nexus S explizit einstellen und in diesem Fall auf 1 bis 15 FPS, obwohl die Kamera mir sagt, dass sie 7,5 - 30 FPS beherrscht.

Anscheinend war das Versprechen des setProfile, dass alle Probleme in 2.x behoben wurden, nicht ganz richtig.

Ich kann verstehen, wenn Sie die Kamera-App für ein bestimmtes ROM schreiben, passen Sie sie einfach an diese bestimmte Hardware an, was möglicherweise erklärt, warum die Leute immer fehlerhafte Kamera-Apps auf benutzerdefinierten ROMs haben. ABER ..... wie funktionieren herunterladbare Videoaufzeichnungs-Apps? Sind sie an jedes Gerät angepasst?

Ist das der Grund, warum es auf Facebook noch keinen Facebook-Poke und Twitter-Vine gibt ???? : P

Scheiße Google, wtf ist mit deiner Kamera-API?

Kennt ANYONE die bewährten Methoden zur Bestimmung der Auflösung und Bildrate für alle mit API 15+ kompatiblen Geräte?

Ist das überhaupt möglich oder schreibe ich benutzerdefinierten Code auf jedem Gerät, das ich teste, und würfle dann einfach den Rest?

Oder sind das Nexus S und das Nexus 7 nur Unfälle?

24
Madhava Jay

Ich habe heute auch ein bisschen mit diesem Problem zu kämpfen.

Stellen Sie zunächst sicher, dass Ihre Berechtigungen richtig eingerichtet sind. Um Videos aufzunehmen, benötigen Sie Folgendes:

<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" />

Zweitens, und dies ist der schwierige Teil, diese Zeile aus dem Tutorial funktioniert nicht mit der Frontkamera!

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

Diese Signatur für CamcorderProfile.get () enthält standardmäßig ein Profil für die rückwärts gerichtete Kamera:

Gibt das Camcorder-Profil für die erste rückwärts gerichtete Kamera des Geräts mit der angegebenen Qualitätsstufe zurück. Ob Das Gerät hat keine rückseitige Kamera, dies gibt null zurück.

Verwenden Sie stattdessen http://developer.Android.com/reference/Android/media/CamcorderProfile.html#get(int,%20int) . Der erste Parameter ist die ID der Kamera, die Sie geöffnet haben, insbesondere die nach vorne gerichtete Kamera.

37
spitzanator

versuchen Sie es mit QUALITY_LOW, da QUALITY_HIGH in der Frontkamera nicht unterstützt wird.

2
user2157737

Ich habe jetzt seit ein paar Stunden mit einem Fehler von -19 zu kämpfen. Die Antwort für mich ist in Madhavas Antwort und insbesondere mCamera.unlock ();

in Kombination mit der ersten Antwort zum Set-Profil, diesem Code 

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

Erlaubt mir, die Frontkamera auszuwählen und aufzunehmen. 

1
Tim Smith

sie sollten hier suchen http://developer.Android.com/guide/topics/media/camera.html#capture-video

die Reihenfolge der dort aufgeführten Befehle ist sehr wichtig.

ich habe das zweite Beispiel für den Code hier verwendet Wie kann ich eine Videoaufnahme auf Android aufnehmen?

und die Startaufnahmefunktionen geändert

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

Ich hatte das gleiche Problem. Nachdem ich behoben hatte, was die Ursache war, fand ich nur 1 Täter., 720 × 480-Auflösung, was in der Kamera voreingestellt ist. Ich habe es zu irgendetwas geändert und ja, ich kann es gut aufnehmen.

0
Ankushkushal