如何从应用程序后台录制视频:Android

2024-03-21

我正在开发一个应用程序,它将能够通过使用从应用程序后台录制视频Service.

问题描述 :


1-我创建了一个活动来启动服务,如下所示:

package com.android.camerarecorder;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class CameraRecorder extends Activity implements SurfaceHolder.Callback {
    private static final String TAG = "Recorder";
    public static SurfaceView mSurfaceView;
    public static SurfaceHolder mSurfaceHolder;
    public static Camera mCamera ;
    public static boolean mPreviewRunning;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        Button btnStart = (Button) findViewById(R.id.StartService);
        btnStart.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Intent intent = new Intent(CameraRecorder.this, RecorderService.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startService(intent);
                finish();
            }
        });

        Button btnStop = (Button) findViewById(R.id.StopService);
        btnStop.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                stopService(new Intent(CameraRecorder.this, RecorderService.class));
            }
        });
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
}

2 - 现在我已经创建了在后台录制视频的服务像这样:

    package com.android.camerarecorder;
    import java.io.IOException;
    import java.util.List;
    import android.app.Service;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.Size;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.Toast;

    public class RecorderService extends Service {
        private static final String TAG = "RecorderService";
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private static Camera mServiceCamera;
        private boolean mRecordingStatus;
        private MediaRecorder mMediaRecorder;
        
        @Override
        public void onCreate() {
            mRecordingStatus = false;
            //mServiceCamera = CameraRecorder.mCamera;
            mServiceCamera = Camera.open(1);
            mSurfaceView = CameraRecorder.mSurfaceView;
            mSurfaceHolder = CameraRecorder.mSurfaceHolder;
            
            super.onCreate();
            if (mRecordingStatus == false)
                startRecording();
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void onDestroy() {
            stopRecording();
            mRecordingStatus = false;
            
            super.onDestroy();
        }   
    
        public boolean startRecording(){
            try {
                Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show();
                
                //mServiceCamera = Camera.open();
                Camera.Parameters params = mServiceCamera.getParameters();
                mServiceCamera.setParameters(params);
                Camera.Parameters p = mServiceCamera.getParameters();
                
                final List<Size> listSize = p.getSupportedPreviewSizes();
                Size mPreviewSize = listSize.get(2);
                Log.v(TAG, "use: width = " + mPreviewSize.width 
                            + " height = " + mPreviewSize.height);
                p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
                p.setPreviewFormat(PixelFormat.YCbCr_420_SP);
                mServiceCamera.setParameters(p);
    
                try {
                    mServiceCamera.setPreviewDisplay(mSurfaceHolder);
                    mServiceCamera.startPreview();
                }
                catch (IOException e) {
                    Log.e(TAG, e.getMessage());
                    e.printStackTrace();
                }
                
                mServiceCamera.unlock();
                
                mMediaRecorder = new MediaRecorder();
                mMediaRecorder.setCamera(mServiceCamera);
                mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
                mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
                mMediaRecorder.setOutputFile("/sdcard/video.mp4");
                mMediaRecorder.setVideoFrameRate(30);
                mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
                mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
                
                mMediaRecorder.prepare();
                mMediaRecorder.start(); 
    
                mRecordingStatus = true;
                
                return true;
            } catch (IllegalStateException e) {
                Log.d(TAG, e.getMessage());
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                Log.d(TAG, e.getMessage());
                e.printStackTrace();
                return false;
            }
        }
    
        public void stopRecording() {
            Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show();
            try {
                mServiceCamera.reconnect();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mMediaRecorder.stop();
            mMediaRecorder.reset();
            
            mServiceCamera.stopPreview();
            mMediaRecorder.release();
            
            mServiceCamera.release();
            mServiceCamera = null;
        }
    }

它将在您的 SD 卡中创建一个文件 video.mp4。您可以更改代码以添加更多功能,但基本功能是通过此代码实现的,即在后台录制视频。

注意:我已经通过活动中的按钮单击启动了该服务,但您可以通过任何其他方式启动它,例如广播接收器等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从应用程序后台录制视频:Android 的相关文章

随机推荐

  • 用于初始化数组的 Lambda 表达式

    有没有办法使用简单的 lambda 表达式来初始化数组或集合 就像是 What about this Person persons new Person 15 persons gt return new Person Or I know y
  • 无法加载身份验证插件“caching_sha2_password”[重复]

    这个问题在这里已经有答案了 我收到错误 无法使用 com mysql jdbc Driver 建立与 jdbc mysql localhost 3306 world zeroDateTimeBehavior convertToNull 的连
  • 使用 DAO 进行事务管理

    在我的 Java 应用程序的 DAO 层中 我有两个 DAO 类EmployeeDAO and BankDAO 我需要控制 处理他们的数据库事务 我使用连接池来获取数据库连接 EmployeeDAO 类 public class Emplo
  • Laravel 4 Blade 表单格式化(隐藏输入)

    我有一个 艺术家 资源 在演出路线页面上我有一个表格 我正在使用 Laravel Blade 语法 作为此表单的一部分 我尝试将页面 ID 发送到 Laravel 4 项目的后端 我这样做 Form hidden artist id nul
  • 如何更改 Crashlytics Beta 电子邮件邀请上的应用程序名称

    在 Crashlytics Beta 中 有人知道如何更改电子邮件邀请上的应用程序名称 在应用程序图标下 我的 iOS 发行版来自 Xcode 7 存档 通过 MacOS 上的 Twitter Fabric 菜单栏进行 Xcode 项目的名
  • 订购数据框的奇怪行为

    我有以下数据框 我想按第五列 距离 排序 当我尝试 df order lt df order df 5 我总是收到以下错误消息 Error in order df 5 unimplemented type list in orderVect
  • 当设备即将解锁时会调用哪个方法?

    我想知道在哪里 void unlock 或任何所谓的 当我们 slide to unlock on the LockScreen is 有人有想法吗 试试这些 iOS 4 5 SBAwayController void finishedUn
  • 我应该为每个环境变量使用 configMap 吗?

    我现在正在使用 helm 我的项目是这样的 值 yaml environmentVariables KEY1 VALUE1 KEY2 VALUE2 配置映射 yaml apiVersion v1 kind ConfigMap metadat
  • //什么是路径,它与/有什么不同

    我们知道根目录是 根据posix 还有另一个与 不同的目录 当您 ls 和 ls 时 输出是相同的 就像 stat 一样 但是如果您 cd 和 cd 它们是不同的 尽管目录内容相同 这真的让我很困惑 有人得到答案吗 From Bash FA
  • 当 CDK 定义时,是否可以在本地运行 AWS Step Functions?

    AWS Step Functions 可以使用以下命令在本地 Docker 环境中运行Step Functions 本地 Docker https docs aws amazon com step functions latest dg s
  • Firebug Net 选项卡中报告的读取时间

    请参阅 Firebug 的 网络 选项卡中的屏幕截图 http www scdi org avernet try firefox times png http www scdi org avernet try firefox times p
  • LOCAL_MODULE_TAGS有什么用?

    我想更新包中的 Android mk 文件以构建新包 但我不明白该文件的目的是什么LOCAL MODULE TAGS is 什么是LOCAL MODULE TAGS do 更正 不再建议使用用户标签 反而 Add LOCAL MODULE
  • gitlab - 图标被矩形替换

    我最近安装了 gitlab 似乎所有图标都被矩形替换了 其他一切似乎都工作正常 知道是什么原因造成的吗 edit on another computer I seem to get Korean characters instead of
  • Ruby on Rails 实时搜索(过滤)

    我正在关注 Railscasts Rails ajax 教程并遇到了一些麻烦 实时搜索不起作用 我必须单击搜索按钮才能获取结果 我有两个搜索过滤器 第一个是 select tag 第二个是一个复选框 这是我的代码 结果 html erb t
  • 默认启动项目由什么决定?

    我有一个包含 Visual Studio 项目文件的开源项目 有一个包含四个项目文件的解决方案文件 当源文件被分发和解压时 Visual Studio 选择错误的项目作为默认项目 新用户不知道他们需要右键单击某个项目 然后选择设置为启动项目
  • Kendo Grid 导出到 Excel 时出错“无法读取 jQuery.js 文件中未定义的属性‘长度’”

    我正在尝试将剑道网格导出到 Excel 然后我在控制台中出现错误 如果有人知道的话请帮助我 提前致谢 angular js 13920 TypeError Cannot read property length of undefined a
  • 向我的免费 G​​itHub 帐户添加协作者?

    我创建了一个 GitHub 帐户 我想授予某人写入权限 以便他可以像我一样进行推送 有没有办法通过免费计划添加协作者 如果没有 我能做什么 除了购买付费帐户 这是我将来会做的 Go to Manage Access设置下的页面 https
  • 如何将旧式 Windows 图元文件写入文件

    我可以生成旧的 未增强的 图元文件 如何将其写入磁盘 使其成为正确的 wmf 文件 佩措尔德没有提到这一点 http www user tu chemnitz de heha petzold ch18b htm 但是将图元文件写入磁盘有一个
  • PHP 比较字符串是否(几乎)相等

    我需要比较可以用多种方式书写的名称 例如 像 St Thomas 这样的名字有时会写成 St Thomas 或 Sant Thomas 最好 我希望构建一个函数 为比较提供 平等 的百分比 就像一些论坛所做的那样 这篇文章已编辑 5 例如
  • 如何从应用程序后台录制视频:Android

    我正在开发一个应用程序 它将能够通过使用从应用程序后台录制视频Service 问题描述 1 我创建了一个活动来启动服务 如下所示 package com android camerarecorder import android app A