CameraX学习2-关于录像、慢动作录像
CameraX实现录像
首先在起预览时就要配置录像usecase,对于cameraX来说就是绑定录像usecase到lifecycle。如下。
1,创建Recorder对象,是与 VideoCapture 紧密耦合的 VideoOutput 实现。Recorder可以用来配置录像的分辨率、比例等,还有其他诸如视频编码率、音频源等,作用类似与mediarecorder,但是没mediarecorder能够设置的参数多,关于两者更进一步的思考可以见后文。
不过当前这个不支持对自定义的分辨率进行设置,只支持设置预定的分辨率,同时当前发现也不能设置1:1与full size尺寸。
2,创建 VideoCapture 对象,这个是录像的usecase。通过调用VideoCapture.withOutput(),来将上面的Recorder对象与VideoCapture绑定,返回值就是VideoCapture。
3,绑定到 Lifecycle。
接着就是在开始录像的流程。
1,使用MediaStoreOutputOptions来配置保存下来的视频文件相关参数,例如路径、格式、文件名等。
2,通过Recorder.prepareRecording来获取PendingRecording这个中间类,最终在其上再调用start()开始录像,start()会返回Recording对象。start()会传入一个Consumer<VideoRecordEvent>,录像回调处理就是在这里。VideoRecordEvent存放了录像状态信息,可以在录像回调中读取进行处理。
3,停止录像时就用Recording.stop()。
4,暂停、恢复录像用Recording.pause()、Recording.resume()。
cameraX实现慢动作录像
官方没有提供跟camera2一样可以在相机侧就实现的慢动作录像的API,再一次说明cameraX只能实现简单版的相机。
不过从网上了解到有几种方案:
1)使用videocapture录制,在录制时设置录像帧率为高帧率,比如120FPS,在停止录像时将已经生成的视频文件通过ffmpeg的命令处理来将视频设定为四分之一速率来播放,最终实现在视频播放器播放时用30FPS播放慢动作视频。
2)这种方案在相机侧跟上一种一样,只是没有将视频文件进行速率转换,改成在播放器侧,通过mediaplayer类来控制播放速率。这种方式相对来说兼容性差,相机侧、视频播放器侧都需要修改。
3)mediacodec处理视频编码与帧率调整。
这里采用了第一种方式来实现。
关键点就是在需要用到以下在相机侧设置高帧率。
Range<Integer> targetFrameRate = new Range<>(120, 120);
mVideoCapture = new VideoCapture.Builder<Recorder>(mRecorder).setTargetFrameRate(targetFrameRate).build();
在最终生成临时的inputPath文件后,再通过ffmpeg命令来转化输出到outputPath
public static void convertToSlowMotion(String inputPath,String outputPath) {
String cmd = "-i " + inputPath + " -filter:v \"setpts=4.0*PTS\" " + " -an " + outputPath;//add -an to remove the audio stream.
FFmpegKit.executeAsync();
}
这里的cmd解释如下:
-filter:v "setpts=4.0*PTS":调整视频帧的时间戳,使得视频播放速度变为原来的四分之一。
-an:这个选项告诉 FFmpeg 不要包含任何音频流,从而确保输出文件中没有任何音频。
实测,该方案可以实现需求。后两种方案等后续再实现试试。
Recorder与Mediarecorder区别
CameraX使用到的recorder类,实现的功能类似于camera2常用到的mediarecorder,不过两者又有挺大差别。
通过查看源码分析,我们可以有以下的简单结论。
recorder专注于视频文件音视频参数相关的,像视频码率、音频采样率等,都有对应接口可以调用进行相关参数设置。而mediarecorder不止这些,还包括一些视频文件保存需要定义的参数,比如文件路径、文件大小限制、文件位置信息。这些文件相关的,cameraX提供了另一个类MediaStoreOutputOptions来处理相关的配置。一般来说,我们实现文件配置相关的功能在MediaStoreOutputOptions、mediarecorder有一一对应的接口。如设置视频文件大小限制的MediaStoreOutputOptions.setFileSizeLimit()与mediarecorder.setMaxFileSize()。
附上源码。
相关文章:
CameraX学习2-关于录像、慢动作录像
CameraX实现录像 首先在起预览时就要配置录像usecase,对于cameraX来说就是绑定录像usecase到lifecycle。如下。 1,创建Recorder对象,是与 VideoCapture 紧密耦合的 VideoOutput 实现。Recorder可以用来配置录像的分辨率、比例等,还…...
Java链接redis
一、准备工作就像谈恋爱 首先咱们得来点仪式感是不是?打开你的Maven(Gradle玩家别打我),把这两个宝贝依赖给我焊死在pom.xml里: <!-- 经典永不过时的Jedis --> <dependency> <groupId>redis.cli…...
2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB
一、基于RRT的优化器 基于RRT的优化器(RRT-based Optimizer,RRTO)是2025年提出的一种新型元启发式算法。其受常用于机器人路径规划的快速探索随机树(RRT)算法的搜索机制启发,首次将RRT算法的概念与元启发式…...
VBA 数据库同一表的当前行与其他行的主键重复判断实现方案
目的,判断是否主键重复,不重复则登录新数据,重复则不登录。 定义类型: DataRecord tableName 表名 rowNumber 行号 columnName 列名 data 数据 想要实现的代码逻辑如下: 模拟数据库的登录过程。假设…...
DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!
从央视到地方媒体,已有多家媒体机构推出AI主播,最近杭州文化广播电视集团的《杭州新闻联播》节目,使用AI主持人进行新闻播报,且做到了0失误率,可见AI正在逐渐取代部分行业和一些重复性的工作,这一现象引发很…...
android为第三方提供部分系统接口
文章目录 Settings - 亮灭屏Settings - 恢复出厂设置Settings - 数字锁屏/解锁Settings - 设置系统时间PackageInstaller - 安装/卸载第三方应用摘要:本文对系统模块进行改造,提供广播等形式的接口对外提供无法直接调用的系统级别接口,实现部分功能的集合。如果是广播形式,…...
Android 自定义View 加 lifecycle 简单使用
前言 本文是自定义view中最简单的使用方法,分别进行 ‘onMeasure’、‘onDraw’、‘自定义样式’、‘lifecycle’的简单使用,了解自定义view的使用。 通过lifecycle来控制 动画的状态 一、onMeasure做了什么? 在onMeasure中获取view 的宽和…...
在K8S中,svc底层是如何实现的?
在Kubernetes中,Service是集群内部的一个抽象层,用于定义一组Pod的逻辑分组,并提供统一的访问入口点,同时还可以对这些Pod提供负载均衡和网络代理功能。Service底层的实现主要包括以下几个关键组件和技术: 标签选择器…...
Python pyqt小技巧:默认打开某文件(即自动加载某文件)
文章目录 前言 前言 有的时候需要界面自动加载某文件。不需要人为在打开选择。 import os #自带 import sys # 获取该程序当前文件目录dir_name os.path.dirname(os.path.realpath(sys.argv[0])) f1 os.path.join(dir_name, 题目调度规程.xls) # 拼接路径 文件必须和程序在…...
vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components
1.使用ant-design-vue或者element-ui时,如何每个组件都去import导入组件,大大降低了开发效率,如果全局一次性注册会增加项目体积,那么如何实现既不局部引入,也不全局注册? 2.在element-plus官网看到有说明…...
C++第十节:map和set的介绍与使用
【本节要点】 1.关联式容器2.键值对3.map介绍与使用4.set介绍与使用5.multimap与multisedd的介绍与使用 一、关联式容器:数据管理的核心利器 关联式容器是STL中用于高效存储和检索键值对(key-value pair)的数据结构,其底层基于红黑…...
线性代数笔记28--奇异值分解(SVD)
1. 奇异值分解 假设矩阵 A A A有 m m m行 n n n列 奇异值分解就是在 A A A的行向量上选取若干对标准正交基,对它作 A A A矩阵变化并投射到了 A A A的列空间上的正交基的若干倍数。 A v → u → σ u → ∈ R m v → ∈ R n A\overrightarrow{v}\overrightarrow{u…...
【从零开始学习计算机科学】硬件设计与FPGA原理
硬件设计 硬件设计流程 在设计硬件电路之前,首先要把大的框架和架构要搞清楚,这要求我们搞清楚要实现什么功能,然后找找有否能实现同样或相似功能的参考电路板(要懂得尽量利用他人的成果,越是有经验的工程师越会懂得借鉴他人的成果)。如果你找到了的参考设计,最好还是…...
项目中同时使用Redis(lettuce)和Redisson的报错
温馨提示:图片有点小,可以放大页面进行查看... 问题1:版本冲突 直接上图,这个错表示依赖版本不匹配问题,我本地SpringBoot用的是2.7,但是Redisson版本用的3.32.5。 我们通过点击 artifactId跟进去 发现它…...
leetcode-数组
26. 删除有序数组中的重复项 已解答 简单 相关标签 相关企业 提示 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…...
人工智能里的深度学习指的是什么?
深度学习(Deep Learning, 简称DL)是机器学习领域的一个重要分支,它通过构建和训练深层神经网络模型,从大量数据中自动学习和提取特征,以实现复杂任务的自动化处理和决策。以下是关于深度学习的详细介绍: 一…...
docker本地部署ollama
启动ollama容器 1.使用该命令启动CPU版运行本地AI模型 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 2.此命令用于启动GPU版本运行AI模型 前提是笔记本已配置NVIDIA的GPU驱动,可在shell中输入nvidia-smi查看详细情况…...
LangChain构建语言模型驱动应用的强大框架
LangChain 核心功能与组件链(Chains)记忆(Memory)提示模板(Prompts)代理(Agents)数据检索(Indexes) 应用场景文档问答自动化工作流知识管理系统 发展历程总结…...
2025-03-08 学习记录--C/C++-PTA 习题10-2 递归求阶乘和
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h>double fact( int n ); double facts…...
浅谈 DeepSeek 对 DBA 的影响
引言: 在人工智能技术飞速发展的背景下,DeepSeek 作为一款基于混合专家模型(MoE)和强化学习技术的大语言模型,正在重塑传统数据库管理(DBA)的工作模式。通过结合其强大的自然语言处理能力、推理…...
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量?
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量? 在物联网和分布式系统架构中,消息传输的可靠性往往直接关系到业务逻辑的正确性。MQTT协议作为轻量级发布/订阅模式的通信标准,其QoS(服务质量࿰…...
手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境(Ubuntu 20.04版)
手把手教你用ROS2和ZED2 SDK搭建3D视觉开发环境(Ubuntu 20.04版) 在自动驾驶、增强现实和机器人导航等领域,3D视觉感知已成为核心技术之一。ZED2相机凭借其双目深度感知能力和高精度SLAM算法,成为开发者构建空间智能系统的首选传感…...
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验
保姆级教程:MogFace人脸检测模型-large快速上手,无需代码轻松体验 1. 认识MogFace人脸检测模型 1.1 什么是MogFace MogFace是目前最先进的人脸检测方法之一,在Wider Face六项榜单上长期保持领先地位。这个模型通过三个创新点显著提升了检测…...
Vivado初始化设计慢?可能是这3个隐藏设置惹的祸
Vivado初始化设计慢?可能是这3个隐藏设置惹的祸 当你在深夜赶项目进度,Vivado却卡在"Initializing Design"界面转圈超过15分钟,那种焦虑感堪比考试时笔没水。作为Xilinx FPGA开发的核心工具,Vivado的初始化速度直接影响…...
MySQL服务启动失败:NET HELPMSG 3534错误全面解析与实战解决方案
1. 遇到NET HELPMSG 3534错误时该怎么办 当你兴致勃勃地安装完MySQL,准备大干一场时,突然在命令行输入net start mysql后,屏幕上跳出"MySQL服务无法启动。服务没有报告任何错误。请键入NET HELPMSG 3534以获得更多的帮助"这样的提…...
Mac 版 SSH 登录脚本
Mac 版 SSH 登录脚本 整合原有编码机器人 + 新增飞书运营机器人,分区域展示、带完整名称/备注/专线IP,一键登录,Mac 专属、直接可用! 前置准备(仅执行1次) brew install sshpass完整脚本(复制保存为 robot_ssh.sh) #!/bin/bash # Mac 专用 - 编码机器人 + 飞书机器…...
OpenRocket全栈实战手册:从仿真引擎到航天教育生态构建
OpenRocket全栈实战手册:从仿真引擎到航天教育生态构建 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 价值定位:重新定义航天工程…...
PyTorch实战(38)——深度学习模型可解释性
PyTorch实战(38)——深度学习模型可解释性0. 前言1. PyTorch 模型可解释性2. 训练手写数字分类器3. 可视化模型卷积核4. 可视化特征图小结系列链接0. 前言 在本专栏中,我们已经构建了多种深度学习模型来完成不同任务,包括手写数字…...
从SWF中提取供应链安全控制:JPEXS Free Flash Decompiler安全研究
从SWF中提取供应链安全控制:JPEXS Free Flash Decompiler安全研究 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler JPEXS Free Flash Decompiler是一款强大的开源工具&#x…...
从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧
从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧 在模拟电路设计的江湖里,折叠共源共栅(Folded Cascode)放大器就像一位身怀绝技却性格古怪的武林高手——性能强悍但极难驯服。许多工…...
