我有一个
ffmpeg
命令可以从一系列 N x JPEG 幻灯片创建 MP4 视频。也就是说,我不知道序列中有多少张幻灯片,它只是 JPEG-s 的目录。
我想为序列中的每张幻灯片应用通用幻灯片过渡。我读过的所有示例似乎都需要知道在写入过滤器之前有多少张幻灯片。这个想法是为每张幻灯片使用一个(简单的)过渡/过滤器。
到目前为止,脚本看起来像这样:
play_duration="-framerate 1/10" # 10 seconds for testing
ffmpeg \
${play_duration} \
-pattern_type glob \
-i "./slides/*.jpg" \
\
-c:v libx264 \
-filter_complex \
"pad=ceil(iw/2)*2:ceil(ih/2)*2; fade=out:120:30" \
\
./Slideshow.mp4
第一个过滤器:“
pad=...
”对于处理 JPEG 输入中的不一致是必要的。
我的有限欣赏是,如果我不需要也有
fade=out:120:30
构造,“pad=
”过滤器应该可以工作。
到目前为止我遇到的示例转换示例 - 同一模式有很多变体 - 看起来都很像这样......
ffmpeg -loop 1 -t 3 -framerate 60 -i image1.jpg -loop 1 -t 3 \
-framerate 60 -i image2.jpg -loop 1 -t 3 -framerate 60 -i image3.jpg \
-filter_complex \
"[0]scale=1920:1280:force_original_aspect_ratio=decrease,pad=1920:1280:-1:-1[s0]; [1]scale=1920:1280:force_original_aspect_ratio=decrease,pad=1920:1280:-1:-1[s1]; [2]scale=1920:1280:force_original_aspect_ratio=decrease,pad=1920:1280:-1:-1[s2]; [s0][s1]xfade=transition=circleopen:duration=1:offset=2[f0]; [f0][s2]xfade=transition=circleopen:duration=1:offset=4" \
-c:v libx264 -pix_fmt yuv420p \
output.mp4
要求是具有适用于所有幻灯片更改的相同过滤器/过渡。起初听起来很简单。
bash 脚本:
#!/bin/bash
LST=(*.jpg)
f="${LST[0]}"
XFO=3 #duration of pic
XFD=0.5 #duration of transition
INP=("-loop" "1" "-t" "$XFO" "-i" "$f")
echo $f
PDX="[v0]"
OFS=0
WID=320
HEI=180
SPS="scale=$WID:$HEI:force_original_aspect_ratio=decrease,pad=$WID:$HEI:-1:-1,setsar=1"
FLS="
[0]$SPS[v0];
"
FLX=""
for (( i=1; i<${#LST[*]}; i++ )); do
f="${LST[$i]}"
INP+=("-loop" "1" "-t" "$XFO" "-i" "$f")
OFS=$(echo "$OFS + $XFO - $XFD" | bc -l)
FLS+="[$i]$SPS[v$i];
"
FLX+="${PDX}[v${i}]xfade=duration=$XFD:offset=${OFS}:transition=custom:expr='if(gt(P-mod(PI*(P+ceil(Y/20)*(ceil(Y/20)-P+PI)),1)*0.15,X/W),A,B)'"
PDX="[x${i}]"
FLX+="${PDX};
"
echo $OFS $f
done
ffmpeg "${INP[@]}" -filter_complex "$FLS $FLX" -map $PDX -c:v h264_nvenc -cq 20 /tmp/output.mp4 -y -hide_banner
mpv /tmp/output.mp4