年底了,所以没时间;

年底了,所以有时间。

回顾

在前两篇文章中,已经介绍了在android上录制视频的流程,及使用opengl添加水印、图片等(水印就是图片),后续会更新更多的视频特效(美颜、模糊等),敬请期待。

背景

在录制视频时,可能需要包含多个场景,这就需要支持断点续录;

同时对于录制效果不好的片段,可能想要删除重新录制,但又不想从头开始,这就需要回删功能。

断点续录与回删

第一个想法

刚开始想实现这个功能时,回顾了一下视频帧写文件的流程,

源输入 -> 编码器 -> muxer合成

那是否可以在想暂停时设置一个标志位,用于忽略帧数据:

在编码器阶段暂停:此时会出现帧数据不写了,但屏幕也不更新画面了,原因尚未深究;

在muxer阶段暂停:此时暂停效果有了,且屏幕更新不受影响;

以上两种方式都有一个问题,就是最终视频文件中,暂停前后的几帧画面不完整,像卡碟现象。

而且这种文件无法实现回删功能。

每个片段单独文件

上面的方式行不通,那如果把每个片段当成一次正常录制,每次都保存为一个完成的视频文件,这样每个片段内的数据都是正常的,断点续录功能明显已经满足了;

而对于回删功能,只要录制过程中维持一个文件系列,在这个系列上回退(删除最新的文件)即可;

最终就是把多个视频文件合成一个。

版本录制

每个场景录制保存为一个单独的视频文件,这个就是之前已经实现的视频录制功能。并且所有场景的文件维持在一个系列中。

录制新场景前:1.mp4 -> 2.mp4

录制新场景

录制新场景后:1.mp4 -> 2.mp4 -> 3.mp4

回删

在多场景录制过程得到的文件系列中,删除最后一个文件,即可回退到上上次的场景结尾,如

回删前:1.mp4 -> 2.mp4 -> 3.mp4

回删一次,变成

回删后:1.mp4 -> 2.mp4

如此看来,整个过程就相当简单了。

视频拼接

这个环节最重要了,网上很多说法是用ffmpeg,对于我们来说,那是“杀鸡用牛刀”,而且我们所有的视频文件在比特率、分辨率、格式等方面都是相同的,不用经过转换操作。

于是输入搜索关键字“android 视频拼接”,出来了一大堆,最后用了一个纯java代码实现的,码上,成功!

总结

注:后续会更新更多的视频特效(美颜、模糊等),敬请期待。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐