自定义视频录制屏幕

2023-12-02

我正在尝试实现一个应用程序,该应用程序在启动时使用我的自定义视频录制屏幕自动开始视频录制,并使用我自己的按钮来停止录制和其他按钮。到目前为止,我所做的是设计带有按钮的布局,但如何在后台添加视频录制屏幕..请帮忙。!


这就是我实现它的方法:

public class MainActivity extends Activity implements SurfaceHolder.Callback {
    private MediaRecorder recorder;
    private SurfaceHolder surfaceHolder;
    private CamcorderProfile camcorderProfile;
    private Camera camera;
    boolean recording = false;
    boolean usecamera = true;
    boolean previewRunning = false;
    SurfaceView surfaceView;
    Button btnStart, btnStop;
    File root;
    File file;
    Boolean isSDPresent;
    SimpleDateFormat simpleDateFormat;
    String timeStamp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.activity_main);
        initComs();
        actionListener();
    }

    private void initComs() {
        simpleDateFormat = new SimpleDateFormat("ddMMyyyyhhmmss");
        timeStamp = simpleDateFormat.format(new Date());
        camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
        surfaceView = (SurfaceView) findViewById(R.id.preview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        btnStop = (Button) findViewById(R.id.btn_stop);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        isSDPresent = android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED);

    }

    public static float megabytesAvailable(File f) {
        StatFs stat = new StatFs(f.getPath());
        long bytesAvailable = (long) stat.getBlockSize()
                * (long) stat.getAvailableBlocks();
        return bytesAvailable / (1024.f * 1024.f);
    }



    private void actionListener() {
        btnStop.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (recording) {
                    recorder.stop();
                    if (usecamera) {
                        try {
                            camera.reconnect();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    // recorder.release();
                    recording = false;
                    // Let's prepareRecorder so we can record again
                    prepareRecorder();
                }

            }
        });
    }

    private void prepareRecorder() {
        recorder = new MediaRecorder();
        recorder.setPreviewDisplay(surfaceHolder.getSurface());
        if (usecamera) {
            camera.unlock();
            recorder.setCamera(camera);
        }
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

        recorder.setProfile(camcorderProfile);

        if (camcorderProfile.fileFormat == MediaRecorder.OutputFormat.MPEG_4) {
            recorder.setOutputFile("/sdcard/XYZApp/" + "XYZAppVideo" + ""
                    + new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date())
                    + ".mp4");
        } else if (camcorderProfile.fileFormat == MediaRecorder.OutputFormat.MPEG_4) {
            recorder.setOutputFile("/sdcard/XYZApp/" + "XYZAppVideo" + ""
                    + new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date())
                    + ".mp4");
        } else {
            recorder.setOutputFile("/sdcard/XYZApp/" + "XYZAppVideo" + ""
                    + new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date())
                    + ".mp4");
        }

        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            finish();
        } catch (IOException e) {
            e.printStackTrace();
            finish();
        }
    }

    public void surfaceCreated(SurfaceHolder holder) {
        System.out.println("onsurfacecreated");

        if (usecamera) {
            camera = Camera.open();

            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
                previewRunning = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        System.out.println("onsurface changed");

        if (!recording && usecamera) {
            if (previewRunning) {
                camera.stopPreview();
            }

            try {
                Camera.Parameters p = camera.getParameters();

                p.setPreviewSize(camcorderProfile.videoFrameWidth,
                        camcorderProfile.videoFrameHeight);
                p.setPreviewFrameRate(camcorderProfile.videoFrameRate);

                camera.setParameters(p);

                camera.setPreviewDisplay(holder);
                camera.startPreview();
                previewRunning = true;
            } catch (IOException e) {
                e.printStackTrace();
            }

            prepareRecorder();
            if (!recording) {
                recording = true;
                recorder.start();
            }
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recording) {
            recorder.stop();
            recording = false;
        }
        recorder.release();
        if (usecamera) {
            previewRunning = false;
            // camera.lock();
            camera.release();
        }
        finish();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义视频录制屏幕 的相关文章

随机推荐

  • 用向量移动字符

    我正在自学 pygame 并正在考虑让我的角色能够旋转 然后朝他们面对的方向移动 我可以进行旋转 但无法让角色沿着图像面向的方向移动 代码在 Trinket 上HERE class Bob pygame sprite Sprite def
  • 如何使用函数参数作为变量的一部分?

    这有效 chrome storage local get sizePref function items Get size preferences from storage var sizePref2 items sizePref tops
  • Laravel Eloquent 无法使用复合主键保存模型

    当定义复合主键然后在实例化模型上调用 save 时 会引发异常 ErrorException E UNKNOWN PDO lastInsertId expects parameter 1 to be string array given 错
  • 使用 Java Servlet API 发送 100 继续

    是否可以发送 100 Continue HTTP 状态代码 然后在使用 Java Servlet API HttpServletResponse 处理整个请求后发送一些其他状态代码 我找不到任何明确的 否 答案 尽管 API 似乎不支持它
  • Python 如何打印列表的列表

    我想用下面的代码打印 python 3 x 中的列表列表 但它给出了错误 lol 1 2 3 4 5 6 five six for elem in lol print join elem this is the error I am get
  • cabal 沙箱 v. 全局包数据库

    在 cabal 沙箱内安装时 cabal 仍将使用全局包数据库中的包 特别是来自 Haskell 平台的包 这可能会导致安装冲突 是否可以配置 cabal 来忽略全局包 db 我看到相应的功能已经实现了ghc本身 通过 no global
  • 使用 3D 变换翻转在 IE11 中不起作用(我的不同)

    我研究了 CSS3 3d 变换 最后得到了一些 CSS3 3d 翻转动作的代码 所以它在所有浏览器中都工作正常 除了互联网浏览器 IE11 所以我在 stackoverflow com 上调查了这个问题 我得到了一些解决方案 但不幸的是这些
  • Span 的“ScrollWidth”属性在 Chrome 上不起作用吗?

    我有一个跨度 里面有一些文本 document getElementById span1 scrollWidth 在 Firefox 上返回 100 作为滚动宽度 但 Chrome 仅返回 0 Chrome 不支持这个 scrollWidt
  • 解析sql中的JSON字符串

    我的表中有一列 JSON 字符串 我使用的是 SQL Server 2008 关于如何解析 JSON 字符串并提取特定值的任何想法 这是我的 JSON 字符串 id 1234 name Lasagne al frono descriptio
  • Rails 3.1 link_to 未正确显示确认或销毁

    我一直在研读 Railstutorial org 上的章节并使用 Rails 3 1 3 因为我很疯狂和 或想要挑战 我设法轻松地解决了大多数版本问题 但这个问题困扰了我一段时间 在10 4 2中 Michael Hartl使用以下代码删除
  • 如何像口语一样将数字转换为文本?

    如果值以百万为单位 那么字符串应该是 miliion thousand hundred 我使用了这段代码 但它显示的是百万值 如何解决这个问题 convert to words NSString wordNumber NSNumber nu
  • 如何在未聚焦的 WinForms TextBox/RichTextBox 中显示光标?

    我需要在 WinForms 应用程序的 RichTextBox 控件中显示光标 即使它没有焦点 我怎样才能做到这一点 我只找到了WPF的方法 如何在未聚焦时保持 WPF 文本框选择 您可以使用 WinAPI DllImport user32
  • 有没有什么方法可以获取没有查询字符串的 URL?

    我有一个像这样的网址http localhost dms mduserSecurity UIL index php menu true submenu true pcode 1235 我想获取不带查询字符串的 URL http localh
  • 使用 Node 将文件从一个 AWS S3 存储桶复制到另一个存储桶

    我正在尝试使用 Node js 将文件从 AWS S3 存储桶复制到另一个存储桶 问题是如果文件名没有空格 例如 abc csv 它工作正常 但如果我要复制到的文件的文件名中有空格 例如 abc xyz csv 它抛出以下错误 指定的密钥不
  • Phonegap、textarea不接受输入

    这是一个 Noob Gingrich 的问题 很确定我错过了一些简单的东西 有没有让文本区域在移动设备上工作的技巧 我所说的工作是指接受来自软键盘的文本 我在phonegapbuild 上有一个移动应用程序 在一页上有一个包含文本框和文本区
  • MATLAB 事件和无限休眠或检查循环

    我需要在目录中的文件进入时对其进行数据分析 我想知道如果这样更好 在目录上实现事件监听器 并在激活时启动分析过程 然后让程序永远进入睡眠状态 while true sleep 1e10 end 或者有一个循环轮询更改并做出反应 我个人更喜欢
  • C# 使用唯一的自定义数据 FCM 向设备组发送通知

    我知道我可以提供registration ids将 JSON 请求以字符串数组的形式发送到多个设备 但是 我有一个独特的令牌 我想将其发送给每个人registration ids 如何实现这一目标 而无需简单地循环发送我希望发送到的设备数量
  • 从“后退”按钮中删除文本,保留图标

    我想从后退按钮中删除文本 但我想保留图标 我努力了 let backButton UIBarButtonItem title style UIBarButtonItemStyle Plain target navigationControl
  • 从 Android 到 Web API 的 POST 数据返回 404

    我尝试将数据从 Android 客户端作为 POST 请求发送到我的 Web API 后端 但它返回 404 响应代码 这是我的代码 Backend HttpPost Route api postcomment public IHttpAc
  • 自定义视频录制屏幕

    我正在尝试实现一个应用程序 该应用程序在启动时使用我的自定义视频录制屏幕自动开始视频录制 并使用我自己的按钮来停止录制和其他按钮 到目前为止 我所做的是设计带有按钮的布局 但如何在后台添加视频录制屏幕 请帮忙 这就是我实现它的方法 publ