安卓相机慢动作的软件实现要点

本文首发地址 https://h89.cn/archives/201.html
本文最新更新地址 https://gitee.com/chenjim/chenjimblog

慢动作英文称呼SlowMotion,也就是高帧率录像,如果以正常30帧播放,就能看到慢动作效果,可以用来拍摄快速移动物体的瞬间,比如鱼儿的游动、终点冲刺结果等。本文主要介绍慢动作在安卓相机应用中如何实现。

  1. 获取高速录像支持的尺寸和帧率
    可以通过如下获取支持的 Size 和 FPS
    cameraManager.cameraIdList.forEach { id ->
    val characteristics = cameraManager.getCameraCharacteristics(id)
    val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)!!
    val cameraConfig = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)!!// Return cameras that support constrained high video capability
    if (capabilities.contains(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO)) {// For each camera, list its compatible sizes and FPS rangescameraConfig.highSpeedVideoSizes.forEach { size ->cameraConfig.getHighSpeedVideoFpsRangesFor(size).forEach { fpsRange ->// 这里的 size 和 fpsRange 是 对应的,可以用于后续配流// 实际使用,我们选取其中一对即可}}
    }}
    
  2. 初始化录制 Surface
    这里通过 MediaCodec.createPersistentInputSurface 初始化 Surface ,初始化 MediaRecorder , 设置需要录制 Surface,setVideoSize 为上一步支持的尺寸。
    也可以通过 profile 配置 MediaRecorder,可以通过如下函数判断是否支持,需要底层配置,否则会返回 false .
    CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_HIGH_SPEED_1080P)
  3. 设置预览帧率
    需要通过 CaptureRequest.Builder 设置 CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE
    支持的帧率来自前面获取到的值,这个设置的是预览的帧率,如果跟录制不一致,录制时需要重新配流,一般不这样设计。
  4. 设置编码帧率
    MediaRecorder 需要通过 setVideoFrameRate 设置编码帧率。
    如果想以高帧率保存(HSR),设置为前面的高帧率,录制文件时长等于实际录制时长,MIUI即为此设计,想看慢动作效果需要在图库播放时调整。
    如果想视频以慢动作播放(HFR),即以30帧保存,就设置为30,最终录制的文件时长是(高帧率/30)倍,OPPO等厂商为此设计。
    帧率不同,码率也要跟随适配,可以通过 setVideoEncodingBitRate 设置。
  5. 配流
    需要通过 device.createConstrainedHighSpeedCaptureSession(targets, callback) 下发配流信息
    也可以 device.createCaptureSession下发配流信息,此时需要通过 SessionConfiguration 配置 不同的 sessionType 以区分高速录像模式,HAL 会依据 sessionType 做相应的处理。
  6. 参数更新
    如果普通是普通预览,我们可以使用 session.capture(builder.build(),callback, handler) 更新 CaptureRequest。
    但是高帧率录像需要使用 highSpeedSession.captureBurst(highSpeedSession.createHighSpeedRequestList(builder.build())

到这里慢动作的软件设计要点已经讲完了,Google 示例代码参见 Camera2SlowMotion,示例代码多数设备无法正常运行,主要是因为HAL并未适配,手机厂商相机的核心卖点不会轻易开发给普通应用使用的。

慢动作一般是系统相机自带功能,之前恰好做过相关功能的开发,现整理为本博文笔记。


相关示例
https://github.com/ZhengShang/HighSpeedVideoDemo
https://gitee.com/chenjim/CameraDemo/tree/master/Camera2SlowMotion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot -【BeanFactory】基础使用及应用场景

1.介绍 在 Spring 框架中,BeanFactory 是 Spring IoC 容器的核心接口,负责管理 bean 的创建、配置和装配。它是 Spring IoC 容器的基础。BeanFactory 接口定义了一系列方法,用于管理和访问容器中的 bean 对象。 BeanFactoryAware 用于在 Sp…

C++学习规划“的 PPT 大纲设计

以下是一个关于"C学习规划"的 PPT 大纲设计: 幻灯片 1:引言 欢迎参加 C学习之旅介绍 C的重要性和应用领域 幻灯片 2:C基础知识 C编程语言概述数据类型与变量控制流语句函数定义与调用 幻灯片 3:面向对象编程 类与…

matlab悬臂梁有限元分析

1、内容简介 略 47-可以交流、咨询、答疑 2、内容说明 略 建模说明 设计一个长方体的悬臂梁,长宽高分别为100m、10m和15m,材料特性为杨氏模量2e5,泊松比0.3, Matlab有限元分析(截图) 上图为悬臂梁的扰度…

Autosar 开篇

背景 AUTOSAR(Automotive Open System Architecture)是一个跨汽车行业的标准化软件架构,旨在促进汽车电子系统的开发和部署。下面是AUTOSAR发展的一些关键点: 起源和背景: AUTOSAR最初于2003年由汽车制造商宝马、戴姆…

从私人客户转变为教练会员网站

教练和顾问可以做出的最令人兴奋的转变之一就是通过教练会员网站扩大业务规模。 一对多优惠的类型有很多种,但与任何其他选择相比,教练和顾问的会员资格拥有最多的机会和灵活性,可以与你和你的客户一起发展。 世界正在转向更容易获得和更…

Atomic-tutorial

上一节介绍了 C11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag 过于简单,只提供了 test_and_set 和 clear 两个 API,不能满足其他需求(如 store, load, exchange, compare_exchange 等),因此本文将介绍功能更加完…

Peter算法小课堂—动态规划

Peter来啦,好久没有更新了呢 今天,我们来讨论讨论提高组的动态规划。 动态规划 动态规划有好多经典的题,有什么背包问题、正整数拆分、杨辉三角……但是,如果考到陌生的题,怎么办呢?比如说2000年提高组的…

AD24-Gerber生产文件输出及整理

一、Gerber生产文件输出 1、先进行规则检查 2、Gerber Files输出 3、钻孔文件 4、IPC网表 5、坐标文件 二、Gerber Flies文件整理 1、CAM 2、SMT 3、ASM 4、PRJ 5、DXF

ubuntu安装gptsovits

我看到社区有人需要,刚好我自己也要安装个ubuntu的用在自己的4090服务器上玩一玩。 于是就写一篇这样的教程。但是我只需要他的api推理,用于测试4090合成速度。所以这里只执行Python api.py 环境 1.首先下载整合包,里面有个nltk_data,拿出来…

Jmeter之单接口的性能测试

前言: 服务端的整体性能测试是一个非常复杂的概念,包含生成虚拟用户,模拟并发,分析性能结果等各种技术,期间可能还要解决设计场景、缓存影响、第三方接口mock、IP限制等问题。如何用有限的测试机器,在测试环…

Mysql 连接最近经常报超时

原因 怀疑是某个服务频繁调用mysql操作,导致linux buff/cache 过大 # 通过下列命令查看 free -h解决方案 临时解决方案: 可以通过写入 /proc/sys/vm/drop_caches 来释放缓存。这是一个临时的操作,内核会在需要时再次填充缓存 # 释放缓存 sync; echo 3 > /proc/…

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …

leetcode:491.递增子序列

1.误区:不能直接对数组排序再求解子集,因为那样就改变了原有数组的顺序 2.树形结构:一个一个取数,然后保证是递增序列,且不能重复。(数层上不可以重复取,树枝上可以重复取)收集的结…

springboot/ssm高校竞赛管理系统Java知识竞赛报名管理系统web

演示视频 https://www.bilibili.com/video/BV12m411U7Hm/ 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysq…

[设计模式Java实现附plantuml源码~行为型]对象间的联动~观察者模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

【大模型 数据增强】IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能

IEPILE:基于模式的指令生成解法,提高大模型在信息抽取任务上的性能 提出背景基于模式的指令生成解法效果 提出背景 论文:https://arxiv.org/pdf/2402.14710.pdf 代码:https://github.com/zjunlp/IEPile 2024年02月发布了一个大…

MySQL锁三部曲:临键、间隙与记录的奇妙旅程

欢迎来到我的博客,代码的世界里,每一行都是一个故事 MySQL锁三部曲:临键、间隙与记录的奇妙旅程 前言临键锁的奥秘间隙锁记录锁 前言 在数据库世界中,锁是维护数据完整性的一种关键机制。而MySQL中的临键锁、间隙锁和记录锁则是锁…

解决uni-app vue3 nvue中使用pinia页面空白问题

main.js中,最关键的就是Pinia要return出去的问题,至于原因嘛! 很忙啊,先用着吧 import App from ./App import * as Pinia from pinia import { createSSRApp } from vue export function createApp() {const app createSSRApp(App);app.us…

Python 读取创建word文档

本篇文章内容为使用python 读取word文档和创建word文档 读取doc文件 引入类库 示例如下: import win32com import win32com.client import os 读取doc文件 通过得到的doc文件路径调用系统word功能。 打开文件获取其中的文本信息,输出文本信息&#…

彩虹全新 SUP 模板,卡卡云模板修复版

彩虹全新 SUP 模板,卡卡云模板,首页美化,登陆页美化,修复了 PC 端购物车页面显示不正常的问题。下载地址:彩虹全新 SUP 模板.zip 模板截图