9 iterációval (10 perccel) később, de működik :)
Input/output:
input_dir="${script_dir}/images"
output_file="${script_dir}/output_slideshow.mp4"
Teljes script:
#!/bin/bash
# Set variables
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
input_dir="${script_dir}/images"
output_file="${script_dir}/output_slideshow.mp4"
duration=5 # Duration each image is displayed
transition_duration=1 # Duration of the transition effect
# Get all image files with absolute paths
images=()
while IFS= read -r -d $'\0' file; do
images+=("$file")
done < <(find "$input_dir" -maxdepth 1 -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \) -print0 | sort -z)
# Check if images were found
if [ ${#images[@]} -eq 0 ]; then
echo "No images found in $input_dir"
exit 1
fi
# Print found images and their permissions for debugging
echo "Found ${#images[@]} images:"
for img in "${images[@]}"; do
echo "$img"
ls -l "$img"
done
# Start building the filter complex
filter_complex=""
# Process each image
for i in "${!images[@]}"; do
filter_complex+="[${i}:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p,fade=t=in:st=0:d=$transition_duration,fade=t=out:st=$((duration-transition_duration)):d=$transition_duration[v$i];"
done
# Concat all processed images
for i in "${!images[@]}"; do
filter_complex+="[v$i]"
done
filter_complex+="concat=n=${#images[@]}:v=1:a=0,format=yuv420p[v]"
# Prepare FFmpeg input arguments with proper escaping
input_args=""
for img in "${images[@]}"; do
input_args+="-loop 1 -t $((duration)) -i $(printf %q "$img") "
done
# Print FFmpeg command for debugging
echo "FFmpeg command:"
echo ffmpeg -hide_banner -y $input_args -filter_complex \""$filter_complex"\" -map "[v]" -c:v libx264 -preset slow -crf 18 -movflags +faststart -profile:v high -level 4.1 -pix_fmt yuv420p $(printf %q "$output_file")
# Run FFmpeg command
eval ffmpeg -hide_banner -y $input_args \
-filter_complex \""$filter_complex"\" \
-map "[v]" \
-c:v libx264 -preset slow -crf 18 \
-movflags +faststart \
-profile:v high -level 4.1 \
-pix_fmt yuv420p \
$(printf %q "$output_file")