这可能是全⽹关于Camera慢动作录像(SlowMotion)介绍最全的⽂章了
这是⼀篇关于慢动作录像(slowmotion)的⽂章,看完后相信你对慢动作录像不会再感到陌⽣了~
这篇⽂章针对下⾯⼏点来展开:
1)写这篇⽂章的原由?
2)什么是慢动作录像(SlowMotionRecord)?
3)Android上如何实现慢动作录像?
4)调试demo下载地址?
5)调试遇到的问题及解决?
⼀、写这篇⽂章的原由?
2⽉份的时候,在⼀个⾳视频开发的学习交流群⾥,有位⽹友问到**“Android相机有啥设置可以做到slowmotion?”**,我认真的想了下,然
后⼜简单看了下⾼通的晓龙相机源码,⼤概知道是怎么实现后,给了下思路。
后⾯我还⼀直在想这个事情,觉的⾃⼰给的思路太简单了,有时间还是得再研究研究,⾃⼰得敲下代码跑通下才好,于是就有了这篇⽂章。
⼆、什么是慢动作录像(SlowMotionRecord)?
通常我们⼈眼能够接受的最好的视频帧速率是24帧/每秒左右。那如果我们⽤120帧/秒拍摄⼀个动作,再⽤24帧每秒来播放的话,视频就
放慢了5倍,这个就是慢动作录像了。
慢动作录像,⼜叫⾼帧率录像(HFR),也就是以⾼fps(运⾏速率)捕获、编码并保存为30fps(⽬标速率),这种情况运⾏速率⼤于⽬标
速率。
(还有⼀种模式叫做⾼速录制(HSR):即以⾼fps(运⾏速率)捕获、编码并保存为⾼fps(⽬标速率),运⾏速率等于⽬标速率。)
这篇⽂章只介绍慢动作录像。(调试环境基于⾼通晓龙865芯⽚Android9.0)
三、Android上如何实现视频慢动作?
有了上⾯关于慢动作的概念后,那在Android上如何⽤代码来实现呢?说到录像,那我们应该要想到MediaRecorder了。慢动作,也就是
⾼帧率录像,那肯定得调⽤mediaRecorder设置⾼帧率了。
好了,我们还得再有⼀个概念,数据是从摄像头nsor出来的,那我们需要120fps,总得摄像头⽀持才⾏吧。所以呢,就有⼀个先决条件
了,硬件得⽀持才⾏,下⾯会讲如何查询当前硬件是否⽀持。
假设硬件⽀持的情况下,我们来看下软件上应⽤的调⽤情况。
1、新类CameraConstrainedHighSpeedCaptureSession
查看Android的开发⽂档,我们可以看到,从Android6.0开始,Camera相关的,添加了⼀个新的类
CameraConstrainedHighSpeedCaptureSession,从描述上看,我们就可以知道,这个是专门为⾼速、⾼帧率录像准备的。换⼀句话
说,也就是Android6.0以上,Android本⾝才⽀持这个⾼速、⾼帧率录像。(我在⾃⼰早年⽤的nubiya⼿机上看了下,Android5.1的系
统,系统相机也带了慢动作功能,不过它这个慢动作应该是⼚家⾃⼰定制开发的,那会Android还没提供相关接⼝)
2、查询当前硬件是否⽀持⾼帧率录像
通过CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS来获取availablesize。如果存在available,则判断为⽀持。
publicstaticbooleanhasHighSpeedVideoConfigs(Contextcontext,StringcameraId){
try{
CameraManagercameraManager=(CameraManager)temService(_SERVICE);
CameraCharacteristicscharacteristics=eraCharacteristics(cameraId);
HighSpeedVideoConfiguration[]highSpeedVideoConfigs=(
L_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS);
returnhighSpeedVideoConfigs!=null&&>0;
}catch(Exceptione){
}
returnfal;
}
3、获取⽀持的⾼帧率录像videoSize
从hSpeedVideoSizes()中获取⽀持的videoSize,然后选择个合适的size,注意这⾥的previewSize需要和videoSize保持⼀致。
CameraCharacteristicscharacteristics=eraCharacteristics(cameraId);
StreamConfigurationMapmap=characteristics
.get(SCALER_STREAM_CONFIGURATION_MAP);
mVideoSize=chooVideoSize(hSpeedVideoSizes());
mPreviewSize=mVideoSize;//这⾥需要保持previewSize和videoSize⼀致
4、CONTROL_AE_TARGET_FPS_RANGE设置为⾼帧率范围(120,120)
RangeaeFps=newRange(120,120);
(L_AE_TARGET_FPS_RANGE,aeFps);
5、创建ssion采⽤createConstrainedHighSpeedCaptureSession
⾼帧率录像创建ssion,使⽤专门提供的api接⼝。
//Startacapturession
ConstrainedHighSpeedCaptureSession(surfaces,allback(){
@Override
publicvoidonConfigured(@NonNullCameraCaptureSessioncameraCaptureSession){
......
}
@Override
publicvoidonConfigureFailed(@NonNullCameraCaptureSessioncameraCaptureSession){
......
}
},mBackgroundHandler);
6、采⽤tRepeatingBurst
ssionconfigure成功后,调⽤tRepeatingBurst不停的request,这个和正常模式有点区别,正常模式是调⽤的
tRepeatingRequest。
CaptureRequestrequest=();
List
.createHighSpeedRequestList(request);
eatingBurst(slowMoRequests,null,
mBackgroundHandler);
7、MediaRecorder相关参数设置为对应的⾼帧率参数
相对应的,mediaRecorder的⼀些参数也需要设置为⾼帧率参数。
mProfile=getProfile();
intbitRate=getHighSpeedVideoEncoderBitRate(mProfile,
rameRate,
VEDIO_HIGH_SPEED_FRAME_RATE);
eoEncodingBitRate(bitRate);
eoFrameRate(rameRate);
tureRate(VEDIO_HIGH_SPEED_FRAME_RATE);
五、调试遇到的问题及解决⽅法
》》》》问题1:
Process:,PID:21818
lArgumentException:Surfacesize1440x1080isnotpartofthehighspeedsupportedsizelist[1280x720,720x480,640x480,1920x1080]
onstrainedHighSpeedSurfaces(:193)
CaptureSessionInternal(:881)
ConstrainedHighSpeedCaptureSession(:627)
[分析]
》》》》问题2:Fpsrang[30,30]intherequestisnotasupportedhightspeedfpsrange…
Process:,PID:27138
lArgumentException:Fpsrange[30,30]intherequestisnotasupported
highspeedfpsrange[[120,120],[240,240],[480,480],[30,120],[30,240],[30,480]]
onstrainedHighSpeedSurfaces(:180)
HighSpeedRequestList(CameraConstrainedHighSpeedC
:89)
[分析]
*本⼈从事AndroidCamera相关开发已有5年,
*⽬前在深圳上班,
*⼩伙伴记得点我头像,看【个⼈介绍】进⾏关注哦,希望和更多的⼩伙伴⼀起交流~
--------2021.03.25深圳00:53·
本文发布于:2022-12-27 20:17:19,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/42410.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |