消除ffmpeg和image-magic命令中的慢速因素

时间:2018-10-23 08:29:10

标签: ffmpeg imagemagick

这些命令的基本思想是创建一个比较,(一个比较从过去定义了一个jpeg,从现在定义了一个jpeg,结合起来,例如它们将彼此滑动并在图像之后显示)。

例如https://media.evercam.io/v1/cameras/1lowe-scnoe/compares/lower-jreyh.gif

所有命令都写在下面,进行这些操作

  • 在图像后调整大小。
  • 使用两个图像创建一个Gif。
  • 将日志添加到Gif。
  • 从GIF创建MP4文件。
  • 从mp4文件创建缩略图。

徽标为:

enter image description here

我们正在使用FFmpeg和ImageMagick命令(例如

)制作动画和mp4文件
ffmpeg -i before_image.jpg -s 1280x720 before_image_resize.jpg

ffmpeg -i after_image.jpg -s 1280x720 after_image_resize.jpg

以上命令首先要调整将在动画中使用的两个图像的大小。

此命令用于创建gif。

convert after_image_resize.jpg before_image_resize.jpg -write mpr:stack -delete 0--1 mpr:stack'[1]' \\( mpr:stack'[0]' -set delay 25 -crop 15x0 -reverse \\) mpr:stack'[0]' \\( mpr:stack'[1]' -set delay 27 -crop 15x0 \\) -set delay 2 -loop 0 temp.gif

此命令可将徽标添加到动画中。

convert temp.gif -gravity SouthEast -geometry +15+15 null: evercam-logo.png -layers Composite compa-efxfphu.gif

然后将mp4文件创建为

ffmpeg -f gif -i compa-efxfphu.gif -pix_fmt yuv420p -c:v h264_nvenc -movflags +faststart -filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2' compa-efxfphu.mp4

然后从此mp4创建缩略图。

ffmpeg -i compa-efxfphu.mp4 -vframes 1 -vf scale=640:-1 -y thumb-compa-efxfphu.jpg

是否有可能减少这些步骤?这一切都花费很多时间,我只对两个convert命令感兴趣,我们可以将它们合并为一个命令吗?

或者您是否有机会将所有这4个减少到一个?任何输入都会非常感激。

1 个答案:

答案 0 :(得分:1)

更新后的答案

这是我最好的镜头,它的运行时间约为原始答案的50%...

convert -depth 8 -gravity southeast -define jpeg:size=1280x720   \
   logo.png   -write MPR:logo +delete                            \
   \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \)   \
   \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \)   \
   +append -quantize transparent -colors 250 -unique-colors +repage -write MPR:commonmap +delete \
   MPR:after  -map MPR:commonmap +repage -write MPR:after  +delete \
   MPR:before -map MPR:commonmap +repage -write MPR:before         \
              \( MPR:after -set delay 25 -crop 15x0 -reverse \)    \
   MPR:after  \( MPR:before -set delay 27 -crop 15x0         \)    \
   -set delay 2 -loop 0 -write anim.gif                            \
   -delete 1--1 -resize 640x thumb.jpg

这是我的想法...

  • 像使用JPEG一样将深度设置为8,设置gravity并初始化libjpeg“加载收缩” 功能
  • 加载徽标并保存到MPR,因为我们将使用它两次,
  • (...)内开始一些“旁处理” ,以加载before图片,调整其大小,粘贴到徽标上,然后保存到MPR以供以后使用,
  • after图片重复上一步,
  • 将前后图像附加在一起,并计算出适合两者的组合色彩图并保存,
  • 将图像前后的图像映射到新的组合色图,
  • 删除所有垃圾邮件,
  • 一种动画方式,
  • 为另一个动画,
  • 使动画永无止境,并将动画保存到GIF,
  • 删除第一帧以外的所有内容,调整其大小并另存为缩略图。

原始答案

仍在进行中,但是您可以避免调用ffmpeg的前两次,并在 ImageMagick 中进行大小调整,还可以将徽标一次粘贴到顶部:

convert -gravity southeast logo.png  -write MPR:logo \
  \( before.jpg -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:before \) \
  \( after.jpg  -resize '1280x720!' MPR:logo -geometry +15+15 -composite -write MPR:after  \) \
  -delete 0--1                                           \
  MPR:before  \( MPR:after  -set delay 25 -crop 15x0 -reverse     \) \
  MPR:after   \( MPR:before -set delay 27 -crop 15x0   \) \
  -set delay 2 -loop 0 temp.gif

如果您将以下行的最后一行更改为:

,您可能还可以使用该命令来创建缩略图。

-set delay 2 -loop 0 temp.gif

-set delay 2 -loop 0 -write temp.gif \
-delete 1--1 -resize 640x thumbnail.jpg

您还可以使用libjpeg的“加载时收缩” 功能来加快速度并减少内存使用。基本上,您在读取磁盘之前告诉它所需的文件大小,并且它仅读取文件的一个子集,从而减少了I / O时间和内存压力:

convert -gravity southeast logo.png  -write MPR:logo    \
  \( -define jpeg:size=1280x720 before.jpg -resize ... \
  \( -define jpeg:size=1280x720 after.jpg  -resize ... 

这可以将我的机器上的时间减少25%到30%。


这是我的想法...

  • 首先设置gravity,因为它是一项设置,并保持设置直到更改,
  • 加载徽标并保存到MPR,因为我们需要将其粘贴两次并且从磁盘读取两次很慢,
  • (...)内开始一些“旁处理” ,以加载before图片,调整其大小,粘贴到徽标上,然后保存到MPR以供以后使用,
  • after图片重复上一步,
  • 删除所有垃圾邮件,
  • 一种动画方式,
  • 为另一个动画,
  • 使动画永无止境,并将动画保存到GIF,
  • 删除第一帧以外的所有内容,调整其大小并另存为缩略图。

enter image description here


关键字:动画,雨刮器效果,GIF动画