Android相机开发 延时摄影的一些实现思路

来源:互联网 发布:ubuntu 系统备份 编辑:程序博客网 时间:2024/05/08 09:05

    最近在做一款相机相关app,因为里面功能蛮多,所以除了基本的相机操作,其他的像慢动作、延时摄影、滤镜、直播这些都很费工夫,那么今天就来和大家探讨一下延时摄影的一些实现思路。

    延时摄影,简单来讲就是将一段时间很长的视频,录制到很短的时间里,相对于慢动作来说,可以称之为快动作。看过人与自然之类节目的,想想里面的那些植物从发芽到枝繁叶茂,或者某个地方一年四季地貌变换的快速镜头就知道了。具体到手机上来说,比如我们每秒录制1帧,而录制出来的视频播放速率是每秒60帧,那么本来录制了一分钟的视频播放只有1秒钟,可以说他是加速了60倍。

    下面就来讲一下一些实现思路,由于参考资料较少,如有更好实现方式还请赐教,按照安卓官网给出的提示,视频录制时有两个概念,一个capture rate和一个frame rate,即采样速率和帧速率,分别表示从相机获取数据的速率和播放时的速率,所以普通视频我们设置两个速率相同即可,而录制慢动作或者延时摄影时两者应该成一定的倍数关系,同时bit rate比特率也应做相应调整,那么具体实现的时候遇到的问题是,使用media codec和media format通过配置相关参数来实现的录制方式参数配置无效,也没有找到可参考的demo,而用mediarecorder实现的方式也有一定的局限,比如一些手机前置镜头不支持前面说的采样速率和帧速率不同,另外一个问题是,采样速率最少为1,也就是每秒最少一帧,这样也就限制了它的加速倍数不会太高,因为实际情况很可能几秒甚至几分钟才录一帧;后来研究发现可以使用的几种方式是:使用open cv 的 videowriter来写数据,速率可以自己把握,数据来源是相机callback的onpreviewframe中的data,因为open cv有配套的Java代码,所以操作并不难,缺点是需要导入opencv的so库和jar包,并且只能录制avi格式的视频,而这种视频体积较大,在安卓上操作也没有mp4格式好使,所以最后放弃了,考虑过的优化方式为为open cv加入h264编码的支持,即引入x264库并编写相关本地代码等,鉴于研究较少暂时放弃;另一种思路就是目前的做法,即仍然使用media codec和media format,但是参数配置和普通视频相同,只是为muxer添加数据的drainencorder方法的调用时间间隔和时间戳由我们自己控制,而不是像之前的每来一帧就填充,比如第一帧的时间为获取当前时间,后面的时间戳在此基础加一个固定值即可,至于数据来源,既可以是onpreviewframe,也可以是ondrawframe,或者其他,具体看自己的项目。

    以上就是目前自己的一些实现思路,听说通过ffpemg也可以进行相关操作,暂时也没研究,各位安卓小伙伴如有更好的方法或实现思路也请不吝赐教,在此谢过!!!