( Hevi | 2024. 09. 30., h – 17:26 )

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")