Script: video uitsplitsen in frames

Alles over programmeren in Linux
Gebruikersavatar
Mogenblue
Moderator
Moderator
Berichten: 200
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Script: video uitsplitsen in frames

Berichtdoor Mogenblue » Wo 11 Aug 2021, 18:50

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.
Gebruikersavatar
Mogenblue
Moderator
Moderator
Berichten: 200
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: video uitsplitsen in frames

Berichtdoor Mogenblue » Wo 11 Aug 2021, 20:58

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.
Gebruikersavatar
dirkjanl
Held
Held
Berichten: 738
Lid geworden op: Do 21 Mar 2013, 13:40
Locatie: Borger
Contact:

Re: Script: video uitsplitsen in frames

Berichtdoor dirkjanl » Wo 11 Aug 2021, 21:44

Leuk en bedankt, ga ik uitproberen.
Linux Mint 19.3 en LM 20 Cinnamon op productiePC's. Op testbak LM 20.2 Cin. APLinux op MuziekPC Gouden tips: viewtopic.php?f=1&t=3264
Gebruikersavatar
Mogenblue
Moderator
Moderator
Berichten: 200
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: video uitsplitsen in frames

Berichtdoor Mogenblue » Do 12 Aug 2021, 08:12

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?
Gebruikersavatar
dirkjanl
Held
Held
Berichten: 738
Lid geworden op: Do 21 Mar 2013, 13:40
Locatie: Borger
Contact:

Re: Script: video uitsplitsen in frames

Berichtdoor dirkjanl » Do 12 Aug 2021, 19:45

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.
Linux Mint 19.3 en LM 20 Cinnamon op productiePC's. Op testbak LM 20.2 Cin. APLinux op MuziekPC Gouden tips: viewtopic.php?f=1&t=3264
Gebruikersavatar
Mogenblue
Moderator
Moderator
Berichten: 200
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: video uitsplitsen in frames

Berichtdoor Mogenblue » Do 12 Aug 2021, 20:27

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:
Gebruikersavatar
dirkjanl
Held
Held
Berichten: 738
Lid geworden op: Do 21 Mar 2013, 13:40
Locatie: Borger
Contact:

Re: Script: video uitsplitsen in frames

Berichtdoor dirkjanl » Do 12 Aug 2021, 21:48

;)
Linux Mint 19.3 en LM 20 Cinnamon op productiePC's. Op testbak LM 20.2 Cin. APLinux op MuziekPC Gouden tips: viewtopic.php?f=1&t=3264
Crojav
Junior
Junior
Berichten: 31
Lid geworden op: Ma 04 Nov 2019, 17:56

Re: Script: video uitsplitsen in frames

Berichtdoor Crojav » Wo 08 Sep 2021, 07:52

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"
Gebruikersavatar
Mogenblue
Moderator
Moderator
Berichten: 200
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Script: video uitsplitsen in frames

Berichtdoor Mogenblue » Wo 08 Sep 2021, 09:49

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.

Terug naar “Programmeren”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 1 gast