[bash] runnen ffmpeg in script past uitkomst aan

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 18:56
Ik gebruik al een hele lange tijd een script in Ubuntu wat goed werkt (op een ander systeem). Ik wou deze ook gebruiken in Fedora. Het enige wat aangepast is dat ik daar "ffmpeg" gebruik ipv "avconv". Dit is vrijwel hetzelfde pakket.

Na rare problemen en debuggen (volledig strippen van script) heb ik de veroorzaker gevonden. Maar geen idee waarom het misgaat.

De goedsituatie, de regel met "ffmpeg" is uitgecomment:
[test@laptop _SCRIPTS]$ ./del.sh -d "/home/test/_TESTENDEL/"
/home/test/_TESTENDEL/film2.mp4
/home/test/_TESTENDEL/film.mp4
INFO: processing file (1/2): "/home/test/_TESTENDEL/film2.mp4"
0
voor herhaling loop
INFO: processing file (2/2): "/home/test/_TESTENDEL/film.mp4"
0
voor herhaling loop
De foutsituatie, de regel staat aan:
[test@laptop _SCRIPTS]$ ./del.sh -d "/home/test/_TESTENDEL/"
/home/test/_TESTENDEL/film2.mp4
/home/test/_TESTENDEL/film.mp4
INFO: processing file (1/2): "/home/test/_TESTENDEL/film2.mp4"
0
voor herhaling loop
INFO: processing file (2/2): "ilm.mp4"
1
voor herhaling loop
wat je dus ziet is dat wanneer "ffmpeg" aanstaat dat de waarde variabele van "$file" aangepast wordt?? 8)7
Het hele pad bij bestand 2 is weggevallen. Dit lijkt ook wat random hoeveel er wegvalt.


Kan iemand dit verklaren? Hebben jullie hetzelfde resultaat in Fedora?
Fedora: Linux laptop.local 3.17.4-200.fc20.x86_64 #1 SMP Fri Nov 21 23:26:41 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Het is met versie 2.1.6 van ffmpeg

Hieronder het script.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash




# $1: complete path to directory
process () {

  
  list=$(find "$1" -maxdepth 1 -type f -name "*.mp4")
  amount=$(echo "$list" | sed '1{/^$/d}' | wc -l)
  currentindex=0

  
  echo "$list"
  
  
  rm -f log.log
  
  
  while read file; do
    currentindex=$((currentindex+1))

    echo "INFO: processing file (${currentindex}/${amount}): \"$file\"" 

    log=$(ffmpeg -y -i "$file" -t 00:02:30  "${file}.mp3"  2>&1)
    #log=$(ffmpeg -y -i "$file" -t 00:02:30  "${file}.mp3"  2>&1)
    #ffmpeg -y -i "$file"  -t 00:02:30  "${file}.mp3" 
    echo $?
    echo "--------" >> log.log
    echo "$log" >> log.log
    


    echo "voor herhaling loop"
  done < <(echo "$list"|sort)

}






DIR=


while getopts ":d:cevlA" opt; do
  case $opt in
    d)
      DIR="$OPTARG"
      ;;

    \?)
      echo "Invalid argument: -$OPTARG" >&2
      exit $E_ARGS
      ;;
  esac
done






process "$DIR"

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 30-09 08:10
Waarom gebruik je een read/echo construct ipv. een for ... in?

Lijkt me dat het daar misgaat

[ Voor 19% gewijzigd door Thralas op 09-12-2014 10:56 ]


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 18:56
ik gebruik deze constructie omdat ik dan na de loop nog steeds een counter kan uitlezen (bijv "currentindex")

Ik heb het ook getest met de volgende gangbare methode:

code:
1
2
3
echo "$list" |sort | while read file; do
...
done


hetzelfde resultaat, ook fouten door "ffmpeg"


veranderen naar:
code:
1
2
3
for file in $list; do
..
done

verhelpt het probleem. Maar deze methode gebruik ik nooit omdat dit niet werkt met bestanden die spaties bevatten.

Acties:
  • 0 Henk 'm!

  • FitzJac
  • Registratie: November 2010
  • Laatst online: 18:06
verander dit
code:
1
ffmpeg -y -i "$file"  -t 00:02:30  "${file}.mp3"

naar dit
code:
1
ffmpeg -y -i "$file"  -t 00:02:30  "${file}.mp3" < /dev/null

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 18:56
aangepast naar:
code:
1
log=$(ffmpeg -y -i "$file" -t 00:02:30  "${file}.mp3" < /dev/null 2>&1)


hiermee is het probleem weg :)
thanks!

Maar wat IS het probleem nu eigenlijk? Is het een bug?

[ Voor 7% gewijzigd door MisterE op 09-12-2014 13:03 ]


Acties:
  • 0 Henk 'm!

  • FitzJac
  • Registratie: November 2010
  • Laatst online: 18:06
Geen bug vlgs mij, ffmpeg "eet" stdin.
Kijk ook HIER eens.

[ Voor 44% gewijzigd door FitzJac op 09-12-2014 13:24 ]


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 18:56
dit zegt de man page trouwens:
-stdin
Enable interaction on standard input. On by default unless standard input is used as an input. To explicitly disable interaction you need to specify "-nostdin".

Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with "ffmpeg
... < /dev/null" but it requires a shell.
Pagina: 1