Files
bin/video_collage.sh
T
2024-09-04 00:31:38 +02:00

83 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Nastav proměnné
input_dir="/run/media/kof/kof17/recordings/field/2024/101NIKON"
output_file="Sběr_kof_24.mp4"
interval=9.42 # každých 15 sekund
duration=0.04 # délka klipu
rm /tmp/*.mp4
# Dočasný soubor pro seznam klipů
temp_list=$(mktemp)
# Vymaž dočasný seznam, pokud existuje
> "$temp_list"
# Funkce pro porovnávání dvou čísel pomocí bc
compare_numbers() {
local num1="$1"
local num2="$2"
if [ "$(echo "$num1 < $num2" | bc)" -eq 1 ]; then
return 0
else
return 1
fi
}
# Funkce pro sčítání dvou čísel pomocí bc
add_numbers() {
local num1="$1"
local num2="$2"
echo "$num1 + $num2" | bc
}
# Projdi všechny soubory ve složce
for video in "$input_dir"/*.MP4; do
# Zjisti délku videa (v sekundách, s přesností na tři desetinná místa)
total_seconds=$(ffmpeg -i "$video" 2>&1 | grep "Duration" | awk '{split($2,a,":"); print a[1]*3600 + a[2]*60 + a[3]}' | bc)
# Kontrola, zda byl správně získán total_seconds
if [ -z "$total_seconds" ] || [ "$(echo "$total_seconds < 0" | bc)" -eq 1 ]; then
echo "Nelze získat délku videa pro $video. Přeskočeno."
continue
fi
# Každých $interval sekund vystřihni klip o délce $duration sekund
start="0"
while compare_numbers "$start" "$total_seconds"; do
output_clip=$(mktemp --suffix=.mp4)
# Přidání nuly před desetinné číslo, pokud je potřeba
start_formatted=$(printf "%.6f\n" "$start")
start_formatted=$(echo "$start_formatted" | awk '{print ($1 < 1 && $1 > 0) ? "0"$0 : $0}')
# Výstup z ffmpeg se nyní zapisuje do /dev/null pro odstranění výstupu
ffmpeg -y -ss "$start_formatted" -i "$video" -t "$duration" -vf "setpts=N/FRAME_RATE/TB" -af "asetpts=N/SR/TB" -c:v h264 -qp 19 -c:a aac -b:a 256K -bsf:v h264_mp4toannexb -f mpegts "$output_clip"
#ffmpeg -y -ss "$start_formatted" -i "$video" -t "$duration" -vf "setpts=N/FRAME_RATE/TB" -af "asetpts=N/SR/TB" -c h264 -qp 19 -c:a aac -b:a 256K "$output_clip"
# Ověření, že klip byl správně vytvořen
if [ $? -eq 0 ]; then
echo "file '$output_clip'" >> "$temp_list"
else
echo "Při zpracování souboru $video došlo k chybě, přeskočeno."
rm "$output_clip"
fi
# Zvýšíme startovací čas o interval
start=$(add_numbers "$start" "$interval")
done
done
# Spoj všechny klipy do jednoho souboru, pokud je seznam klipů neprázdný
if [ -s "$temp_list" ]; then
ffmpeg -fflags +genpts -loglevel panic -f concat -safe 0 -i "$temp_list" -c:v copy -c:a copy -absf aac_adtstoasc -flags global_header -y "$output_file"
else
echo "Žádné klipy nebyly vytvořeny."
fi
# Smaž dočasné soubory
rm "$temp_list"