web-dev-qa-db-fra.com

Conversion de mp4 en mp3 à l'aide d'un script shell

J'ai regardé Conversion de mp4 en mp qui utilise un outil appelé ffmpeg. Le processus est excellent lorsque vous ne devez convertir qu'un seul fichier, mais j'essaie d'automatiser la conversion de mp4 en mp3 pour un répertoire donné.

A titre d'exemple, le répertoire ci-dessous avec tous ses sous-répertoires est donné, c'est-à-dire MusicVideos`:

.
├── Andra
│   └── Andra::Why.mp4
├── Ariana Grande
│   └── Dangerous Woman
│       ├── ArianaGrande::IntoYou.mp4
│       └── ArianaGrande::SideToSide.mp4
├── Justin Bieber
│   └── JustinBieber::LetMeLoveYou.mp4
├── Major Lazer
│   └── De Maxx 37
│       └── MajorLazer::ColdWater.mp4
├── Martin Garrix & Bebe Rexha
│   └── MartinGarrix&BebeRevha::InTheNameOfLove.mp4
├── Shawn Mendes
│   └── ShawnMendes::TreatYouBetter.mp4
├── Sia
│   └── The Greatest
│       └── Sia::TheGreatest.mp4
├── The Chainsmokers
│   ├── TheChainsmokers::AllWeKnow.mp4
│   └── TheChainsmokers::Closer.mp4
├── The Weekend
│   └── Starboy
│       └── TheWeekend::DaftPunk.mp4
└── TWENTY ØNE PILØTS
    └── Suicide Squad
        └── TwentyOnePilots::Heathens.mp4

Une fois le script exécuté, le répertoire de sortie devrait ressembler à ceci: MusicAudio:

.
├── Andra
│   └── Andra::Why.mp3
├── Ariana Grande
│   └── Dangerous Woman
│       ├── ArianaGrande::IntoYou.mp3
│       └── ArianaGrande::SideToSide.mp3
├── Justin Bieber
│   └── JustinBieber::LetMeLoveYou.mp3
├── Major Lazer
│   └── De Maxx 37
│       └── MajorLazer::ColdWater.mp3
├── Martin Garrix & Bebe Rexha
│   └── MartinGarrix&BebeRevha::InTheNameOfLove.mp3
├── Shawn Mendes
│   └── ShawnMendes::TreatYouBetter.mp3
├── Sia
│   └── The Greatest
│       └── Sia::TheGreatest.mp3
├── The Chainsmokers
│   ├── TheChainsmokers::AllWeKnow.mp3
│   └── TheChainsmokers::Closer.mp3
├── The Weekend
│   └── Starboy
│       └── TheWeekend::DaftPunk.mp3
└── TWENTY ØNE PILØTS
    └── Suicide Squad
        └── TwentyOnePilots::Heathens.mp3

Je cherchais comment faire cette conversion en utilisant des scripts bash et je suis tombé sur Script: convertir récursivement les fichiers wma en MP3, puis supprimer les fichiers WMA .

Cela semble un peu plus difficile que ce à quoi je m'attendais, toute aide et tout conseil seront grandement appréciés.

Mettre à jour

Avec un peu d’aide, j’ai écrit un script: Confirmez que cela fonctionne!

cp -a /$1/. /$2/  #copy the whole dir from src to dest

#cd $2 #change dir to dest
cd $2
#convert *.mp4 to *.mp3
#find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "$dest/$var".mp3' - '{}' \;

find . -name "*.mp4" -exec bash -c 'ffmpeg -i "$1" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "${1%.mp4}".mp3' - '{}' \;

echo "Cleaning up" 
find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/}; rm "${1#*/}"' - '{}' \;

Vous pouvez trouver le code source sur mon GitHub . Toute autre contribution sera grandement appréciée.

6
Amir

Vous devez d’abord répliquer la structure de répertoires dans le nouveau répertoire principal. Dans le répertoire principal d'origine contenant les fichiers .mp4, exécutez find . -type d >dirs.txt. Ceci stockera tous les répertoires et leurs chemins dans dirs.txt. Puis changez de répertoire dans le nouveau répertoire principal et exécutez xargs mkdir -p <dirs.txt. Cela créera la même structure de répertoire que celle d'origine.

Pour modifier le format et stocker les fichiers dans un autre répertoire, exécutez la commande suivante dans le répertoire principal d'origine.

find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "~/PATH/to/NewTopDIr/$var".mp3' - '{}' \;

Explication

find . -name "*.mp4" trouve tous les fichiers de type .mp4. -exec bash -c exécute la commande bash fournie dans la chaîne suivante pour chaque fichier trouvé. Il transmet également le nom de fichier sous la forme de variable $1 pouvant être utilisé dans la commande bash.

À ce stade, $1 contient quelque chose comme ./path/file.mp4. Pour supprimer le type de fichier *.mp4, nous utilisons var=${1%.mp4} qui stocke ./path/file dans $var. Maintenant, nous supprimons le ./ précédent avec var=${var#*/} d'où la valeur de $var est path/file.

Dans la commande ffmpeg, nous obtenons le nom du fichier actuel avec ${var#*/} qui donne chemin/fichier.mp4 et nous obtenons le fichier de sortie avec ~/PATH/to/NewTopDIr/$var".mp3$var a la valeur path/file comme expliqué ci-dessus.

9
Bilal Baqar