最近在做一个类似抖音裁剪本地视频文件的需求. 效果图如下:
不考虑UI的实现, 涉及三个主要功能:
- 获取视频文件时长,
- 抽取视频文件的帧显示成一系列bitmap,
- 裁剪
我们项目处理视频使用的是腾讯的sdk(liteavsdk), 正好最近也在学习安卓多媒体相关的内容, 就想到, 能不能脱离腾讯的sdk, 使用安卓原生的系统接口来实现帧的截取. 查了一些资料, 试了一下, 是可以的. 而且从效率上来看, 跟腾讯sdk一致, 猜测它内部可能也是这么做的.
基本上是根据https://bigflake.com/mediacodec/中的ExtractMpegFramesTest.java 修改得来的.
主要的修改思路
- 根据视频文件的时长, 和要截取的帧frame的间隔, 提前确定总的要截取的帧数, 和每一帧对应的时间点(毫秒数).
- 在通过MediaExtractor读取frame的过程中, 判断当前帧frame是否是要截取的帧, 怎么判断: 根据frame的时间点参数值
如果是要截取的frame, 那么记录下这个frame的序号. 后面一步要用 - 在MediaCodec解码的过程中, 根据前一步记录的frame的序号值, 来判断是否需要把当前frame转换成bitmap