I try to write bash script to concat front and rear video files with delay 1 second at start and overlay rear over front.
I wrote the following bash script:
# Define the output file
output_file="${VIDEO}/final_output_${choice}.mp4"
# Collect and sort the video files
front_files=( $(ls *_F.MP4 | sort) )
rear_files=( $(ls *_R.MP4 | sort) )
# Create a file to hold ffmpeg input commands and filter scripts
input_list="input_files.txt"
filter_script="filter_complex.txt"
inputs=""
# Clear the input list and filter script files
echo "" > "$input_list"
echo "" > "$filter_script"
# Number of files
num_files=${#front_files[@]}
# Iterate through the sorted files to build the filter script
for i in "${!front_files[@]}"; do
echo "file '${front_files[$i]}'" >> "$input_list"
echo "file '${rear_files[$i]}'" >> "$input_list"
echo "[$((2*i)):v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_$i]; [$((2*i)):a]atrim=start=1,asetpts=PTS-STARTPTS[a_$i];" >> "$filter_script"
echo "[$((2*i+1)):v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_$i];" >> "$filter_script" # Rear video only
echo "[f_$i][r_$i]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_$i];" >> "$filter_script"
input+="[mix_$i][a_$i]"
done
# Concatenate all combined labels
echo "${input}concat=n=${#front_files[@]}:v=1:a=1[v][a]" >> "$filter_script"
# Run FFmpeg with filter script
ffmpeg -f concat -safe 0 -i "$input_list"
-filter_complex_script "$filter_script"
-map "[v]" -map "[a]"
-y "$output_file"
This script generates two files input_list.txt:
file '20200826_084407_F.MP4'
file '20200826_084407_R.MP4'
file '20200826_084708_F.MP4'
file '20200826_084708_R.MP4'
file '20200826_084910_F.MP4'
file '20200826_084910_R.MP4'
filter_script.txt:
[0:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_0]; [0:a]atrim=start=1,asetpts=PTS-STARTPTS[a_0];
[1:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_0];
[f_0][r_0]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_0];
[2:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_1]; [2:a]atrim=start=1,asetpts=PTS-STARTPTS[a_1];
[3:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_1];
[f_1][r_1]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_1];
[4:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_2]; [4:a]atrim=start=1,asetpts=PTS-STARTPTS[a_2];
[5:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_2];
[f_2][r_2]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_2];
[mix_0][a_0][mix_1][a_1][mix_2][a_2]concat=n=3:v=1:a=1[v][a]
I’w got error:
Input #0, concat, from 'input_files.txt':
Duration: N/A, start: 0.000000, bitrate: 11973 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 11877 kb/s, 30 fps, 30 tbr, 60k tbn, 60 tbc
Metadata:
creation_time : 2020-08-26T08:47:07.000000Z
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : h264
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 32000 Hz, mono, fltp, 96 kb/s
Metadata:
creation_time : 2020-08-26T08:47:07.000000Z
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Invalid file index 1 in filtergraph description
[0:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_0]; [0:a]atrim=start=1,asetpts=PTS-STARTPTS[a_0];
[1:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_0];
[f_0][r_0]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_0];
[2:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_1]; [2:a]atrim=start=1,asetpts=PTS-STARTPTS[a_1];
[3:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_1];
[f_1][r_1]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_1];
[4:v]trim=start=1,scale=1920:1080,setpts=PTS-STARTPTS[f_2]; [4:a]atrim=start=1,asetpts=PTS-STARTPTS[a_2];
[5:v]trim=start=1,scale=640:360,setpts=PTS-STARTPTS[r_2];
[f_2][r_2]overlay=x=(main_w-overlay_w-10):y=(main_h-overlay_h-10)[mix_2];
[mix_0][a_0][mix_1][a_1][mix_2][a_2]concat=n=3:v=1:a=1[v][a]
What am I doing wrong?
New contributor
Andrej Florjančič is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.