使用MediaRecorder api在Android中进行屏幕录制

时间:2015-10-16 22:34:59

标签: android mediarecorder android-mediarecorder android-mediaprojection

嘿我正在尝试使用mediarecorder api在android lolipop中录制一个截屏视频应用。问题是我的申请表现得很奇怪。每当我在VideoRecorder类上调用开始录制时,即使对视频大小和输出文件等配置进行硬编码,手机也会重新启动。该应用程序优先工作正常 - 将东西保存在正确的位置,视频本身看起来很好,但后来我在代码中改变了一些东西,现在它不起作用。知道我错过了什么吗? 这是我的代码:

public class VideoRecorder {
private int screenDensity, screenHeight, screenWidth;
private MediaRecorder mMediaRecorder;
private VirtualDisplay mVirtualDisplay;
private MediaProjection mediaProjection;
private String directory, filename;
private Display defaultDisplay = null;
private DisplayMetrics metrics;

public VideoRecorder(Display defaultDisplay) {
    //this.defaultDisplay = defaultDisplay;
    //metrics = new DisplayMetrics();
    //defaultDisplay.getMetrics(metrics);
    //screenDensity = metrics.densityDpi;
   // screenHeight = metrics.heightPixels;
   // screenWidth = metrics.widthPixels;
}

void prepareVideoRecorder() {
    initRecorder();
    prepareRecorder();
}

private void initRecorder() {
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(540, 888);
   // mMediaRecorder.setOutputFile(directory + "/" + filename + ".mp4");
     mMediaRecorder.setOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsoluteFile() + "/recorderrsr.mp4");

}

void startRecording(MediaProjection mediaProjection) {
    mMediaRecorder = new MediaRecorder();
    initRecorder();
    prepareRecorder();
    this.mediaProjection = mediaProjection;
    mMediaRecorder.start();
    mVirtualDisplay = createVirtualDisplay();
}

private VirtualDisplay createVirtualDisplay() {
    return mediaProjection.createVirtualDisplay("MainActivity",
            540, 888, 240,
            DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
            mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
}

void setFilename(String filename) {
    this.filename = filename;
}

void setDirectory(String directory) {
    this.directory = directory;
}

void stopRecording() {
    mMediaRecorder.stop();
    mMediaRecorder.reset();
    if (mediaProjection != null) {
        mediaProjection.stop();
        mediaProjection = null;
    }
    if (mMediaRecorder != null) {
        mMediaRecorder.release();
        mMediaRecorder = null;
    }
    if (mVirtualDisplay != null) {
        mVirtualDisplay.release();
    }

}


private void prepareRecorder() {
    try {
        mMediaRecorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

void release() {
    mMediaRecorder.release();
}

}

我确定该位置存在且我拥有正确的权限 - 正如我之前所说的应用程序工作正常。 谢谢你的帮助Jon

0 个答案:

没有答案