Script: van fotoreeks naar timelapse video

De plek voor je tutorials en howto's
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Script: van fotoreeks naar timelapse video

Berichtdoor Mogenblue » Ma 23 Nov 2020, 17:15

Ik maak regelmatig een timelapse video van een fotoreeks. Het leek me wel aardig om het script dat ik hiervoor gemaakt heb te delen.
Bovenaan het script staan een aantal variabelen zodat je het eenvoudig aan je eigen wensen kan aanpassen. Mijn eigen script is nog wat uitgebreider met een paar extra controles voor automatisch inlezen op de nas, maar dat laat ik er hier maar uit.

In dit script ga ik er vanuit dat de fotobestanden namen hebben zoals IMG_20201112_125838.jpg
Ik gebruik namelijk het datum en tijdgedeelte van het eerste fotobestand voor de naam van de timelapse video.

Code: Selecteer alles

#!/bin/bash

TimeLapseMap="/home/mogenblue/Afbeeldingen/timelapse"
ImportMap="${TimeLapseMap}/a-import"
WerkMap="${TimeLapseMap}/b-werk"
ExportMap="${TimeLapseMap}/c-export"

# argumenten voor verplaatsen afbeeldingen van a-import naar b-werk en video van b-werk naar c-export
# -u, --update skip files that are newer on the receiver
# -s, --protect-args no space-splitting; wildcard chars only
# --remove-source-files sender removes synchronized files (non-dir)
VerPlaatsOpties='-u -s --remove-source-files'

MinAantalFotos=360

WerkFilePrefix='werk'

# argumenten voor video samenstellen
FotosPerMinuut='6'
FramesPerSeconde='12'
PixelFormat='yuv420p'
SchermFormaat='1426x1080'
VideoPrefix='timelapse'

#-------------------------------------------------------------------------------------------------------------

# controle uitvoeren voordat de verwerking kan beginnen

echo .
echo .
echo .

# controleer minimum aantal foto's voor verwerking

cd "$ImportMap"

AantalImportFotos=$(ls *.jpg| wc -l)

if [ $AantalImportFotos -lt $MinAantalFotos ]
then
echo "${AantalImportFotos} bestanden, te weinig fotobestanden voor video."
exit
fi

echo "ImportMap is gereed."


#-------------------------------------------------------------------------------------------------------------

# verwerking kan beginnen

# set filename van de video
FileList=(*.jpg)
OpnameTijd=$(expr $AantalImportFotos / $FotosPerMinuut)
VideoTijd=$(expr $AantalImportFotos / $FramesPerSeconde)
VideoFile="${VideoPrefix}_${FileList[0]:4:15}_F${AantalImportFotos}_D${OpnameTijd}m_R${VideoTijd}s.mp4"

echo "Aantal foto's in importmap is $AantalImportFotos."
echo "Video duur is $VideoTijd seconden."
echo "Video naam is: $VideoFile"

# foto bestanden verplaatsen van a-import naar b-werk
echo "Foto bestanden worden verplaatst van a-import naar b-werk ..."
rsync $VerPlaatsOpties *.jpg "$WerkMap"

cd "$WerkMap"

echo "Foto bestanden worden gekopiëerd van b-werk naar c-export ..."
# foto bestanden kopiëren van b-werk naar c-export
rsync *.jpg "$ExportMap"

echo "Bestanden hernoemen ..."
a=1
for i in *.jpg; do
new=$WerkFilePrefix$(printf "%04d.jpg" "$a") #04 pad to length of 4
mv -i -- "$i" "$new"
let a=a+1
done

echo "$AantalImportFotos fotobestanden worden samengevoegd met $FramesPerSeconde frames per seconde."
time ffmpeg -loglevel error -framerate $FramesPerSeconde -i $WerkFilePrefix%04d.jpg -c:v libx264 -profile:v high -crf 20 -s $SchermFormaat $VideoFile

# video bestand verplaatsen van b-werk naar c-export
rsync $VerPlaatsOpties $VideoFile "$ExportMap"

# foto bestanden uit map b-werk verwijderen
rm *.jpg


echo .
echo .
echo .
echo "Klaar."


Dit script heb ik natuurlijk niet helemaal zelf gemaakt. Met behulp van stackoverflow, askubuntu en diverse andere sites heb ik dit kunnen maken.

Terug naar “Tutorials / Howto's”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 10 gasten