【问题标题】:Video Recording on tab (Nexus 7) fails选项卡上的视频录制 (Nexus 7) 失败
【发布时间】:2014-01-18 14:26:23
【问题描述】:

我正在为我的应用程序创建一个录像机功能。我使用以下代码来准备相机和媒体记录器 api:

private boolean prepareCameraRecorder() {
    // BEGIN_INCLUDE (configure_preview)
    int numCameras = Camera.getNumberOfCameras();
    int camId = 0;

    if (numCameras == 1) {
        PackageManager pm = getPackageManager();

        boolean frontCam = pm
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
        boolean rearCam = pm
                .hasSystemFeature(PackageManager.FEATURE_CAMERA);

        if (frontCam) {
            camera = CameraHelper.getDefaultFrontFacingCameraInstance();
            camId = Camera.CameraInfo.CAMERA_FACING_BACK;
        } else if (rearCam) {
            camera = CameraHelper.getDefaultBackFacingCameraInstance();
            camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
        }

    } else if (numCameras == 2) {
        if (CAMERA_TYPE == CAMERA_FRONT) {
            Utils.getInstance().printDebug("displaying front camera ");
            camera = CameraHelper.getDefaultFrontFacingCameraInstance();
            camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
        } else if (CAMERA_TYPE == CAMERA_BACK) {
            Utils.getInstance().printDebug("displaying back camera ");
            camera = CameraHelper.getDefaultBackFacingCameraInstance();
            camId = Camera.CameraInfo.CAMERA_FACING_BACK;
        }
    }

    // We need to make sure that our preview and recording video size are
    // supported by the
    // camera. Query camera to find all the sizes and choose the optimal
    // size given the
    // dimensions of our preview surface.
    parameters = camera.getParameters();
    List<Camera.Size> mSupportedPreviewSizes = parameters
            .getSupportedPreviewSizes();
    Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(
            mSupportedPreviewSizes, cameraView.getWidth(),
            cameraView.getHeight());

    // Use the same size for recording profile.

    // Check profile in tab:

    int profile = -1;

    // set camera profile
    if (CamcorderProfile.hasProfile(camId, CamcorderProfile.QUALITY_HIGH)) {
        profile = CamcorderProfile.QUALITY_HIGH;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_480P)) {
        profile = CamcorderProfile.QUALITY_480P;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_720P)) {
        profile = CamcorderProfile.QUALITY_720P;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_1080P)) {
        profile = CamcorderProfile.QUALITY_1080P;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_CIF)) {
        profile = CamcorderProfile.QUALITY_CIF;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_LOW)) {
        profile = CamcorderProfile.QUALITY_LOW;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_QCIF)) {
        profile = CamcorderProfile.QUALITY_QCIF;
    } else if (CamcorderProfile.hasProfile(camId,
            CamcorderProfile.QUALITY_QVGA)) {
        profile = CamcorderProfile.QUALITY_QVGA;
    }
    //

    CamcorderProfile camProfile = null;
    camProfile = CamcorderProfile.get(camId, profile);

    if (profile != -1) {
        Utils.getInstance().printDebug("profile: " + profile);
        camProfile.videoFrameWidth = optimalSize.width;
        camProfile.videoFrameHeight = optimalSize.height;

        parameters.setPreviewSize(optimalSize.width, optimalSize.height);
        camera.setParameters(parameters);
        parameters = camera.getParameters();
    }
    // else {
    // parameters.setPreviewSize(100, 100);
    // camera.setParameters(parameters);
    // }
    try {
        camera.stopPreview();
        camera.setPreviewCallback(null);
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }

    // set preview size and make any resize, rotate or
    // reformatting changes here

    // start preview with new settings
    try {
        camera.setPreviewDisplay(holder);
        camera.startPreview();
        camera.setDisplayOrientation(90);
    } catch (Exception e) {
        Utils.getInstance().printDebug(
                "Error starting camera preview: " + e.getMessage());
    }
    // BEGIN_INCLUDE (configure_media_recorder)
    mediaRecorder = new MediaRecorder();
    mediaRecorder.reset();

    // Step 1: Unlock and set camera to MediaRecorder
    camera.unlock();
    mediaRecorder.setCamera(camera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    if (profile != -1) {
        mediaRecorder.setProfile(camProfile);
    }

    try {

        // Step 4: Set output file
        selFilePath = CameraHelper.getOutputMediaFile(
                CameraHelper.MEDIA_TYPE_VIDEO).toString();
        mediaRecorder.setOutputFile(selFilePath);
        Utils.getInstance().printDebug("selFilePath: " + selFilePath);

        // Step 5: Prepare configured MediaRecorder
        // if (profile == -1) {
        // mediaRecorder.setVideoFrameRate(30);
        // }

        mediaRecorder.setOrientationHint(90);
        //mediaRecorder.setVideoSize(optimalSize.width, optimalSize.height);
        //mediaRecorder.setVideoFrameRate(10);

        // mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        // mediaRecorder.setAudioEncodingBitRate(192000);
        // mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        // mediaRecorder.setVideoEncodingBitRate(12000000);
        // mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG,
                "IllegalStateException preparing MediaRecorder: "
                        + e.getMessage());
        e.printStackTrace();
        releaseMediaRecorder();
        return false;
    } catch (Exception e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}
private void startVideo(){
 mediaRecorder.start()
}

如果我在手机(移动设备)上运行此代码,它可以正常工作,但在 Nexus 7(平板电脑)上失败 注意:nexus 7 仅提供前置摄像头。

这是错误并且发生了日志:

01-18 19:31:30.597:E/MediaRecorder(25847):启动失败:-19

01-18 19:31:31.647:E/AndroidRuntime(25847):致命异常:main
01-18 19:31:31.647: E/AndroidRuntime(25847): 进程: com.appsplanet.beasting366, PID: 25847
01-18 19:31:31.647: E/AndroidRuntime(25847): java.lang.RuntimeException: 启动失败。
01-18 19:31:31.647: E/AndroidRuntime(25847): at android.media.MediaRecorder.start(Native Method)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 com.appsplanet.beasting366.ActivityVideoRecord.startVideoRecord(ActivityVideoRecord.java:633)
01-18 19:31:31.647: E/AndroidRuntime(25847): at com.appsplanet.beasting366.ActivityVideoRecord.access$6(ActivityVideoRecord.java:620)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 com.appsplanet.beasting366.ActivityVideoRecord$2.onClick(ActivityVideoRecord.java:581)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.view.View.performClick(View.java:4438)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.view.View$PerformClick.run(View.java:18422)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.os.Handler.handleCallback(Handler.java:733)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.os.Handler.dispatchMessage(Handler.java:95)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.os.Looper.loop(Looper.java:136)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 android.app.ActivityThread.main(ActivityThread.java:5017)
01-18 19:31:31.647: E/AndroidRuntime(25847): at java.lang.reflect.Method.invokeNative(Native Method)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 java.lang.reflect.Method.invoke(Method.java:515)
01-18 19:31:31.647: E/AndroidRuntime(25847): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-18 19:31:31.647: E/AndroidRuntime(25847): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-18 19:31:31.647: E/AndroidRuntime(25847): at dalvik.system.NativeStart.main(Native Method)

谁能帮我解决这个问题?

谢谢 伊山耆那教

【问题讨论】:

  • 可以在崩溃前发布日志吗? ActivityVideoRecord.prepareCameraRecorder() 成功完成了吗?为什么日志显示ActivityVideoRecord.startVideoRecord(),而暴露的代码有private void startVideo()ActivityVideoRecord.java 的第 633 行是什么?

标签: android android-camera android-mediarecorder video-recording nexus-7


【解决方案1】:

很遗憾,Android Camera API 不容易理解。有两个intconstants

public final static int Camera.CameraInfo.CAMERA_FACING_BACK = 0;
public final static int Camera.CameraInfo.CAMERA_FACING_FRONT = 1;

还有一些方法,比如 Camera.open() 需要 int cameraId 参数。

但是将上面的常量用于Camera.open()CamcorderProfile.get() 是错误的。 cameraId0 表示第一个摄像头,1 表示第二个摄像头,2 表示第三个摄像头,以此类推,向上到Camera.getNumberOfCameras()-1。您可以通过以下方式检查具有特定 cameraId 的相机的方向

Camera camera = Camera.open(cameraId);
int facing = camera.getCameraInfo().facing();

face 的值保证为Camera.CameraInfo.CAMERA_FACING_BACKCamera.CameraInfo.CAMERA_FACING_FRONT

具体来说,在 Nexus 7 上只有一个摄像头,因此您始终使用cameraId == 0

【讨论】:

    【解决方案2】:

    您确定这里的条件正确吗?

    if (frontCam) {
        camera = CameraHelper.getDefaultFrontFacingCameraInstance();
        camId = Camera.CameraInfo.CAMERA_FACING_BACK;
    } else if (rearCam) {
        camera = CameraHelper.getDefaultBackFacingCameraInstance();
        camId = Camera.CameraInfo.CAMERA_FACING_FRONT;
    }
    

    如果设备只有前置摄像头而不是您使用后置摄像头。

    【讨论】:

    • 是的,实际上我有翻转相机的功能。如果有两个摄像头。如果只有一个摄像头,它就不会进入这种状态。
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2014-05-21
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多