Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Script om film te knippen en plakken  (gelezen 828 keer)

Offline ar

  • Lid
Script om film te knippen en plakken
« Gepost op: 2015/05/03, 18:33:01 »
(Mijn eerste uitgebreide versie is door het forum weggegooid om dat de bijlage knippen.sh niet als bijlage mag worden bijgesloten. Daarom nu alleen het script.  Sorry).

Installeer ffmpeg, maak knippen.sh, het script hieronder uitvoerbaar, zet de tijden in een *.txt bestand bijvoorbeeld
 01:12 10:23
13:23  13:25
open een opdracht venster
geeft de opdracht
 ./knippen.sh "langenaam van de film.ts"
wacht even en "langenaam van de filmklein.mp4 verschijnt.
#!/bin/bash
# Geschreven door Ar 24 augustus 2014
# Eerste en laaste bash script ooit. Wat een drama!

# Nog te doen:
# drag en drop mogelijk maken
# tijdelijk bestand omzeilen en alles op één regel plaatsen.
# voortgang verwerking beter aangeven.
# maar ik ben ermee opgehouden

# configuatie
ext="mp4"
/bin/date >knippen.log  #>> is toevoegen, > is elke keer nieuw maken
# documentation
documentatietonen="no"
if [ "$documentatietonen" == "yes" ] #denk aan de spaties na en voor [] en rond ==
 then
m=" Dit programma knipt een of meerder segmenten uit een video.ts bestand,\n"
m="$m plakt alle segmenten aan elkaar en kopieer het bestand naar een\n"
m="$m video.mp4 bestand. Het programma kopieert de originele video en audio\n"
m="$m gegevens. Kwaliteitsverlies treedt dus niet op en de verwerking is supersnel.\n"
m="$m Maak een video.txt aan (zelfde naam als video bestand met .txt extensie)\n"
m="$m waarin op elke regel de begin en eindtijden staan van een fragment.\n"
m="$m De tijd is in hh:mm:ss[.xxx] formaat, .xxx staat voor een frame binnen een seconde.\n"
m="$m Maak net zoveel regels aan als er segmenten zijn.\n"
m="$m Het eindresultaat is een geknipt en geplakt video.mp4 bestand.\n"
m="$m Zet om een naam met spaties en bijzondere tekens aanhalingstekens.\n"
m="$m Bijvoorbeeld: ./knippen.sh 'Mijn lange naam (1).ts'."
zenity --info --title "Video opdelen" --text="`printf "$m" `"
 fi

echo "Het bestand:"
file=${1}
  if [ ! -e "$file" ]    # Check if file exists.
  then
if [ -z $file ]
then
m="Bestandnaam ontbreekt.\n\nGeef wel een bestand op."
else
m="Het bestand $file bestaat niet."
fi
zenity --error --title="Let op" --text="`printf "$m" `"
#    echo "*** Let op! $file bestaat niet. ****"; echo
exit
   fi
echo «$file»

echo "knippen en plakken met de informatie uit:"
filename=${1%.*}
txtfile=$filename.txt # entensie vervangen door .txt
  if [ ! -e "$txtfile" ] # Check if file exists.
  then
zenity --error --title="Let op" --text="Het bestand $txtfile bestaat niet."
#    echo "*** Let op! $txtfile bestaat niet. ****"; echo
exit
   fi
echo "«$txtfile»"

regex="^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(.([0-9]{3}))?$"   # regular exepression hh:mm:ss.sss
# (.([0-9]{3}))? toegevoegd
# http://stackoverflow.com/questions/8318236/regex-pattern-for-hhmmss-time-string

segment=0
while read -r -u 9 van tot; do # -u 9 is een aparte filedescriptor om variabelen niet greadily te laten zijn
if [ -z $van ] # test of de regel leeg is, bijvoorbeeld een lege regels aan het einde van het bestand.
then
echo "lege regel overgeslagen"
else
if [[ $van =~ $regex ]]
then
  zenity --error --title="Let op" --text="Maak de tijdnotatie goed, zoals hh:mm:ss.sss"
  exit
else
  let "segment +=1"
    printf 'Wacht totdat segment %s van: %s tot: %s is verwerkt.\n' $segment $van $tot
  ffmpeg -y -i "$file" -ss $van -to $tot -c:a copy -c:v copy -avoid_negative_ts 1 "$filename-part$segment.$ext" >>knippen.log 2>&1
fi
fi
done 9< "$txtfile"

if  [ "$segment" == 1 ] # slechts één deel en die gewoon herhoemen
then
mv "$filename-part1.$ext" "$filename.$ext"
else
# for f in .. geeft foutcode Impossible to open '/dev/fd/naam bestand. Om dit te omzeilen een tijdelijk bestand aanmaken.
# ffmpeg -f concat -i <(for f in $("$filename-part"*".$ext"); do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename.$ext" >> knippen.log 2>&1
echo "Alle $segment segmenten samenvoegen. Wacht tot het eindresultaat klaar is."
#   echo -f concat -i <(for f in "$filename"-part*.$ext; do echo file $(pwd)/"$f"; done) -c:a copy -c:v copy "$filename.$ext"
# ffmpeg -f concat -i <(for f in "$filename"-part*.$ext; do echo file $(pwd)/"$f"; done) -c:a copy -c:v copy "$filename.$ext" >> knippen.log 2>&1
#echo "proef klaar"
#exit
# for f in "$filename"*broederschap*.$ext; do echo file $(pwd)/"$f";
printf "file '%s'\n" "$filename-part"*".$ext" > "$filename.lst"
ffmpeg -y -f concat -i "$filename.lst" -c copy "$filename-klein.$ext" >> knippen.log 2>&1 #overschrijf als het bestand al bestaat.
rm "$filename.lst"
fi

find . -name "$filename-part*.$ext" -print0 | while read -d $'\0' "bestand"
do
   rm "$bestand"
done
echo "Het bestand: «$filename.$ext» staat klaar."
echo "In het bestand knippen.log staat het verslag van de activiteiten."

moderatoredit: code tags geplaatst.
« Laatst bewerkt op: 2015/05/03, 21:09:57 door Ron »

Offline Nero

  • Lid
Re: Script om film te knippen en plakken
« Reactie #1 Gepost op: 2015/05/03, 20:17:17 »
Als je dat ganse script tussen [code][/code]
tags zet worden de regex elementen niet vervangen door smilies.

Offline MKe

  • Lid
Re: Script om film te knippen en plakken
« Reactie #2 Gepost op: 2015/05/03, 23:08:50 »
Nog beter, zet de boel in git, maak een github account aan en link daar naar toe. Git is zowiezo een goed hulpmiddel als je aan het scripten bent.