Android 后台录制

关于后台运行的话,应该自己建一个Service,在Service中用MediaRecoder录像。
但是有一个问题需要解决,需要改一下Android源码:
在得到android.hardware.Camera对象后,如果不给Camera设置SurfaceHolder的话,CameraService会报错:
mSurface or mPreviewWindow must be set before startRecordingMode.

可以暂时先把报错的地方 屏蔽掉,或许还有其他更好办法,我还没发现。
报错的地方在: \framework\base\services\camera\libcameraservice\CameraService.cpp
// start preview or recording
status_t CameraService::Client::startCameraMode(camera_mode mode) {
    LOG1("startCameraMode(%d)", mode);
    Mutex::Autolock lock(mLock);
    status_t result = checkPidAndHardware();
    if (result != NO_ERROR) return result;

    switch(mode) {
        case CAMERA_PREVIEW_MODE:
            if (mSurface == 0 && mPreviewWindow == 0) {
                LOG1("mSurface is not set yet.");
                // still able to start preview in this case.
            }
            return startPreviewMode();
        case CAMERA_RECORDING_MODE:
             //zhaoch86 marked for usb camera background recording 
             /*
            if (mSurface == 0 && mPreviewWindow == 0) {
                LOGE("mSurface or mPreviewWindow must be set before startRecordingMode.");
                return INVALID_OPERATION;
            }
            */

            return startRecordingMode();
        default:
            return UNKNOWN_ERROR;
    }
}

如此,编译重新刷包后,就能实现后台录像!
A:以下是一个基本的Android后台屏幕录制代码: ```java public class ScreenRecorder extends Thread { private static final int VIDEO_FRAME_RATE = 30; private static final int VIDEO_BITRATE = 1000000; private static final int VIDEO_I_FRAME_INTERVAL = 10; private static final int VIDEO_WIDTH = 720; private static final int VIDEO_HEIGHT = 1280; private MediaRecorder mMediaRecorder; private Surface mSurface; private boolean mIsRecording; public ScreenRecorder(Surface surface) { mSurface = surface; } @Override public void run() { try { mMediaRecorder = new MediaRecorder(); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.Surface); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT); mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); mMediaRecorder.setVideoEncodingBitRate(VIDEO_BITRATE); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoEncodingBitRate(VIDEO_BITRATE); mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); mMediaRecorder.setVideoIFrameInterval(VIDEO_I_FRAME_INTERVAL); mMediaRecorder.setOutputFile(getOutputFilePath()); mMediaRecorder.prepare(); mMediaRecorder.setInputSurface(mSurface); mMediaRecorder.start(); mIsRecording = true; } catch (Exception e) { Log.e("Screen Recorder", "Screen recording failed: " + e.getMessage()); } } public void stopRecording() { if (mIsRecording) { mMediaRecorder.stop(); mMediaRecorder.release(); mIsRecording = false; } } private String getOutputFilePath() { String directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String currentTimeStamp = dateFormat.format(new Date()); String filename = "Screen Recording - " + currentTimeStamp + ".mp4"; return directory + "/" + filename; } } ``` 首先,我们定义了一些常量,例如视频帧速率、视频编码器、视频宽度和高度等。然后,我们创建了一个`MediaRecorder`对象,并设置了视频源、输出格式、视频编码器、大小、帧速率、码率、I帧间隔和输出文件路径等参数。最后,我们调用`prepare`方法来准备录制,并调用`start`方法开始录制。 要停止录制,我们可以调用`stop`方法和`release`方法来停止和释放`MediaRecorder`对象。 请注意,由于Android限制了在后台录制屏幕的能力,因此您需要在应用程序前台或设备上运行代码。您还需要在manifest文件中声明RECORD_AUDIO和WRITE_EXTERNAL_STORAGE权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值