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.
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?
verkaufen es als iOS6-map-like Kamera-App – axis
Google Bug-Report: http://code.google.com/p/android/issues/detail?id=38139&thanks=38139&ts=1349306102 –
@JasonRobinson Warum sie geschlossen hat der Fehlerbericht? Könnte dich wenigstens in eine andere Richtung weisen oder so. Das ist einfach faul. – ShadowScripter