Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
972 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Bash] While read line & awk

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Bash] While read line & awk

n°2286607
MaRTy59
Posté le 17-08-2016 à 16:36:56  profilanswer
 

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 :)

mood
Publicité
Posté le 17-08-2016 à 16:36:56  profilanswer
 

n°2286656
jlighty
Posté le 18-08-2016 à 22:08:04  profilanswer
 

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 ?

n°2286664
MaRTy59
Posté le 19-08-2016 à 10:13:10  profilanswer
 

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

n°2286665
MaRTy59
Posté le 19-08-2016 à 10:51:57  profilanswer
 

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

n°2286730
roondar
Posté le 21-08-2016 à 12:51:48  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Bash] While read line & awk

 

Sujets relatifs
Démarrer dans une tache panifiée Git Bash minimisé[RSOLU] [bash] while avec if/elif/fi qui tourne en boucle
problème whileThe '''Get_Line''' mystery
[Resolu]Get_line en début de programmeInteractions script bash et application en ligne de commande
variable dans une condition bashProblème de sortie d'une boucle while en PYTHON
Plus de sujets relatifs à : [Bash] While read line & awk


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR