windows下的gjf转到Linux,通过命令行将 MP4 转换成 gif

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

写博客时常常需要将 MP4 视频转换成 gif,方便插入。网上有挺多网站可以在线转,但是质量一般,有的还有文件大小或数量限制,其中,在 Linux 命令行下,很容易就能实现这个功能。

工具选择:截取视频中的图片:mplayer

合并处理 gif:imagemagick

安装命令1

2sudo apt-get install mplayer

sudo apt-get install imagemagick

完成转换需要完成三项工作:将视频转换为 jpeg,将 jpeg 合成 gif,压缩 gif 文件

42a3ecd416fb6600575c1d05fdaa9548.png

假设 MP4 文件在 ~/Video/ 目录下,文件名为 screenrecorder.mp41

2cd ~/Video

mplayer -ao null screenrecorder.mp4 -vo jpeg:outdir=.tmp

-ao null 表示不输出音频

-vo jpeg 表示将视频输出为 jpeg

:outdir=.tmp 表示将 jpeg 输出到当前目录下的 .tmp 文件夹中

8d0d594cb167de657f4c9ab4b3276269.png

接下来需要用 imagemagick 将多张图片合成 gif。1convert .tmp/*.jpge screen.gif

这个操作极为耗时,而且会报下面一个错误:

a5f432e32021588050aea082a7851d49.png

这个错误之所以出现,是因为 ImageMagick 在其安全策略配置文件中,将 ImageMagick-6 的内存使用限制为 256MB,导致 ImageMagick 不能获得足够的内存来完成图片合成。

ImageMagick 的安全策略配置文件位置可以通过 identify -list policy 获取,一般为 /etc/ImageMagick-6/policy.xml。然后用你喜欢的编辑器打开文件找到下面一行进行编辑即可,注意,编辑此文件需要管理员权限。1

具体改成多少可以看你机器的配置而定。

bd03d95903b487edc8b2c32baa04779f.png

直接合成的 gif 图片尺寸过大,以我 28 秒录屏为例,生成 865 张图片,合成的 gif 体积高达 109.1MB,如果直接使用,简直是不可想象的,因此还需要使用 ImageMagick 进一步压缩。1

2

3

4

5

6

7

8原尺寸

ls -l screen.gif

-rw-rw-r-- 1 zeamonk zeamonk 109146833 10月 4 22:48 screen.gif

压缩

convert screen.gif -fuzz 15% -layers Optimize 1.gif

压缩后尺寸

ls -l 1.gif

-rw-rw-r-- 1 zeamonk zeamonk 1.7M 10月 5 01:19 1.gif

-fuzz 选项启用后会将相近的颜色会被压缩为同一种颜色,后面的值表示颜色相近区域的范围,数越大代表范围越大,图片失真越严重。实测 15% 的情况下失真是可以接收的,如果将 -fuzz 设为 20%,文件尺寸可以进一步压缩到 900k,但失真会比较严重。

下图是 15% 压缩的图片

e7cf21562bdbf2faa02c207653c4ae28.gif

2b1a1ee23a4ca85fbf42829388a82e4e.png

为了方便使用,还是写个脚本吧。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16# 生成 jpg 文件

echo "Generate pictures..."

out1=`mplayer -ao null $1 -vo jpeg:outdir=.tmp > /dev/null`

# 预处理,对文件进行压缩

echo "Compress picture..."

out2=`find .tmp/*.jpg -exec convert {} -strip -resize 75% -quality 75% {} ;`

# 合成 gif

echo "Start converting jpgs to gif..."

out3=`convert .tmp/*.jpg -delay 20 .tmp/tmp.gif`

# 压缩 gif

echo "Optimize gif..."

out4=`convert .tmp/tmp.gif -fuzz 15% -layers Optimize output.gif`

# 清理残余文件

echo "Clear tmp files..."

rm .tmp/* > /dev/null 2>&1

echo "Completed..."

关注下公众号好不好😘😘😘

LazyMonk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值