我尝试在Android 4.0中组织背景视频录制。但是由于这些问题,我无法做到这一点:

  1. Dummy Surface在MediaRecorder中不起作用(错误:表面无效)
  2. 如果您在活动上使用Surface 1 x 1 px,则表面在活动暂停时被销毁(记录已停止)
  3. 如果在WindowsManager上使用Surface 1 x 1 px,则在应用程序暂停时Surface将被销毁(记录已停止)
  4. SurfaceTexture在MediaRecorder.setPreviewDisplay(新Surface(SurfaceTexture))中不起作用
  5. 小部件不允许处理Surface 1 x 1 px
  6. 状态栏不允许处理Surface 1 x 1 px

ywojb10Tywojb10T提问于
逆鳞若光天津大学硕士在读 深度学习 尤文死忠回答于

示例和简单代码:

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback {

    private WindowManager windowManager;
    private SurfaceView surfaceView;
    private Camera camera = null;
    private MediaRecorder mediaRecorder = null;

    @Override
    public void onCreate() {

        // Start foreground service to avoid unexpected kill
        Notification notification = new Notification.Builder(this)
            .setContentTitle("Background Video Recorder")
            .setContentText("")
            .setSmallIcon(R.drawable.ic_launcher)
            .build();
        startForeground(1234, notification);

        // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
        windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        surfaceView = new SurfaceView(this);
        LayoutParams layoutParams = new WindowManager.LayoutParams(
            1, 1,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT
        );
        layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
        windowManager.addView(surfaceView, layoutParams);
        surfaceView.getHolder().addCallback(this);

    }

    // Method called right after Surface created (initializing and starting MediaRecorder)
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

        camera = Camera.open();
        mediaRecorder = new MediaRecorder();
        camera.unlock();

        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        mediaRecorder.setOutputFile(
                Environment.getExternalStorageDirectory()+"/"+
                DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+
                ".mp4"
        );

        try { mediaRecorder.prepare(); } catch (Exception e) {}
        mediaRecorder.start();

    }

    // Stop recording and remove SurfaceView
    @Override
    public void onDestroy() {

        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();

        camera.lock();
        camera.release();

        windowManager.removeView(surfaceView);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {}

    @Override
    public IBinder onBind(Intent intent) { return null; }

}

权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

回答过的其他问题

大数据技术是如何帮助企业运营供应链?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠
大数据对企业也好,还是创业公司也好都有着巨大的影响,大数据技术的运用能够有助于企业更好的了解供应链和风险管理的供应链生态系统。大数据及其分析能够帮助企业了解用户的行为和社会发展趋势。从这个意义上讲,大数据有助于公司在未来事件发生和供应链中断之前主动采取行动并创建方案和做出决策。例...... 展开详请

腾讯云AI有哪些应用?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠
腾讯云AI目前能够支持的领域比较多。包括各种人脸合成、身份证识别、智能监控、人脸轧机还有语音合成、关键词搜索等方面。同时,腾讯云的机器学习的平台可以帮助开发者们快速去实现模型。 朋友圈爆款背后的计算机视觉技术与应用 图像识别领域的发展经历了CNN,R-CNN,Faster R-C...... 展开详请

如何实现数据可视化?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠
大部分的数据可视化的教程, 都会让你轻松地从一个原始数据集开始。无论你是学习基本的柱状图还是力导向的网络图, 你的数据都是干净的,经过整理的数据。 这些完美的JSON或者CSV文件就像电视里的厨艺节目中的灶台那样干净整洁。而实际上, 当你在处理现实中的真正的数据是, 你80%的时...... 展开详请

获取到的备份下载链接,失效(404),后从新刷新接口获取为什么刷新后的的地址没变 还是失效链接?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠

备份的话具体看一下这里https://cloud.tencent.com/document/product/236/11271

小程序报错this.setDate is not a function?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠

文件读取器后如何获取文件名异步加载文件?

逆鳞若光天津大学硕士在读 深度学习 尤文死忠
向文件读取器添加一个属性 for(i=0; i < files.length; i++) { var fileReader = new FileReader(); fileReader.onload = function(file...... 展开详请

关于作者

逆鳞若光

天津大学硕士在读 深度学习 尤文死忠

所属标签

扫码关注云+社区