MediaRecorder:停止失败 -1007

Posted

技术标签:

【中文标题】MediaRecorder:停止失败 -1007【英文标题】:MediaRecorder: Stop failed -1007 【发布时间】:2017-03-29 17:26:24 【问题描述】:

我已经看到类似的问题,但我没有找到解决方案,所以这就是我问这个的原因。

当我在阿尔卡特手机上运行我的应用程序并开始视频录制时,一切似乎都很好,直到我按下停止按钮,然后我收到RuntimeException。我读到我的视频或音频状态不佳,但我不知道为什么。

这是我的代码:

private boolean prepareMediaRecorder(String name) 

    if (isCameraOpened()) 
        stop();
        start();
    

    mediaRecorder = new MediaRecorder();
    //int orientation = mCameraInfo.orientation;
    //int orientation = calcCameraRotation(mDisplayOrientation);
    int degrees = 0;
    switch (currentOrientation) 
        case Surface.ROTATION_0:
            degrees = 0;
            break;
        case Surface.ROTATION_90:
            degrees = 90;
            break;
        case Surface.ROTATION_180:
            degrees = 180;
            break;
        case Surface.ROTATION_270:
            degrees = 270;
            break;
    

    int result;
    /*if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
        result = (360 - (mCameraInfo.orientation + degrees) % 360) % 360;
     else   // back-facing
        result = (mCameraInfo.orientation - degrees + 360) % 360;
    */
    if(mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) 
        result = (mCameraInfo.orientation - degrees + 360) % 360;
       // mediaRecorder.setOrientationHint(result);
        mediaRecorder.setOrientationHint(result);
     else
        result = (mCameraInfo.orientation + degrees) % 360;
        mediaRecorder.setOrientationHint(result);
    
    Size pictureSize = null;

    SortedSet<Size> sizes = mPreviewSizes.sizes(mAspectRatio);
    if (sizes == null)  // Not supported
        mAspectRatio = chooseAspectRatio();
        sizes = mPreviewSizes.sizes(mAspectRatio);
    

    mPictureSizes.clear();

    for (Camera.Size size : mCameraParameters.getSupportedVideoSizes()) 
        mPictureSizes.add(new Size(size.width, size.height));
    

    Size size = chooseOptimalSize(sizes);

    final Camera.Size currentSize = mCameraParameters.getPictureSize();
    if (currentSize.width != size.getWidth() || currentSize.height != size.getHeight()) 
        // Largest picture size in this ratio
        pictureSize = mPictureSizes.sizes(mAspectRatio).last();
        if (mShowingPreview) 
            mCamera.stopPreview();
        

        if(mCameraParameters.getSupportedPreviewSizes() != null) 
            mCameraParameters.setPreviewSize(size.getWidth(), size.getHeight());
        

        setAutoFocusInternal(mAutoFocus);
        if(mFlash == 1)
            mCameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        
        mCamera.setParameters(mCameraParameters);
        if (mShowingPreview) 
            mCamera.startPreview();
        
     

    mCamera.unlock();

    mediaRecorder.setCamera(mCamera);

    //Set source
    mediaRecorder.setAudiosource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    mediaRecorder.setProfile(cpHigh);
    if(pictureSize != null) 
        mediaRecorder.setVideoSize(pictureSize.getWidth(), pictureSize.getHeight());
    

    mediaRecorder.setOutputFile(name);


    try 
        mediaRecorder.prepare();
        ///mediaRecorder.start();

     catch (IllegalStateException e) 
        releaseMediaRecorder();
        return false;
     catch (IOException e) 
        releaseMediaRecorder();
        return false;
    
    return true;


然后我在 AsyncTask 中启动 MediaRecorder,这是我的停止方法。

@Override
void stopVideo() 
    if(mFlash == 1)
        mCameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
    
    if(isVideoRecording == true) 
        try 
            mediaRecorder.stop();
            isVideoRecording = false;
            releaseMediaRecorder();
            getBackgroundHandler().post(new Runnable() 
                @Override
                public void run() 
                    File file = getFile(name);
                    if (file != null) 
                        ContentValues values = new ContentValues();
                        values.put(MediaStore.Video.Media.TITLE,  file.getName());
                        values.put(MediaStore.Video.Media.DESCRIPTION, "Taken by All Ears Selfie app");
                        values.put(MediaStore.Video.Media.DATE_TAKEN,   System.currentTimeMillis());
                        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
                        values.put(MediaStore.Video.Media.SIZE,  file.length());
                        values.put("_data", file.getAbsolutePath());

                        ContentResolver cr = context.getContentResolver();
                         cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

                    
                
            );
         catch (RuntimeException e)
            Log.d("TAG", e.getMessage());
            File file = getFile(name);
            file.delete();
        

    

    if(isCameraOpened())
        stop();
        start();
    

错误:

11-15 19:37:09.063 15282-15282/com.allearsapp.allearsselfie E/MediaRecorder:停止失败:-1007 11-15 19:37:09.064 15282-15282/com.allearsapp.allearsselfie D/androidRuntime: 关闭虚拟机 11-15 19:37:09.089 15282-15282/com.allearsapp.allearsselfie E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.allearsapp.allearsselfie,PID:15282 java.lang.RuntimeException:停止失败。 在 android.media.MediaRecorder.stop(本机方法) 在 com.google.android.cameraview.Camera1.stopVideo(Camera1.java:314) 在 com.google.android.cameraview.CameraView.stopVideo(CameraView.java:64) 在 com.allearsapp.allearsselfie.camera.CameraActivity.stopVideoRecording(CameraActivity.java:410) 在 com.allearsapp.allearsselfie.camera.CameraActivity.access 300 美元(CameraActivity.java:54) 在 com.allearsapp.allearsselfie.camera.CameraActivity$2.onClick(CameraActivity.java:288) 在 android.view.View.performClick(View.java:4757) 在 android.view.View$PerformClick.run(View.java:19757) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5258) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

编辑:我为媒体记录器添加了OnErrorListener,但出现此错误:268435556。

【问题讨论】:

请添加错误堆栈跟踪 我已经添加了堆栈跟踪。 你是在任何地方开始后立即调用停止方法吗? 我看到可能导致此错误的一件事是预览和视频大小。我想,这个大小必须相等,所以要确保 mCameraParameters.setPreviewSize(size.getWidth(), size.getHeight());mediaRecorder.setVideoSize(pictureSize.getWidth(), pictureSize.getHeight()); 具有相同的值... 有什么解决办法吗?在具有 API 8.1 的三星 Galaxy J7 Prime 中报告了相同的问题,同时获取 -1007 和 268435556 错误代码。找出代码 268435556 所指的内容会有很大帮助,但找不到任何对它的引用。 【参考方案1】:

在我的情况下,我在开始视频录制后收到 268435556 错误,并且只在华为设备上发生过。对我来说,我设法通过使用特定的视频编码器来解决它:mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264)

【讨论】:

以上是关于MediaRecorder:停止失败 -1007的主要内容,如果未能解决你的问题,请参考以下文章

MediaRecorder 在某些设备上启动失败(启动失败:-2147483648 和 -19)

MediaRecorder 实现 setOnInfoListener -max duration

即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败

Android 无法使用前置摄像头录制视频,MediaRecorder 启动失败:-19

从 MIC 录制并流式传输到 TCP 服务器; MediaRecorder:启动失败:-38

Android 使用 MediaRecorder 捕获音频。