[Bash] While read line & awk

While read line & awk [Bash] - Shell/Batch - Programmation

Marsh Posté le 17-08-2016 à 16:36:56    

Salut,
 
J'aimerais automatiser la découpe d'un fichier audio (pour enlever les pubs par exemple) en utilisant ffmpeg.
 
Voici mon fichier cut.txt sur lequel je me base pour faire le découpage :  
 

Code :
  1. 1 00:00:00 00:09:05
  2. 2 00:11:52 00:07:48
  3. 3 00:29:10 00:06:32
  4. 4 00:39:01 00:07:01
  5. 5 00:49:48 00:03:45
  6. 6 01:00:44 00:05:54
  7. 7 01:09:42 00:13:58
  8. 8 01:33:40 00:08:28
  9. 9 01:46:00 00:04:25
  10. 10 01:56:03 00:06:42
  11. 11 02:05:43 00:08:31
  12. 12 02:17:12 00:03:46
  13. 13 02:29:30 00:07:38
  14. 14 02:41:12 00:06:26
  15. 15 02:53:15 00:07:50
  16. 16 03:03:40 00:15:27
  17. 17 03:28:27 00:07:18
  18. 18 03:38:58 00:05:31
  19. 19 03:47:31 00:05:44
  20. 20 03:58:49 00:20:52


 
La première colonne est le nom du fichier de sortie ($file)
La seconde colonne est la position de départ du fichier (-ss pour ffmpeg - $ss)
La dernière colonne est la durée de découpe du fichier (-t pour ffmpeg - $t)
 
Par exemple, la première ligne via la commande ffmpeg ressemblera à :  
 

Code :
  1. ffmpeg -i input.mp3 -ss 00:00:00 -t 00:09:05 -acodec copy 1.mp3


 
Au lieu de faire 20 fois la même commande, je mets tout ça dans une boucle, ça fonctionne nickel en mode test avec un echo :  
 

Code :
  1. while read line; do file=$(echo "$line" | awk '{print $1}'); ss=$(echo "$line" | awk '{print $2}'); t=$(echo "$line" | awk '{print $3}'); echo "ffmpeg -i input.mp3 -ss $ss -t $t -acodec copy $file.mp3"; done < cut.txt
  2. ffmpeg -i input.mp3 -ss 00:00:00 -t 00:09:05 -acodec copy 1.mp3
  3. ffmpeg -i input.mp3 -ss 00:11:52 -t 00:07:48 -acodec copy 2.mp3
  4. ffmpeg -i input.mp3 -ss 00:29:10 -t 00:06:32 -acodec copy 3.mp3
  5. ffmpeg -i input.mp3 -ss 00:39:01 -t 00:07:01 -acodec copy 4.mp3
  6. ffmpeg -i input.mp3 -ss 00:49:48 -t 00:03:45 -acodec copy 5.mp3
  7. ffmpeg -i input.mp3 -ss 01:00:44 -t 00:05:54 -acodec copy 6.mp3
  8. ffmpeg -i input.mp3 -ss 01:09:42 -t 00:13:58 -acodec copy 7.mp3
  9. ffmpeg -i input.mp3 -ss 01:33:40 -t 00:08:28 -acodec copy 8.mp3
  10. ffmpeg -i input.mp3 -ss 01:46:00 -t 00:04:25 -acodec copy 9.mp3
  11. ffmpeg -i input.mp3 -ss 01:56:03 -t 00:06:42 -acodec copy 10.mp3
  12. ffmpeg -i input.mp3 -ss 02:05:43 -t 00:08:31 -acodec copy 11.mp3
  13. ffmpeg -i input.mp3 -ss 02:17:12 -t 00:03:46 -acodec copy 12.mp3
  14. ffmpeg -i input.mp3 -ss 02:29:30 -t 00:07:38 -acodec copy 13.mp3
  15. ffmpeg -i input.mp3 -ss 02:41:12 -t 00:06:26 -acodec copy 14.mp3
  16. ffmpeg -i input.mp3 -ss 02:53:15 -t 00:07:50 -acodec copy 15.mp3
  17. ffmpeg -i input.mp3 -ss 03:03:40 -t 00:15:27 -acodec copy 16.mp3
  18. ffmpeg -i input.mp3 -ss 03:28:27 -t 00:07:18 -acodec copy 17.mp3
  19. ffmpeg -i input.mp3 -ss 03:38:58 -t 00:05:31 -acodec copy 18.mp3
  20. ffmpeg -i input.mp3 -ss 03:47:31 -t 00:05:44 -acodec copy 19.mp3
  21. ffmpeg -i input.mp3 -ss 03:58:49 -t 00:20:52 -acodec copy 20.mp3


 
Dès que je retire mon echo pour effectuer les 20 commandes, certaines passent, d'autres non :/
Par exemple, la première passe nickel, la seconde fail :
 

Code :
  1. while read line; do file=$(echo "$line" | awk '{print $1}'); ss=$(echo "$line" | awk '{print $2}'); t=$(echo "$line" | awk '{print $3}'); ffmpeg -i input.mp3 -ss $ss -t $t -acodec copy $file.mp3; done < cut.txt
  2. ffmpeg version 2.6.9 Copyright (c) 2000-2016 the FFmpeg developers
  3.   built with gcc 4.9.2 (Debian 4.9.2-10)
  4.   configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/x86_64-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libpulse --disable-mips32r2 --disable-mipsdspr1 --disable-mipsdspr2 --enable-libvidstab --enable-libzvbi --enable-avresample --disable-htmlpages --disable-podpages --enable-libutvideo --enable-libfdk-aac --enable-libx265 --enable-libiec61883 --enable-vaapi --enable-libdc1394 --disable-altivec --shlibdir=/usr/lib/x86_64-linux-gnu
  5.   libavutil      54. 20.100 / 54. 20.100
  6.   libavcodec     56. 26.100 / 56. 26.100
  7.   libavformat    56. 25.101 / 56. 25.101
  8.   libavdevice    56.  4.100 / 56.  4.100
  9.   libavfilter     5. 11.102 /  5. 11.102
  10.   libavresample   2.  1.  0 /  2.  1.  0
  11.   libswscale      3.  1.101 /  3.  1.101
  12.   libswresample   1.  1.100 /  1.  1.100
  13.   libpostproc    53.  3.100 / 53.  3.100
  14. [mp3 @ 0x953560] Estimating duration from bitrate, this may be inaccurate
  15. Input #0, mp3, from 'input.mp3':
  16.   Duration: 04:31:04.59, start: 0.000000, bitrate: 127 kb/s
  17.     Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
  18. Output #0, mp3, to '1.mp3':
  19.   Metadata:
  20.     TSSE            : Lavf56.25.101
  21.     Stream #0:0: Audio: mp3, 44100 Hz, stereo, 128 kb/s
  22. Stream mapping:
  23.   Stream #0:0 -> #0:0 (copy)
  24. Press [q] to stop, [?] for help
  25. size=    8516kB time=00:09:05.01 bitrate= 128.0kbits/s   
  26. video:0kB audio:8516kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.005298%
  27. ffmpeg version 2.6.9 Copyright (c) 2000-2016 the FFmpeg developers
  28.   built with gcc 4.9.2 (Debian 4.9.2-10)
  29.   configuration: --prefix=/usr --extra-cflags='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security ' --extra-ldflags='-Wl,-z,relro' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/x86_64-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libpulse --disable-mips32r2 --disable-mipsdspr1 --disable-mipsdspr2 --enable-libvidstab --enable-libzvbi --enable-avresample --disable-htmlpages --disable-podpages --enable-libutvideo --enable-libfdk-aac --enable-libx265 --enable-libiec61883 --enable-vaapi --enable-libdc1394 --disable-altivec --shlibdir=/usr/lib/x86_64-linux-gnu
  30.   libavutil      54. 20.100 / 54. 20.100
  31.   libavcodec     56. 26.100 / 56. 26.100
  32.   libavformat    56. 25.101 / 56. 25.101
  33.   libavdevice    56.  4.100 / 56.  4.100
  34.   libavfilter     5. 11.102 /  5. 11.102
  35.   libavresample   2.  1.  0 /  2.  1.  0
  36.   libswscale      3.  1.101 /  3.  1.101
  37.   libswresample   1.  1.100 /  1.  1.100
  38.   libpostproc    53.  3.100 / 53.  3.100
  39. [mp3 @ 0x1dd1a00] Estimating duration from bitrate, this may be inaccurate
  40. Input #0, mp3, from 'input.mp3':
  41.   Duration: 04:31:04.59, start: 0.000000, bitrate: 127 kb/s
  42.     Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
  43. Invalid duration specification for t: -acodec


 
Ok ...
 

Code :
  1. desk@home:~$ echo $file
  2. :11:52
  3. desk@home:~$ echo $ss
  4. 00:07:48
  5. desk@home:~$ echo $t
  6. > Rien


 
WTF ?!
Pourquoi tout est modifié alors qu'en mode test avec le echo tout est nickel ?
 
Merci pour votre aide :)

Reply

Marsh Posté le 17-08-2016 à 16:36:56   

Reply

Marsh Posté le 18-08-2016 à 22:08:04    

Comme tu as pu constater : $ss a la valeur attendue pour $t, et $file possède la valeur de $ss.
Est-ce  qu'il ny a pas des incohérences (caractères spéciaux...) dans ton fichier cut.txt ?

Reply

Marsh Posté le 19-08-2016 à 10:13:10    

Normalement non, il est tel quel indiqué dans le 1er bloc code.

Reply

Marsh Posté le 19-08-2016 à 10:51:57    

Bon, j'ai résolu le problème en utilisant une boucle for à la place :
 

Code :
  1. old_IFS=$IFS
  2. IFS=$'\n'
  3. for i in `cat cut.txt`; do file=$(echo "$i" | awk '{print $1}'); ss=$(echo "$i" | awk '{print $2}'); t=$(echo "$i" | awk '{print $3}'); echo "ffmpeg -i input.mp3 -ss $ss -t $t -acodec copy $name.mp3"; done
  4. IFS=$old_IFS

Reply

Marsh Posté le 21-08-2016 à 12:51:48    

http://unix.stackexchange.com/ques [...] -in-a-loop

Code :
  1. while read file ss t ; do   ffmpeg -i input.mp3 -ss "$ss" -t "$t" -acodec copy "$file.mp3" < /dev/null ; done < cut.txt

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed