2012-10-02 12 views
5

Ich schreibe eine Kamera-App und habe ein Problem mit dem S3. Wenn ich mit der Aufnahme beginne, geht die Anzeige in den Müll (siehe Screenshots unten). Dann, als ich die Aufnahme zu stoppen erhalte ich eine Ausnahme:Video-Display ist bei der Aufnahme auf Galaxy S3 verzerrt

10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007 
10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM 
10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thread exiting with uncaught exception (group=0x40c49a68) 
10-02 13:36:31.647: E/AndroidRuntime(24283): FATAL EXCEPTION: main 
10-02 13:36:31.647: E/AndroidRuntime(24283): java.lang.RuntimeException: stop failed. 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.native_stop(Native Method) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.stop(MediaRecorder.java:742) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.stopRecording(NewCameraActivity.java:178) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.toggleRecording(NewCameraActivity.java:189) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.onClick(NewCameraActivity.java:97) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View.performClick(View.java:3565) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View$PerformClick.run(View.java:14165) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.handleCallback(Handler.java:605) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Looper.loop(Looper.java:137) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.app.ActivityThread.main(ActivityThread.java:4514) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invokeNative(Native Method) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invoke(Method.java:511) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
10-02 13:36:31.647: E/AndroidRuntime(24283): at dalvik.system.NativeStart.main(Native Method) 

ich meine App auf dem Galaxy Nexus getestet haben (4.1), Galaxy S2, Nexus S und Galaxy Tab 10.1. Alle von ihnen funktionieren gut. Ich habe development guidelines for video recording gefolgt. Ich verstehe nicht, warum dieses Gerät so anders ist als die anderen. Hier ist, was ich auf dem Gerät sehe. Das erste Bild ist bevor ich mit der Aufnahme beginne. Zweites Bild ist was passiert, wenn ich mit der Aufnahme beginne.

Before I've started recording

After I start recording

Hier ist mein Code für die Vorbereitung und Start der MediaRecorder Objekt:

@Override 
public void onClick(View v) { 

    switch (v.getId()) { 
     case R.id.camera_action_ImageView: 
      int mode = getMode(); 
      if (mode == MODE_PHOTO) { 
       focusThenTakePicture(); 
      } 
      else if (mode == MODE_VIDEO) { 
       toggleRecording(); 
      } 
      break; 
    } 
} 

private void startRecording() { 

    if (prepareRecorder()) { 
     getRecorder().start(); 
     setRecording(true); 
    } 
} 

@TargetApi(9) 
private boolean prepareRecorder() { 

    Camera camera = getCamera(); 
    camera.unlock(); 

    MediaRecorder recorder = new MediaRecorder(); 
    setRecorder(recorder); 
    recorder.setCamera(camera); 
    recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    CamcorderProfile profile; 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
     profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    } 
    else { 
     profile = CamcorderProfile.get(getCameraId(), CamcorderProfile.QUALITY_HIGH); 
    } 
    recorder.setProfile(profile); 

    File outputFile = LocalMediaUtil.getOutputMediaFile(LocalMediaUtil.MEDIA_TYPE_VIDEO); 
    setRecorderOutputFile(outputFile); 
    recorder.setOutputFile(outputFile.toString()); 
    recorder.setPreviewDisplay(getPreview().getHolder().getSurface()); 

    try { 
     recorder.prepare(); 
    } 
    catch (Exception e) { 
     camera.lock(); 
     setRecorder(null); 
     return false; 
    } 

    return true; 
} 

private void stopRecording() { 

    MediaRecorder recorder = getRecorder(); 
    recorder.stop(); 
    releaseRecorder(); 
    setRecording(false); 

    LocalMediaUtil.scanMedia(this, getRecorderOutputFile().toString(), 90); 
    setRecorderOutputFile(null); 
} 

private void toggleRecording() { 

    if (isRecording()) { 
     stopRecording(); 
    } 
    else { 
     startRecording(); 
    } 
} 

private void releaseRecorder() { 

    MediaRecorder recorder = getRecorder(); 
    if (recorder != null) { 

     recorder.reset(); 
     recorder.release(); 
     setRecorder(null); 

     getCamera().lock(); 
    } 
} 

Edit: Also das hat etwas mit der CamcorderProfile gesetzt wird zu tun. Ich ändere es zu CamcorderProfile.QUALITY_LOW und es hat gut funktioniert. Wie kann ich hochauflösendes Video ohne verzerrte Ausgabe haben?

Edit2: Also mit CamcorderProfile.QUALITY_LOW Satz, bekomme ich keine Fehler der Videorecorder verwenden. Das Ausgabevideo sieht jedoch dem oben abgebildeten, verzerrten Screenshot sehr ähnlich. Also was gibt es?

+3

verkaufen es als iOS6-map-like Kamera-App – axis

+1

Google Bug-Report: http://code.google.com/p/android/issues/detail?id=38139&thanks=38139&ts=1349306102 –

+0

@JasonRobinson Warum sie geschlossen hat der Fehlerbericht? Könnte dich wenigstens in eine andere Richtung weisen oder so. Das ist einfach faul. – ShadowScripter

Antwort

10

Ich hatte ein ähnliches Problem, und schließlich herausgefunden, es war aufgrund der Freigabe der Vorschau Oberfläche zwischen der Kamera und dem Medienrekorder (ich bin mir nicht sicher, dass dies tatsächlich die zugrunde liegende Ursache ist, aber von den API-Aufrufe scheint es Weg).

Ich nehme an, Sie haben bereits die Kamera geöffnet und an eine Vorschauanzeige, wenn dies der Fall versuchen Sie die folgenden Zeilen an der Spitze Ihres prepareRecorder Methode einfügen:

Camera camera = getCamera(); 
camera.stopPreview(); 
camera.lock(); 
camera.release(); 

camera = Camera.open(); 
camera.unlock(); 

Sie auch neu zuweisen müssen möglicherweise die Kamera lokal auf dem Feld versteckt hinter getCamera(), leider kann ich nicht sagen, wie Sie es mit dem gegebenen Code-Snippet implementiert haben.

Hoffe, das hilft.

+0

Super! Funktioniert hervorragend auf Huawei U8800 mit benutzerdefinierten ICS. –

+0

Arbeitete für mich auf Galaxy S3. Vielen Dank! –

+0

Lebensretter. Vielen Dank! –

1

Ich hatte ein ähnliches Problem mit einem Samsung Note. Mein Problem war, dass die Vorschau in einer Auflösung eingestellt wurde und die Aufnahme in einer anderen größeren Auflösung (Auflösung, die von meinem Handy nicht unterstützt wurde) eingestellt wurde, und deshalb sah es so aus. Sie sollten versuchen:

recorder.setVideoSize(320, 240);

Wenn es funktioniert, dann bedeutet es, Ihre ursprüngliche Auflösung nicht/

0

Dies unterstützt wurde, weil Vorbetrachtungentschließung und Mediarecorder Auflösungen unterschiedlich sind (und sie können auf die je unterschiedlich sein Gerät, aber auf einigen Geräten scheint es ein Problem zu verursachen).

Überprüfen Sie die Android-Kamera-App, es stoppt nicht die Vorschau und starten Sie dann die Aufnahme (Sie können dies überprüfen, indem Sie den Blitz an, wenn Sie die Vorschau stoppen und dann starten, wird der Blitz aus- und wieder eingeschaltet, während in der Android-Kamera-App das nicht passiert).

Die "akzeptierte" Antwort funktioniert hier nur, weil die Kamera die Vorschauoberfläche freigibt und der Mediarecorder die Auflösung dann auf eine der Medienaufzeichnungsauflösungen einstellen kann, aber technisch nicht korrekt.

+0

Weitere Untersuchungen zu diesem Thema machen das Ganze komplexer. Es ist nicht nur ein Abgleich der Auflösung, sondern auf der Ebene des Treibers scheinen bestimmte Vorschauauflösungen nicht genau das zu berücksichtigen, was scheinbar derselbe Aspekt oder dieselbe Zoomstufe wie die gleiche Aufzeichnungsauflösung ist. Dies kann zu einer Anpassung der Verzerrung oder der scheinbaren Änderung der "Zoomstufe" beim Drücken der Aufnahme führen. Die Vorschau zu stoppen, wie von Stuart Ervine vorgeschlagen, funktioniert, aber ich denke immer noch, dass es sich eher um eine Lösung als um eine richtige Lösung handelt. – modernPrimitive

+0

Großartig, um den wahren Grund dafür zu sehen, dass dies unbedeckt geschieht ... Haben Sie ein Codebeispiel für eine geeignete Lösung? Es wäre schön, nicht aufhören zu müssen und die Kamera zu starten! –

Verwandte Themen