Estoy escribiendo una aplicación de cámara y estoy teniendo un problema con el S3. Cada vez que comienzo a grabar, la pantalla se va a la basura (ver capturas de pantalla a continuación). Entonces, cuando deje de grabar me sale una excepción:La visualización de video está distorsionada al grabar en Galaxy S3
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)
He probado mi aplicación en el Galaxy Nexus (4.1), Galaxy S2, Nexus S y Galaxy Tab 10.1. Todos ellos funcionan bien. Seguí development guidelines for video recording. No entiendo por qué este dispositivo es tan diferente de los demás. Esto es lo que estoy viendo en el dispositivo. La primera imagen es antes de comenzar a grabar. La segunda imagen es lo que sucede una vez que comienzo a grabar.
Aquí está mi código para preparar y poner en marcha el objeto MediaRecorder
:
@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();
}
}
Editar: Así que esto tiene algo que ver con que se establezca el CamcorderProfile
. Lo cambio a CamcorderProfile.QUALITY_LOW
y funcionó bien. Entonces, ¿cómo puedo tener video de alta resolución sin una salida distorsionada?
Edit2: Así que con CamcorderProfile.QUALITY_LOW
conjunto, no consigo ningún error al utilizar la grabadora de video. Sin embargo, el video de salida se ve muy similar a la captura de pantalla ilegible publicada anteriormente. Entonces, ¿qué da?
venderlo como iOS6-mapa-como aplicación de la cámara – axis
Google informe de error: http://code.google.com/p/android/issues/detail?id=38139&thanks=38139&ts=1349306102 –
@JasonRobinson ¿Por qué cerraron el informe de error? Podría al menos apuntar en otra dirección o algo así. Eso es perezoso. – ShadowScripter