Android中视频(MP4)转GIF图的一些尝试和最终解决方案

近期在做的一个 side project 是一个辅助 Android 开发者 debug 以及帮助测试 MM(偏向于黑盒测试)反馈问题(Bug)的这样的一个工具集合。

工具集里实现了一个录屏功能,主要用途是提供给测试人员或内部测试时可以录制 Bug 的重现,从而方便在线发给开发人员查看是一个怎样的情况,而不用拿着手机去特意找到开发人员再一一道来。

实现方式:使用MediaProjection(API level 21)来实现录屏,MediaRecorder保存录制视频。保存的格式为MPEG_4,即我们平时说的 MP4。

原本以为本功能就到此结束,但再细想,把视频转换成 gif 是不是在用途上更方便一些呢? 例如公司项目的 bug list 用禅道作管理,转成 gif 后就可以直接往禅道上一贴,登 bug。(禅道不支持上传视频)

转 gif 的一些尝试:

一、使用 MediaMetadataRetriever 提取某一时刻的图片,然后把很多某一时刻的图片串联起来编码成 gif。看来其也正是 gif 的原理,但实现出来的效果极差,无法准确提取到准确的图片,导致合成的 gif 图也无法连贯播放,播放起来也跳帧跳得很厉害。

二、使用FFMpegMediaMetadataRetriever

FFmpegMediaMetadataRetriever is a reimplementation of Android’s MediaMetadataRetriever class. The FFmpegMediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file and uses FFmpeg as its backend.

使用 FFmpeg 作为背后的技术支持,听起来挺靠谱的,使用方式和使用 MediaMetadataRetriever 差不多,但一试,效果也是差不多烂~。

看来是不能用这个方法来做这个事情呀。

三、上面方法二竟然都用上 FFmpeg 了,那我也别怕用牛刀杀猪吧。直接用 FFmpeg 省事多了。

FFmpeg:

A complete, cross-platform solution to record, convert and stream audio and video.

一个哥们在 github 上开源了在 Android 上的移植:

https://github.com/dxjia/ffmpeg-commands-executor-library

站在巨人的肩膀上,一句代码运行一个命令搞定:

1
FFmpegNativeHelper.runCommand("ffmpeg -i input.mp4 output.gif");

后记:

有时觉得遇到一些坑,或者遇到一些网上解决方法比较少的问题,当自己解决了的时候,写一写、记录一下问题的解决过程或者方案也是挺有必要的。

1、防止下次还是遇到相同的问题,而那时候已经忘记了当时是怎么解决的。

2、“我”每次遇到问题的时候,几乎都是向搜索引擎伸出求助之手,那当“别人”遇到问题的时候,是否也是一样呢? 如果我们提供一些资源(解决方案)给搜索引擎供他人搜索、参考之用,是不是会给别人带来一些方便,节省一些碰壁时间,从而有更多时间去做一些更有意义价值的事情、创造更多更高的价值。