首页 > 解决方案 > 我应该如何使用带有 xfade 和 zoompan 过滤器的 ffmpeg 从图像中创建视频幻灯片

问题描述

我正在尝试从多个图像创建单个视频幻灯片,使用 xfade 过滤器实现过渡效果,并使用每张幻灯片的 zoompan 过滤器实现放大/缩小效果

图像可以有不同的分辨率/纵横比/方向

在大多数情况下,我成功了,将其分为两个步骤:

  1. 将每个图像转换为具有放大/缩小效果的视频,将所有视频缩放到相同大小(xfade 要求输入具有相同的分辨率)
  2. 使用 xfade 过滤器将 (1) 中的输出视频合并到单个视频

但是,在某些情况下,OOM 会杀死这些进程,而其他进程会在超时时终止。

我正在使用以下命令(一些参数是由 PHP-FFMpeg 包添加的):

图片转视频

/usr/local/bin/ffmpeg -y -r 1 -loop 1 -i 'image1.jpg' -ss 0 '-t' '3' -filter_complex 'scale=trunc(1200/2)*2:trunc(801/2)*2:force_original_aspect_ratio=1,pad=trunc(1200/2)*2:trunc(801/2)*2:(ow-iw)/2:(oh-ih)/2,fps=25,crop=w=trunc(1200/2)*2:h=trunc(801/2)*2,scale=4000:2000,zoompan=z='\''min(max(zoom, pzoom)+0.002667,1.200000)'\'':d=1:x='\''iw/2-(iw/zoom/2)'\'':y='\''ih/2-(ih/zoom/2)'\'',setsar=1,scale=trunc(1200/2)*2:trunc(801/2)*2:force_original_aspect_ratio=1,pad=trunc(1200/2)*2:trunc(801/2)*2:(ow-iw)/2:(oh-ih)/2[video]' -map '[video]' -crf 17 -preset fast -threads 8 -vcodec 'libx264' -acodec 'aac' -b:v '1000k' -refs '6' -coder 1 -sc_threshold '40' -flags '+loop' -me_range '16' -subq '7' -i_qfactor '0.71' -qcomp '0.6' -qdiff '4' -trellis '1' -b:a '128k' /output.mp4

将多个视频连接到单个视频(幻灯片)

/usr/local/bin/ffmpeg -y -i 'output1.mp4' -i 'output2.mp4' -i 'output3.mp4' -filter_complex '[0][1]xfade=transition=fade:duration=1.0:offset=2.0[s0];[s0][2]xfade=transition=fade:duration=1.0:offset=4.0[s1];[s1]format=yuv420p[video]' -map '[video]' -crf '17' -preset 'fast' -threads 8 -vcodec 'libx264' -acodec 'aac' -b:v '1000k' -refs '6' -coder '1' -sc_threshold '40' -flags '+loop' -me_range '16' -subq '7' -i_qfactor '0.71' -qcomp '0.6' -qdiff '4' -trellis '1' -b:a '128k' final.mp4

你能帮我优化命令吗?在添加放大/缩小效果时,必须添加多个缩放以消除口吃/抖动

也许我把一个简单的任务复杂化了?也许有不同的工具/包来实现这一点?

标签: videoffmpegvideo-processingtranscodingffmpeg-php

解决方案


推荐阅读