用你的MP4格式转成GIF,然后用GIF动画做封面!

Posted by SenYi Blog on 2019-05-06

总体思路上,MP4是一个视频,视频是由帧组成的,一帧是一张图片,比如一秒播放60张,连起来就是个视频。


先上最关键的命令,ffmpeg提供了将MP4转gif的操作:

ffmpeg -ss 25 -t 5 -i shipin.mp4 -r 5 -s 150x150 -y -f gif shipin.gif

-ss 25 -t 5:从视频25开始,一共5秒。
-i shipin.mp4:输入的视频
-r 5: 一秒取5帧。
-s 150x150:生成的图片是150*150尺寸。
-y 同名覆盖
-f gif:输出gif格式。

方法一:
MP4是由客户端APP直接上传到阿里云的OSS存储服务中,那么阿里云是否由接口,这样最简单方便可以打发走PM。调研发现,阿里云提供了MP4转GIF服务,实测发现,这个服务不能只转视频的一部分,它会把整个视频文件都给转了,比如38M的MP4文件会转成一个158M的GIF。这种方式PASS掉。

方法二:
在方法一的基础上,咨询阿里云的客服,给出的方案是,阿里云提供MP4指定秒数的一帧提出来生成一张jpg,然后多张jpg生成一张GIF。这样的话,阿里云生成的多个jpg要自己下载下来用生成一个gif。

方法三:
使用ffmpeg自己把MP4转gif。
ffmpeg提供了一个功能,可以把MP4中,指定秒数开始 + 一共多少秒 + 一秒取多少帧 + 图片多少*多少。

最佳时间:

以服务的形式,对外提供MP4生成GIF的服务。生成完成后,再以http回调的方式告诉上层应用,我这边生成好了。

具体步骤:

1、上层应用会在半夜开始跑脚本,根据各项指标,计算出几万个上首页的视频。
2、上层应用调我的service代码,传video_id给我。
3、我拿video_id查库得出视频在阿里云的http地址。
4、计算token,并将video_id + token存在Memcache里,过期时间7200秒。
5、以http的方式调MP4转GIF的服务。将video_id + token + 视频url + 回调函数的http地址。
6、在服务层,收到了请求,校验参数和token的合法性,执行一个ffmpeg命令
Ps:第5步和第6步可以用消息队列来解耦,太麻烦了。
7、生成完成后,传到阿里云的CDN上去,再以回调函数的形式,告诉上层应用,我已经做完了。
8、给上层应用service代码中,验证一下回调参数的video_id和token是不是之前存好的。
9、最后就是,上层应用修改数据库里的字段。

问题:不用消息队列的话,就面临着每次请求时一个HTTP,请求方会一直等着响应方回话。
解决:这个时候,我们可以在请求方的curl中设置超时时间,比如1秒。在响应方,让程序继续往下走,不要因为连接断开而终止执行。毕竟,请求方不需要等待响应,而是用回调方式的告知结果。

代码很简单,不放了。