Pagina 1 van 1

Script: video uitsplitsen in frames

Geplaatst: Wo 11 Aug 2021, 18:50
door Mogenblue
Met dit script kun je een video in frames uitsplitsen.
Hierdoor kun je gemakkelijk een individueel frame selecteren wat je verder wil gebruiken.

Let op: grote video's produceren veel frames. Dus dat kan lang duren en het kan veel schijfruimte in beslag nemen.

Het script heet video-split-to-frames.sh en dit staat er in:

Code: Selecteer alles

#!/bin/bash

# video uitsplitsen in frames

# selecteer video
VideoMap="/home/mogenblue/video"
ImportVideo="test opname.mp4"

ImagePrefix="beeld"
BeeldFormaat="jpg"

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

echo .
echo .
echo .
echo "Bezig met uitsplitsen ..."

cd "${VideoMap}"

# verwijder alle afbeeldingen van eerdere uitsplitsing
rm ${ImagePrefix}*

# video uitsplitsen
ffmpeg -y -r 1 -i "${ImportVideo}" -r 1 "${ImagePrefix}%06d.${BeeldFormaat}"

echo klaar.
Het script moet uitvoerbaar worden gemaakt voor je het kan gebruiken.

Re: Script: video uitsplitsen in frames

Geplaatst: Wo 11 Aug 2021, 20:58
door Mogenblue
Het script is erg basaal. Ik heb het maar even in elkaar geflanst.
Als je het formaat verandert van jpg naar png krijg je een verliesvrije uitvoer. Dus scherpere beelden, maar ze zijn ook veel groter, misschien wel 10x zo groot als jpg.

Re: Script: video uitsplitsen in frames

Geplaatst: Wo 11 Aug 2021, 21:44
door dirkjanl
Leuk en bedankt, ga ik uitproberen.

Re: Script: video uitsplitsen in frames

Geplaatst: Do 12 Aug 2021, 08:12
door Mogenblue
Dit script is wat eenvoudiger in gebruik. Je hoeft alleen het pad en de naam van het videobestand in één variabele te plakken.
In de bestandbeheerder kopieer je dan het gewenste videobestand en dan plak je dat tussen de dubbele quotes in het script. Dan wordt automatisch het hele pad en de bestandnaam geplakt.
Het script splitst zelf het pad en de bestandnaam uit elkaar.

Het script heet video-split-to-frames.sh en dit staat er in:

Code: Selecteer alles

#!/bin/bash

# video uitsplitsen in frames

# selecteer video
# kopieer het videobestand in bestandbeheerder en plak tussen de dubbele quotes hieronder
ImportVideo="/home/mogenblue/video/test opname.mp4"


ImagePrefix="beeld"
BeeldFormaat="png" # png: verliesvrije uitvoer; jpg: efficiëntere uitvoer


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

echo .
echo .
echo .
echo "Bezig met uitsplitsen ..."

VideoMap=$(dirname "${ImportVideo}")
VideoFile=$(basename "${ImportVideo}")

echo VideoMap is: $VideoMap
echo VideoFile is: $VideoFile

echo .
echo .

cd "${VideoMap}"

# verwijder alle afbeeldingen van eerdere uitsplitsing
rm ${ImagePrefix}*

# video uitsplitsen
ffmpeg -y -r 1 -i "${VideoFile}" -r 1 "${ImagePrefix}%06d.${BeeldFormaat}"

echo klaar.

Referentie:
How to get a file directory path from file path?

Re: Script: video uitsplitsen in frames

Geplaatst: Do 12 Aug 2021, 19:45
door dirkjanl
Ja, werkt prima en inderdaad iets gebruiksvriendelijker. Leuk weer!
Een video van 28 seconden geeft 844 frames. Tijd ben ik vergeten bij te houden, maar maximaal een minuut zou ik zeggen.

Re: Script: video uitsplitsen in frames

Geplaatst: Do 12 Aug 2021, 20:27
door Mogenblue
Tijd??
Zei je tijd??

Code: Selecteer alles

#!/bin/bash

# video uitsplitsen in frames

# selecteer video
# kopieer het videobestand in bestandbeheerder en plak tussen de dubbele quotes hieronder
ImportVideo="/home/mogenblue/video/test opname.mp4"

ImagePrefix="beeld"
BeeldFormaat="png" # png: verliesvrije uitvoer; jpg: efficiëntere uitvoer

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

# functie voor berekening tijdverschil in seconden, op milliseconden nauwkeurig
# de functie moet gedeclareerd worden voordat je hem kan gebruiken

# functie tijdverschil starttijd eindtijd => tijdverschil
# uitvoer is tijdverschil in seconden
# invoer- en uitvoerformaat '12:54:42,313648710' '12:54:43,319022259' => 1,005
tijdverschil() {

# declareer variabele lokaal en bereken verschil in nanoseconden
local TimeD=$(( $(date '+%s%N' --date="$2") - $(date '+%s%N' --date="$1") ))

# omrekenen naar seconden en afronden op 3 decimalen
TimeD=$(echo "scale=3; $TimeD / 1000000000" | bc)
# verwissel lokale decimaal scheider van punt naar komma
TimeD=$(echo ${TimeD/./,})
# plaats een nul voor waarden kleiner dan 1 seconde (,531 wordt 0,531) en rond af op 3 decimalen
printf -v TimeD "%-0.3f" $TimeD

echo $TimeD

}

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


echo .
echo .
echo .
echo "Bezig met uitsplitsen ..."

# set starttijd
stime=$(date +%H:%M:%S,%N)

VideoMap=$(dirname "${ImportVideo}")
VideoFile=$(basename "${ImportVideo}")

echo VideoMap is: $VideoMap
echo VideoFile is: $VideoFile

echo .
echo .

cd "${VideoMap}"

# verwijder alle afbeeldingen van eerdere uitsplitsing
rm ${ImagePrefix}*

# video uitsplitsen
ffmpeg -y -r 1 -i "${VideoFile}" -r 1 "${ImagePrefix}%06d.${BeeldFormaat}"

echo .
echo .
# set eindtijd
etime=$(date +%H:%M:%S,%N)
# bereken verschil
vtime=$(tijdverschil "$stime" "$etime")
# toon resultaat
echo "eindtijd is $etime"
echo "starttijd is $stime"
echo "tijdverschil is $vtime"

echo klaar.

Deze berekent ook de verstreken tijd. :idee:

Re: Script: video uitsplitsen in frames

Geplaatst: Do 12 Aug 2021, 21:48
door dirkjanl
;)

Re: Script: video uitsplitsen in frames

Geplaatst: Wo 08 Sep 2021, 07:52
door Crojav
ImportVideo="/home/mogenblue/video/test opname.mp4"

Unix/Linux:

Code: Selecteer alles

ImportVideo="/home/mogenblue/video/test-opname.mp4"
of:
ImportVideo="/home/mogenblue/video/test_opname.mp4"
of:
ImportVideo="/home/mogenblue/video/TestOpname.mp4"

Re: Script: video uitsplitsen in frames

Geplaatst: Wo 08 Sep 2021, 09:49
door Mogenblue
ImportVideo="/home/mogenblue/video/test opname.mp4"

Unix/Linux:

Code: Selecteer alles

ImportVideo="/home/mogenblue/video/test-opname.mp4"
of:
ImportVideo="/home/mogenblue/video/test_opname.mp4"
of:
ImportVideo="/home/mogenblue/video/TestOpname.mp4"

Als ik er spaties tussenzet gaat het gewoon goed. Dat komt omdat ik het tussen dubbele quotes heb gezet. Tussen enkele quotes kan ook, maar dan kun je er geen variabelen in gebruiken zoals in
ImportVideo="/home/$USER/video/test opname.mp4"

Het komt wel eens voor dat een script stukloopt op een pad of bestandnaam, maar dan blijkt altijd dat ik het niet tussen quotes had gezet.
Dat gebeurt dan als je die variabele verderop wil gebruiken en hem dan niet tussen quotes zet.

VideoMap="/home/mogenblue/video/favoriete videos"

cd ${VideoMap}
werkt niet want resulteert in
cd /home/mogenblue/video/favoriete videos

cd "${VideoMap}"
werkt wel want resulteert in
cd "/home/mogenblue/video/favoriete videos"

ffmpeg -y -r 1 -i ${VideoFile} -r 1 "${ImagePrefix}%06d.${BeeldFormaat}"
werkt niet om dezelfde reden

ffmpeg -y -r 1 -i "${VideoFile}" -r 1 "${ImagePrefix}%06d.${BeeldFormaat}"
werkt wel om dezelfde reden

Bij gebruik moet je dan dubbele quotes gebruiken omdat je de variabele daar gebruikt ipv een letterlijke waarde. Bij een letterlijke waarde zou je met enkele quotes kunnen volstaan, maar als er spaties in het pad of bestandsnaam staan moet je altijd quotes gebruiken.