Android - 录制视频后停止和重置相机时的致命信号 11

Posted

技术标签:

【中文标题】Android - 录制视频后停止和重置相机时的致命信号 11【英文标题】:Android - Fatal Signal 11 when stopping and resetting camera after recording video 【发布时间】:2016-08-15 07:58:00 【问题描述】:

我目前有一个正在尝试录制视频的应用程序,使用以下方法来初始化相机:

private void initRecorder(Surface surface) throws IOException 
    if (mCamera == null) 
        mCamera = Camera.open();
        mCamera.unlock();
    

    if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setPreviewDisplay(surface);
    mMediaRecorder.setCamera(mCamera);

    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(640, 480);
    mMediaRecorder.setOutputFile(videoFile);

    try 
        mMediaRecorder.prepare();
     catch (IllegalStateException e) 
        e.printStackTrace();
    

    initSuccess = true;

当我尝试停止摄像头或调用surfaceDestroyed 时,我调用以下方法:

private void resetCamera()  
    mMediaRecorder.stop();
    mMediaRecorder.reset();
    mMediaRecorder.release();
    mCamera.release();

    mCamera = null;

    try 
        initRecorder(mHolder.getSurface());
     catch (IOException e) 
        e.printStackTrace();
    

但是,在这段代码的某处,我收到了致命信号 11 错误。显然该代码试图非法访问一部分内存。

我想知道如何解决这个错误?

这是从我开始录制视频到我停止录制的 Logcat 转储:

D/dalvikvm: GC_FOR_ALLOC freed 1309K, 27% free 7434K/10168K, paused 9ms, total 9ms
I/dalvikvm: Could not compile trace for Ljava/util/Arrays;fill, offset 5
I/dalvikvm: ++++++++++++++++++++++++++++++++++++++++++++
I/dalvikvm: JIT_INFO: ME Issues while compiling trace  Ljava/util/Arrays;fill, offset 5
I/dalvikvm: The trace provoked a spill.
I/dalvikvm: Trying less registerization from 1 to 0
D/dalvikvm: GC_FOR_ALLOC freed 1415K, 27% free 7438K/10168K, paused 10ms, total 10ms
A/libc: Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 13774 (arch.treadmill3)

【问题讨论】:

发布错误的完整日志(我知道这不是 java 跟踪,但有时其中的其他信息很有用)。 我遇到了完全相同的问题。你解决了吗? 【参考方案1】:

在 mMediaRecorder.release() 之后;你必须写 mMediaRecorder = null;因为 release() 方法似乎很少有错误。 像这样:

if (mMediaRecorder != null) 
        mMediaRecorder.stop();
        mMediaRecorder.reset();
        mMediaRecorder.release();
        mMediaRecorder = null;
    

【讨论】:

以上是关于Android - 录制视频后停止和重置相机时的致命信号 11的主要内容,如果未能解决你的问题,请参考以下文章

Android多媒体功能开发(13)——使用MediaRecorder类录制视频

在 iOS 中使用 AVFoundation 切换相机后视频录制不起作用

如何通过 SDK 在佳能相机上开始/停止视频录制?

在录制视频时处理相机翻转而不停止它反应原生

进入后台时停止相机录制并保存文件

停止视频在WinJS捕捉编程