Nieuws:

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

Auteur Topic: [OPGELOST]: Bash script met user input doet het niet (goed)  (gelezen 1318 keer)

Offline jvecht

  • Lid
    • Just Vecht
[OPGELOST]: Bash script met user input doet het niet (goed)
« Gepost op: 2012/10/14, 00:15:52 »
Ik heb een bash script gemaakt dat drie keer user input vraagt. Het is de bedoeling dat twee commando's voor ffmpeg via dat script wat handiger te gebruiken worden. Bovendien hoef ik de boel dan niet te onthouden of via history die commando's weer op te zoeken.

Citaat
De opdrachten maken via ffmpeg eerst uit een video van mijn videocamera een uitsnede (een clip) vanaf een bepaald moment en van een bepaalde duur. Dan vervolgens wordt de afspeelsnelheid van die korte clip stevig teruggebracht en heb ik een slow motion replay. Vroeger kon ik dat direct in de Openshot video editor via de eigenschappen. Maar dat is niet meer zo, zowel niet op mijn laptop als op de desktop waar ik sinds kort op werk. Er is daar een bug van, waarin Openshot aangeeft dat het programma daarvoor ffmpeg gebruikt en aanbeveelt om dat soort dingen rechtstreeks in ffmpeg te doen.

Nou hou ik wel van scripts maken en nou dan maar eens voor het eerst MET user input.


De twee basis commando's zijn

ffmpeg -ss 00:01:12 -t 00:00:09 -i TEST.MPG -acodec copy -vcodec copy clip-output-file.mp4
en

ffmpeg -i clip-output-file.mp4 -vf "setpts=2.0*PTS" output-slow.mp4
Die resulteren op zich in een nette slow motion video. Niks mis zover.

Het script wat ik gemaakt heb is als volgt:
#!/bin/sh
# Script to create a slow motion clip from a MPG video with ffmpeg. Find start point of the clip in hh:mm:ss and the length of the clip in hh:mm:ss.

echo "This script will change a clip to a slow motion clip. It will ask for the start point in hh:mm:ss format first, then clip duration "

echo "Output will be to a file output-slow.mp4 "

# Ask file name of original video

echo "Give the file name of the original video (must be MPG!!) "

read NAME

# Ask start point

echo "Enter start point of the clip in hh:mm:ss "

read START

# Ask clip length

echo "Enter clip length in hh:mm:ss "

read LENGTH

# creating the clip

ffmpeg -ss $START -t $LENGTH -i $NAME -acodec copy -vcodec copy clip-output-file.mp4

# setting slow motion speed at 1/2 speed

ffmpeg -i clip-output-file.mp4 -vf "setpts=2.0*PTS" output-slow.mp4

Dan krijg ik vervolgens de output:
Citaat
This script will change a clip to a slow motion clip. It will ask for the start point in hh:mm:ss format first, then clip duration
Output will be to a file output-slow.mp4
Give the file name of the original video (must be MPG!!)
TEST.MPG
Enter start point of the clip in hh:mm:ss
00:01:10
Enter clip length in hh:mm:ss
00:00:09
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Jun 12 2012 16:37:58 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mpeg, from 'TEST.MPG':
  Duration: 00:01:21.56, start: 0.114967, bitrate: 9541 kb/s
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x576 [PAR 64:45 DAR 16:9], 9100 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0.1[0x80]: Audio: ac3, 48000 Hz, stereo, s16, 256 kb/s
File 'clip-output-file.mp4' already exists. Overwrite ? [y/N] y
Output #0, mp4, to 'clip-output-file.mp4':
  Metadata:
    encoder         : Lavf53.21.0
    Stream #0.0: Video: mpeg2video, yuv420p, 720x576 [PAR 64:45 DAR 16:9], q=2-31, 9100 kb/s, 25 tbn, 25 tbc
    Stream #0.1: Audio: ac3, 48000 Hz, stereo, 256 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
[mp4 @ 0x8840bc0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 1 >= 1
av_interleaved_write_frame(): Invalid argument
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Jun 12 2012 16:37:58 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x9d00260] moov atom not found
clip-output-file.mp4: Invalid data found when processing input
[/quote]

Dat loopt dus stuk. Ik denk dat de manier waarop ik die drie "user input" gegevens in het script heb verwerkt niet goed is - of niet goed voor ffmpeg. Bij afspelen van het bestand clip-output-file.mp4 komt VLC met een overeenkomstige foutboodschap. Dus gaat het bij de eerste opdracht al fout.

Citaat
Deze video staat (zonder slow motion replays) al op Youtube. Kijk desgewenst hier: http://youtu.be/YNTWZvA7Mk4 Het tijdstip wat ik in de replay wil laten zien is de aanval rond 4:29 waarin een speler uit een vrije worp de bal krijgt en die onder water duwt. Dat mag niet en hij krijgt een vrije worp tegen. De slow motion replay, die ik met de losse opdrachten realiseerde, liet me zien dat de verdediger al - voordat de bal er was - de aanvaller aan het onderduwen was. Dat mag ook weer niet. Dus eigenlijk had die aanvaller ten onrechte een vrije worp tegen gekregen. Zo leer je weer wat, nietwaar.

Leuke klus zover. Maar wat doe ik hier nou fout?

met vriendelijke groeten,

Just Vecht
« Laatst bewerkt op: 2012/10/15, 23:06:56 door jvecht »
GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021

Offline jvecht

  • Lid
    • Just Vecht
Re: Bash script met user input doet het niet (goed)
« Reactie #1 Gepost op: 2012/10/15, 12:19:42 »
Ik zit hier natuurlijk zwaar in mezelf te kletsen, maar ach ... . Je moet wat.

Na een weekendje behangen kwam ik op het idee het eens te proberen met een:

$: read test
$: 00:00:01
$: echo $test
en warempel, de reactie was goed:

$: 00:00:01
Dus in dat lezen van de user input lijkt het niet te zitten. Ik was bang dat die dubbele punten in de tijdnotatie gedonder gaven, maar blijkbaar niet. Na wat naspeurwerk via het onvolprezen G****  O0 liep ik tegen de tip aan om mijn via de user input samengestelde commandoregel in een variabele te vangen en dan vervolgens weer te tonen. Dan kan ik zien of de user input correct is omgezet in het commando wat ik wenste.

Ik ben benieuwd.

GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021

Re: Bash script met user input doet het niet (goed)
« Reactie #2 Gepost op: 2012/10/15, 20:16:02 »
JVecht,

Als je iets in de geest van dit bedoel:
OPDRACHT=$(echo "-ss $START -t $LENGTH -i $NAME -acodec copy -vcodec copy clip-output-file.mp4")
echo $OPDRACHT

Ik kan me vergissen, maar read vanaf de CMDI is niet echt denderend.
Beter is: ScriptNaam Flimpje.mpg StartTijd(HH:MM:SS) Lengte(HH:MM:SS) te gebruiken.

Dan wordt het iets in de geest:
#/bin/bash


if [ $# -ne 3 ]
then
  echo "Usage: `basename $0` Filmpje.mpg Startijd(HH:MM:SS) Lengte(HH:MM:SS)"
  exit 1
fi

# creating the clip
ffmpeg -ss $2 -t $3 -i $1 -acodec copy -vcodec copy clip-output-file.mp4

# setting slow motion speed at 1/2 speed
ffmpeg -i clip-output-file.mp4 -vf "setpts=2.0*PTS" output-slow.mp4




PS,
Je kan ook gebruik maken de zenity opdrachten ter vervanging van read:
http://linux.byexamples.com/archives/259/a-complete-zenity-dialog-examples-1/
http://linux.byexamples.com/archives/265/a-complete-zenity-dialog-examples-2/
« Laatst bewerkt op: 2012/10/15, 20:23:51 door MauRice2 »
MvG,
MauRice
Registered Linux user: 473556

Offline jvecht

  • Lid
    • Just Vecht
Re: Bash script met user input doet het niet (goed)
« Reactie #3 Gepost op: 2012/10/15, 23:04:34 »
Hallo MauRice,

Bedankt! Die zenity opdrachten zijn mooi, zeg!

Ook met de zenity opdrachten liep het niet. Maar het gaf wel een foutboodschap die me op het idee bracht de $NAME variable tussen quotes te zetten. Blijkbaar ging er nog wat zitten tussen $NAME en de -acodec optie wat daar niet hoorde.

Toen draaide het dus wel. Op jouw eerste oplossing moet ik nog studeren. Dat is met mijn beperkte kennis van scripten een stap te ver, maar ik moet zien dat ik dat onder de knie krijg. Ook met dat zenity ga ik nog verder, want die dialoog vensters trekken me erg aan.

Eenmaal de boel aan de gang heb ik (jouw raad in de wind slaand) het read gebruik nog wat verder doorgezet en ook het slowdown effect variabel gemaakt. Overigens heb ik wel gemerkt dat read het niet doet zodra je daar een optie aan toevoegt, zoals -p of -s oid.

Het nu werkende script is nu als volgt:
#!/bin/sh
# Script to create a slow motion clip from a MPG video with ffmpeg. First find start point of the clip in mm:ss and the length of the clip in ss.

echo "This script will change a clip to a slow motion clip. It will ask for the start point of the desired clip in hh:mm:ss format first, then clip duration and last desired slow down effect. 2 is slow, 4 is very slow"

echo "Output will be to a file output-slow.mp4"
echo "----------------"

# Ask file name of original video

echo "Give the file name of the original video (must be MPG!!) "

read NAME

# Ask start point

echo "Enter start point of the clip in mm:ss "

read START

# Ask clip length

echo "Enter clip length in ss "

read LENGTH

echo "Desired speed slow down (2, 3 or 4). 4 is very slow!"

read SPEED

# creating the clip

ffmpeg -ss 00:"$START" -t 00:00:"$LENGTH" -i "$NAME" -acodec copy -vcodec copy clip-output-file.mp4

# setting slow motion speed

ffmpeg -i clip-output-file.mp4 -vf "setpts="$SPEED".0*PTS" output-slow.mp4

Heerlijk gevoel is dat als je de boel draaiend hebt!

Vrijdag aanstaande komt mijn camera weer in stelling bij een oefenwedstrijd tegen een heel sterke tegenstander en bij het editen van de uiteindelijke video met Openshot nu met mooie en hopelijk zeer leerzame slowmotion replays via dit script (de kans dat het team die tegenstander heel goed partij geeft is overigens denkbaar). Yeah!!
GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021

Re: [OPGELOST]: Bash script met user input doet het niet (goed)
« Reactie #4 Gepost op: 2012/10/16, 21:47:24 »
Blij dat het werkt JVecht,

Wat uitleg:

Het eerste stukje (OPDRACHT) is niet meer of minder om dan de argumenten te zien die je met ffmpeg meegeef.
De hele '-ss blabla' dus. handig om te zien of alles wel goed wordt doorgeven.

De tweede stukje werkt met argumenten ipv read, het verwacht er eigenlijk drie.
Meer of minder stop het script met een boodschap.
Met de 3 argumenten "Flimpje.mpg" "StartTijd(HH:MM:SS)" "Lengte(HH:MM:SS)" wordt het scriptje afgehandeld.
MvG,
MauRice
Registered Linux user: 473556

Offline jvecht

  • Lid
    • Just Vecht
Re: [OPGELOST]: Bash script met user input doet het niet (goed)
« Reactie #5 Gepost op: 2012/10/16, 23:06:56 »
Hallo MauRice,

Citaat
Met de 3 argumenten "Flimpje.mpg" "StartTijd(HH:MM:SS)" "Lengte(HH:MM:SS)" wordt het scriptje afgehandeld.

Ik heb hem vanavond zo geprobeerd. Dat liep gesmeerd. Nou eens even stoeien met de verschillende elementen. Als ik iets beetpak wil ik het ook echt onder de knie krijgen.

Bedankt voor de uitleg!

Just
GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021

Offline jvecht

  • Lid
    • Just Vecht
Re: [OPGELOST]: Bash script met user input doet het niet (goed)
« Reactie #6 Gepost op: 2012/10/21, 09:46:05 »
Gisteravond ging mijn scriptje "voor het echie". Dat werd een lekker drama  8-).

De eerste video waarvan ik een stukje in slow motion wilde hebben ging puik. En daarna was het helemaal afgelopen. Herstarten, helemaal koud opnieuw opstarten, alles vanaf de commandoregel .... Niks meer behalve foutmeldingen waar ik als simpel gebruikertje niets mee kon.

Terug naar Internet. Ik vond een veel eenvoudigere opdracht. Daarvan stond het stukje met het bronbestand vooraan. "Ach", dacht ik. "Misschien maakt dat wel uit!" En verdraaid, alles draait weer. Pffff.

Voor de volledigheid is hier het herziene stukje commando:

Fout:

ffmpeg -ss 00:"$START" -t 00:00:"$LENGTH" -i "$NAME" -acodec copy -vcodec copy clip-output-file.mp4
Goed:

ffmpeg -i M2U00"$NAME".MPG -ss 00:"$START" -t 00:00:"$LENGTH" M2U00"$NAME"-tmp.mp4
En hier is ook nog het hele verbeterde script:

#!/bin/sh
# Script to create a slow motion clip from a MPG video with ffmpeg. First find start point of the clip in mm:ss and the length of the clip in ss.

echo "This script will change a clip to a slow motion clip. It will ask for the start point of the desired clip in hh:mm:ss format first, then clip duration and last desired slow down effect. 2 is slow, 4 is very slow"

echo "Output will be to a file output-slow.mp4"
echo "----------------"

# Ask file name of original video

echo "Give the file number *** of the original video minus extension (must be MU200***.MPG!!) "

read NAME

# Ask start point

echo "Enter start point of the clip in mm:ss "

read START

# Ask clip length

echo "Enter clip length in ss "

read LENGTH

echo "Desired speed slow down (2, 3 or 4). 4 is very slow!"

read SPEED

# creating the clip

ffmpeg -i M2U00"$NAME".MPG -ss 00:"$START" -t 00:00:"$LENGTH" M2U00"$NAME"-tmp.mp4

# setting slow motion speed

ffmpeg -i M2U00"$NAME"-tmp.mp4 -vf "setpts="$SPEED".0*PTS" M2U00"$NAME"-slow.mp4

Toelichting: Lui als ik ben heb ik de opgave van de bestandsnaam helemaal aangepast aan het formaat van de bestandsnaam van de bronvideo's van mijn Sony Handicam. Ook in het gerealiseerde bestand komt dat dan weer terug, erg handig in de workflow. Dan tenslotte heb ik ook de instelling voor het slowmotion effect variabel gemaakt.

Ik zie geen verschil tussen de kwaliteit van het oude script en het nieuwe, zij het dat ik maar één echt clipje heb van dat oude script als vergelijk.

met vriendelijke groeten,

Just Vecht
GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021

Offline jvecht

  • Lid
    • Just Vecht
Re: [OPGELOST]: Bash script met user input doet het niet (goed)
« Reactie #7 Gepost op: 2012/11/02, 11:55:52 »
Ik heb dat script nou al weer de nodige keren gebruikt. Het werkt puik.

Binnenkort ga ik er verder mee.

Ik wil het geluidspoor uit de clip apart hebben. Dat moet ffmpeg kunnen. In zo'n slow motion clip loopt het geluidspoor niet slow motion mee. Dat kan natuurlijk ook niet. Meestal zijn het geslaagde doelschoten in het waterpolo. Het gejuich van de supporters is toch wel leuk om ook in de herhaling te laten horen. Maar met de hand zijn dat soort acties op het geluidspoor veel te tijdrovend.

De hele video van slechts rond de vijftien minuten kost een paar uur editen. Het is wel erg leuk werk, maar ik ben wat lui. Als ik nou dat geluidspoor via het script automagisch apart heb ben ik al een eind. Een beetje via de "20% inspanning, 80% resultaat" aanpak misschien. Daar ben ik niet vies van. Het omgekeerde is erger  :o

En ik ga eens zoeken naar een mogelijkheid om heel dat script te verstoppen achter een nette front-end of hoe dat ook heet. Het oog wil ook wat. Dat zenity smaakte naar meer.

met vriendelijke groeten,

Just Vecht
GIMP bundel 2018  38 cursussen met mooi oefenmateriaal. Lekker lezen of er wat van opsteken!
  Boekje "Werken met Xubuntu" 5000+ downloads!
     Het Helpmij Magazine Mei 2021