【问题标题】:Video display is garbled when recording on Galaxy S3在 Galaxy S3 上录制时视频显示乱码
【发布时间】:2012-10-02 18:45:44
【问题描述】:

我正在编写相机应用程序,但遇到了 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)

我已经在 Galaxy Nexus (4.1)、Galaxy S2、Nexus S 和 Galaxy Tab 10.1 上测试了我的应用。他们都工作正常。我关注了development guidelines for video recording。我不明白为什么这个设备与其他设备如此不同。这是我在设备上看到的。第一张照片是在我开始录制之前。第二张图片是我开始录制后发生的情况。

这是我准备和启动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();
    }
}

编辑:所以这与设置的CamcorderProfile 有关。我将其更改为 CamcorderProfile.QUALITY_LOW 并且效果很好。那么如何才能获得没有乱码输出的高分辨率视频呢?

Edit2: 所以设置了CamcorderProfile.QUALITY_LOW,我在使用录像机时不会出错。但是,输出视频看起来与上面发布的乱码截图非常相似。那么是什么给出的呢?

【问题讨论】:

  • 将其作为iOS6-map-like相机应用出售
  • @JasonRobinson 他们为什么关闭错误报告?至少可以将您指向另一个方向或其他东西。那只是懒惰。
  • @ShadowScripter 是的,我认为他们没有阅读描述或其他内容。他以为我在寻求用户支持:-\。我在过去 (10-3) 的 Android 开发人员办公时间内问了这个问题,他们指示我打开错误报告。
  • 我认为谷歌无法修复三星的扭曲实现。很多(如果不是全部)三星设备需要特定的、非标准的、未记录的(至少是英文的)程序来使用相机做一件事或另一件事。 Galaxy K:无法使用功能性前置摄像头(与此问题类似的输出); Galaxy Note:无法使用“高质量”配置文件进行拍摄; Galaxy S2:需要特定的“设置参数”调用才能获得全分辨率工作......如果你没有明白我的意思:你应该与三星手机而不是谷歌交谈。 (如果他们回复了一些有用的信息,请让全世界都知道这个链接!)

标签: android android-camera galaxy android-mediarecorder


【解决方案1】:

我遇到了类似的问题,最后发现这是由于在相机和媒体记录器之间共享预览表面(我不确定这实际上是根本原因,但从 API 调用看来是这样的)。

我假设您已经打开了相机并为其附加了预览显示,如果是这样,请尝试在您的 prepareRecorder 方法的顶部插入以下行:

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

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

您可能还需要将本地相机重新分配给隐藏在 getCamera() 后面的字段,不幸的是,我不知道您是如何使用给定的代码 sn-p 实现它的。

希望这会有所帮助。

【讨论】:

  • 太棒了!在带有自定义 ICS 的华为 U8800 上运行良好。
  • 在 Galaxy S3 上为我工作。谢谢!
  • 此问题与 setPreviewSize 有关。如果您的录制帧大小与预览大小不匹配。它在少数设备上显示垃圾预览。
【解决方案2】:

我在使用三星 Note 时遇到了类似的问题。我的问题是预览设置为分辨率,而录制设置为另一个更大的分辨率(我的手机不支持的分辨率),这就是它看起来像这样的原因。你应该试试:

recorder.setVideoSize(320, 240);

如果有效,则表示您的初始分辨率不受支持/

【讨论】:

    【解决方案3】:

    这是因为预览分辨率和 Mediarecorder 分辨率不同(它们可能因设备而异,但在某些设备上似乎会导致问题)。

    检查 Android 相机应用程序,它不会停止预览然后开始录制(您可以通过保持闪光灯打开来检查这一点,如果您停止预览然后开始录制,闪光灯将关闭然后再次打开,而在 Android 相机应用程序中不会发生)。

    此处的“接受”答案仅适用,因为相机释放预览表面,然后 mediarecorder 可以将分辨率调整为 mediarecorder 分辨率之一,但在技术上并不正确。

    【讨论】:

    • 对这个问题的进一步调查使整个问题变得更加复杂。这不仅是分辨率的匹配,而且在驱动程序级别,某些预览分辨率似乎无法正确尊重与相同录制分辨率看起来相同的方面或缩放级别。这可能会导致在按下记录时调整失真或“缩放级别”的明显变化。按照 Stuart Ervine 的建议停止预览确实有效,但我仍然认为这是一种解决方法,而不是正确的解决方案。
    • 很高兴看到发生这种情况的真正原因被发现...您有正确解决方案的代码示例吗?不必停止和启动相机真是太好了!
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多