Saber 酱的抱枕

Fly me to the moon

11/10
2017
ACG

使用FFmpeg将pixiv的动图合成为视频

pixiv上的动图其实并不是gif图片,而是一个zip压缩包,里面包含多张jpg图片。如下:

FFmpeg pixiv p站 动图 视频 图片合成视频

在pixiv上看动图时,网页使用JavaScript控制图片一张张切换显示,形成了动态效果。但是我们下载之后,zip格式显然不方便观看。本文的办法是,使用FFmpeg将pixiv的动图合成为视频。

处理步骤如下:

1.把要合成视频的zip文件解压到单独的文件夹,比如d:\zip\文件夹,里面有很多文件夹,每个里面都是一个动图的散图:

FFmpeg pixiv p站 动图 视频 图片合成视频

2.下载FFmpeg,解压到D盘。d:\ffmpeg\bin\ 文件夹里是 ffmpeg 的命令行文件。

FFmpeg pixiv p站 动图 视频 图片合成视频

3.编写处理所有文件夹的命令。windows中可以用bat批处理简化:

@echo off
for /f "tokens=*" %%i in ('dir/b/ad d:\zip\') do (
d:\software\ffmpeg\bin\ffmpeg -r 15 -loop 0 -f image2 -i d:\zip\%%i\%%06d.jpg -vcodec libx264 -y -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" d:\zip\%%i.mp4)

新建记事本,把上面的代码保存成后缀名是.bat的文件,放在任意位置运行即可。

如果你放图片和ffmpeg的路径和我上面图里不一样,请把代码里的路径改成自己实际路径。

命令里的“-r”后面的数字代表帧率,我设置成了15,适合大多数动图。(因为 pixiv 上的动图的帧率是不统一的,所以这个地方不太好处理)

4.等待执行完毕即可~

看看转换前后的对比吧:

FFmpeg pixiv p站 动图 视频 图片合成视频

完成~


如果系统不是windows的话,可以把多条转码命令用"&&"连接起来一起执行。下图为示意图:

FFmpeg pixiv p站 动图 视频 图片合成视频

当然路径需要修改了。或者shell有类似批处理功能的话也行,自行编写批处理命令也行。

tips:一些shell的粘贴有长度限制,如果你发现粘贴后不完整,请分批次处理,每次只粘贴一部分。


FFmpeg命令讲解:

ffmpeg -loop 0 -f image2 -i d:\zip60021477\%06d.jpg -vcodec libx264 -r 15 -y -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" d:\zip60021477.mp4

-loop 是否循环读取图片,0为否。1为是。
-i    设定输入流。文件名处的%06d表示从0开始的六位数,如000000,000001,000002……
-f    设置输出格式
-vcodec 设置编码格式
-r    设置帧率
-y    如果输出时存在同名文件,不询问直接覆盖

-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"、
如果图片宽高有任意一个不能被2整除,则会提示转换失败。可添加上面的参数解决。
这样会把宽高不是2的整数的那条边缩放成最近似的可用值,如900*455变成900*454

以下是一些我没使用但以后可能用到的参数:
-b:v  设置码率(我没写,默认高画质,2000以上的码率够用了)
-t    设置视频时长(不需要)
-s    设置分辨率,如-s 1280×720
-i audio.mp3 -absf aac_adtstoasc 输入音频

附一个转码命令:

ffmpeg -i "d:\t.mp4" -b:v 2000k -bufsize 2000k -vcodec libx264 -r 30 -s 1280x720 -y "d:\a.mp4"

附一个从视频提取图片的命令:

ffmpeg -i "d:\t.mp4" -r 2 -ss 00:00:10 -t 00:00:05 "d:\img\image%d.png"

每秒截取2张图片,从第10秒开始,截取5秒时长。保存到指定目录里(目录需要手动创建),保存成png文件。其实后面png也可以改成jpg,但是默认的jpg画质太差,实用性不高。

附一个截取视频片段的命令:

ffmpeg  -i "D:\t.mp4"  -vcodec copy -acodec copy -ss 00:00:05 -to 00:20:24 out.mp4 -y

不过这个命令是寻找关键帧,从关键帧开始、结束的,所以设置的时间最好是关键帧的时间。

其他功能参考:ffmpeg的7个决窍——新浪博客


不重要的东西挪到后面了。

p站动图的zip格式让我们比较头疼。

1.源文件是zip的,解压出来也是很多散图,不利于观看
2.文件体积大,几兆(MB)的动图很常见,有些动图体积甚至达到二三十MB。比如我上一篇文章发了某个画师的图包,他的104个动图占用了1.7GB的空间,平均每个文件体积在10M以上。

现在有一些工具可以把pixiv的动图的压缩包转换为动态图,如gif格式或者apng格式。但是这只解决了第一个问题,就是方便观看了。但是这种工具转换速度慢,生成的文件体积更是巨大,多数情况下比原来压缩包的体积更大,所以我一直以来都懒得转换,直接存zip压缩包的(你问我怎么看?看图时按住下一张的按钮不丢,通过快速切换形成动态效果)。

今天我面对前面提到的1.7GB的动图压缩包,想试试转换成视频的效果。这时候就要请出万能的FFmpeg了,把图片合成为x264编码的mp4视频,效果极好,解决了上面的问题:

1.mp4格式便于观看,而且显示效果好(相比gif的256色);
2.减少体积效果显著,104个压缩包(合计1.7GB)转换成mp4后只占用250MB空间,体积只有原来七分之一,而且画质还很高(默认参数下是高画质)。

除了解决观看问题和体积问题外,此方法还有一些优点,比如转换速度很快,以及支持批量转换。目前把图片合成gif的软件基本都是一次只能处理一个文件夹,不利于批量操作。但使用FFmpeg命令行的话我们可以批量操作,提高效率。

使用FFmpeg将pixiv的动图合成为视频