Script Bash pour convertir tous les * flac en * .mp3 avec FFmpeg?


28

Je veux convertir tous les * .flac en * .mp3 dans le dossier spécifique.

Voici ce que j'ai essayé, mais qui ne fonctionne pas:

# change to the home directory
cd ~/music
# convert all *.flac files
ffmpeg -i *.flac -acodec libmp3lame *.mp3
# (optional: check whether there are any errors printed on the terminal)
sleep 60

Comment atteindre mon objectif?


3
avez-vous essayé "FOR LOOP"?
Danila Ladner

@DanilaLadner Pas encore. Merci pour l'indice.
Kevin Dong

J'ai écrit un script qui fait cela, en parallèle, et copie les balises sur: http://tuxhelp.org/#flac-distiller

Désolé je l'ai oublié. Une fois le nom du fichier converti devenu file.avi.mp3, vous pouvez utiliser: renommer "s / .avi // g" * .avi.mp3 pour supprimer .avi.

1
Donnez une pause informatique après un dur travail.
MeowMeow

Réponses:


37

Essaye ça:

for i in *.flac ; do 
    ffmpeg -i "$i" -acodec libmp3lame "$(basename "${i/.flac}")".mp3
    sleep 60
done

1
Il ne fonctionne pas avec des fichiers contenant de l'espace. Comment puis-je modifier $(basename "${i/.flac}")pour gérer les espaces?
ppr

1
@ppr Essayez de mettre cette ligne juste avant la forboucle: IFS = $ '\ n'
mkc

6
J'ai résolu le problème d'espace en passant $(basename "${i/.flac}").mp3à "$(basename "${i/.flac}").mp3"(en mettant des guillemets)
MalcolmOcean

50

Une solution simple à 1 doublure: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

http://lewisdiamond.blogspot.ca/2012/01/converting-flac-to-mp3.html

Notez que cela sera appliqué récursivement dans le répertoire donné. C'est-à-dire que si vous l'exécutez à partir de votre dossier Musique, il convertira tous les flacs des sous-dossiers et produira un .mp3 à côté. Vous pouvez également le faire sans ffmpeg en utilisant directement flac et lame (c'est-à-dire lire w / flac, pipe to lame, sortir dans un fichier .mp3), comme indiqué dans le lien.


Vous pouvez utiliser -maxdepth 1je pense comme dans la réponse de X Tian pour limiter la récursivité.

2
Oui, vous pouvez. Vous pouvez également utiliser ls canalisé vers xargs ou une boucle for. Je fais juste l'hypothèse (peut-être erronée) qu'une recherche récursive correspond davantage à ce dont l'OP avait besoin (c'est-à-dire que je change tous les fichiers .flac de ma bibliothèque musicale).
Lewis Diamond

16
Cette commande est géniale - cependant; Vous vous retrouvez avec des fichiers nommés * .flac.mp3. En utilisant votre commande, j'ai trouvé ceci ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane

2
Oui, comme je l'ai expliqué dans le blog, j'aime cet aspect de l'ajout du .mp3 car il me dit que ces fichiers proviennent d'une source sans perte, qui devrait être trouvée quelque part sur mon disque dur.
Lewis Diamond

Le commentaire @Shane a fonctionné pour moi.
Chaudhry Waqas

8

Si vous avez des espaces blancs dans les noms de fichiers:

for a in *.flac; do
  f="${a[@]/%flac/mp3}"
  ffmpeg -i "$a" -qscale:a 0 "$f"
done

J'ai un dossier avec un mélange de fichiers mp4 et wav. Comment les convertir tous en mp3? Merci.
kRazzy R

2

J'ai pris tout ce que j'ai trouvé ici (et peut-être sur certains autres sites) et créé un petit outil pour non seulement créer des mp3 de flacs de manière récursive, mais aussi conserver des chemins relatifs pour les créer ailleurs avec un support multithread.

oh, et oui, je vois, je n'ai pas utilisé ffmpeg dans ce cas, parce que mon OSMC n'a pas fourni de paquets pour ffmpeg, seulement avconv, mais puisque vous êtes déjà là, je suppose que vous savez, c'est "fondamentalement" le même - au moins pour la partie la plus importante. Remplacez simplement la commande "avconv" par "ffmpeg". Mes premiers runs ont été avec le bac ffmpeg et exactement les mêmes options.

Je ne suis en aucun cas un hacker bash, mais je l'ai réussi, comme mon premier bashscript avec les demandes données, et peut-être que quelqu'un en bénéficiera. Je suis ouvert à toute suggestion de votre part, mais jusqu'à présent, cela fonctionne pour moi.

mon script pour faire tourner les 4 instances, une pour chaque cœur, est comme ceci:

#!/bin/bash
# this should be quite self-explanatory 
for i in {1..4}
do
echo "started instance no: $i"
/home/osmc/transform.sh . &
# sleeping time can be shorter, this is just so, that 
# not all 4 processes will want to start with the same 
# file, during runtime collisions should not become an issue
sleep 5
done
echo "all instances started"

Et le script de travail comme celui-ci:

#!/bin/bash
# take care of spaces
IFS=$'\n'
# my music folders, remote is the source, local the target dir
remote=/mnt/music/FLAC
local=/mnt/1tb/mp3
# for all flac files start loop
for i in $(find $remote -type f -iname '*.flac' );
do
## SET VARIABLES for PATHS and FILENAMES
## this might be able to be super short with sed and complex one-liner,
## but I s*ck at regex
fullfile=$i
# strip extension
filename="${i##*/}"
# add new extension
filename="${filename%.*}.mp3"
# get full dirname from inputfile
fulldir=$(dirname "${i}")
# strip leading dirs from full input dir
# count the dirs, add two, then you're good.
reldir="$(echo $fulldir | cut -d'/' -f5-)"
# some subdirs in my collection even have a flac subdir, you might
# ignore this, it strips only if it exists
reldir=${reldir//flac}
# combine target dir and relative dir
outdir="$local/$reldir"
# generate the full output filename for conversion
outfile="$outdir/$filename"
# create whole target directory - yes, I need it only once, but hey,
# it works, didn't want to start a if not exist statement... should I? 
mkdir -p "$outdir"
# run conversion - finally... you may want or need to replace 
# "avconv" with "ffmpeg"
avconv -n -nostats -loglevel info -i "$fullfile" -codec:a libmp3lame -qscale:a 0 "$outfile"
done

qui peut être trouvé à https://github.com/erdnuesse/flac-to-mp3

Cordialement, Kay


bienvenue à bord, bon effort. +1
Alex Stragies du

1

J'ai travaillé sur la réponse de @ Ketan en utilisant avconv, car ffmpeg ne fonctionne pas bien ici.

for i in *.flac ; do 
    avconv -i "$i" "./mp3/$i".mp3
done

Cela convertit les flacfichiers d'un dossier en mp3fichiers et les déplace ensuite vers un dossier "mp3" existant. Les fichiers seront nommés dans le modèle "nom_original.flac.mp3"


1
find . -maxdepth 1 -type f -name '*.flac' | while IFS= read -r f; do
  ffmpeg -i  "$f" -acodec libmp3lame "$( sed -e's/\.flac/.mp3/g' <<< $f )"
done

1
l'expression de sed a besoin d'une fin '
Jaime M.

1

GNU Parallel est conçu pour ces types de tâches:

# change to the home directory
cd ~/music
# convert all *.flac files
parallel ffmpeg -i {} -acodec libmp3lame {.}.mp3 ::: *.flac
# (optional: check whether there are any errors printed on the terminal)
sleep 60

Il exécutera les travaux en parallèle (un travail par cœur de processeur) et s'assurera que la sortie sur le terminal n'est pas mélangée.

Pour en savoir plus, passez 15 minutes à lire le chapitre 1 + 2: https://zenodo.org/record/1146014


Cela semble intéressant. Pourriez-vous expliquer ce que fait la {.}.mp3 :::construction? Ou consultez la section du manuel qui l'explique?
jottr


0

Par exemple, si vous avez plusieurs fichiers avi:

ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3

0

Si cela peut aider .... J'ai écrit un petit script bash pour ce faire .... Vous devez avoir installé ffmpeg / flac.

Comment ça marche:

Il faut 2 arguments:

  1. Le dossier de votre bibliothèque musicale (flac / ogg / mp3 ...)
  2. Le dossier de destination (vous devez le créer avant).

Il produit:

  • Une copie exacte du dossier source dans le dossier de destination, avec:
    • les fichiers non flac copiés dans.
    • les fichiers flac transformés en mp3 (haute qualité VBR)
  • Un fichier run.sh avec les commandes pour convertir les fichiers flac (ce script est exécuté automatiquement).

#!/bin/bash

FLAC_PATH=$1
CONV_PATH=$2

DEBUG=0;

function usage {
  echo "";
  echo "    This script convert all flac files from a folder to mp3 files to a second folder";
  echo "";
  echo "    Usage :";
  echo "        ./conv.sh {Source Folder} {Destination Folder}";
  echo "        note : booth folder must exist before starting this script";
  echo "               files other than flac are copied to the destination folder";
  echo "";
}

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

COMMANDS="run.sh"
echo "" > run.sh
echo " convert from $FLAC_PATH to $CONV_PATH ";

find "${FLAC_PATH}" -type f |while read myFile; do
  SRC_DIR=${myFile%/*}
  SRC_FILE=${myFile##*/}
  DST_DIR=$CONV_PATH/$SRC_DIR
  mkdir -p "${DST_DIR}"
  # TEST if the file is a flac ....
  metaflac --show-md5sum "${myFile}" 2>/dev/null 1>/dev/null
  if [ $? -eq 0 ]; then
    echo -n "  *** $myFile [FLAC !] : "
    DST_FILE=${myFile%.*}
    OUT_PATH="${DST_DIR}/$( echo $SRC_FILE | sed -e 's/.flac$/.mp3/')"

    if [ $DEBUG == 1 ]; then
      echo "  SRC = $myFile";
      echo "  OUT = $OUT_PATH"
    fi;

    if [ -f "$OUT_PATH" ]; then
      echo "  exist, do nothing !";
    else
      echo "  add to compress list !";
      echo "ffmpeg -y -i \"${myFile}\" -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 \"${OUT_PATH}\" " >> $COMMANDS
    fi;

  else
     echo -n "  *** $SRC_FILE  [NOT FLAC] : "
     if [ -f "${CONV_PATH}/${myFile}" ]; then
       echo " exist, do nothing !"
     else
       echo "  copy."
       cp "${myFile}" "${CONV_PATH}/${myFile}"
     fi
  fi

done;

echo " And now, CONVERT THE FLAC's!!! "
sh run.sh

0

Pour convertir récursivement en mp3 tous les fichiers flac ou wav dans des dossiers imbriqués, j'ai utilisé cette commande:

find '~/Music/' -iname '*.flac' , -iname '*.wav' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

Il créera un dossier nommé "mp3" à l'intérieur de celui avec des fichiers flac ou wav et, à l'intérieur du dossier mp3, il enregistrera les fichiers mp3 relatifs avec un débit de 320kbps, sans conserver l'ancienne extension de fichier dans le nom.


0

Le nom du fichier est "wav2mp3"

#!/bin/sh
# put the script to /usr/local/sbin
EXT_IN=$1
QUALITY=$2

if [ "${EXT_IN}" = "" -o "${QUALITY}" = "" ]; then
    printf "Usage: wav2mp3 \<in_file_ext\> \<quality\> \ne.g. wav2mp3 wav 2\n"
    exit 1
fi

#String delimeter
SAVEIFS=${IFS}
IFS='
'
# List of the files in directory lower than current to array
FILES_LIST=`find . -type f  -name "*.${EXT_IN}"`
for FILE in ${FILES_LIST}; do
    echo $FILE
    PREFIX=`echo $FILE | awk -F \. 'OFS="."{ $NF="" }1' | sed 's/.$//'`
    echo $PREFIX
    ffmpeg -i $FILE -codec:a libmp3lame -qscale:a $QUALITY $PREFIX.mp3
done

Pensez à utiliser shellcheck.net. Il contient plusieurs suggestions concernant votre script.
llogan

-1

pour un in * .flac

faire OUTF =echo "$a" | sed s/\.flac$/.mp3/g

ffmpeg -i "$ a" -acodec libmp3lame "$ OUTF"

terminé


2
Bienvenue chez U&L, votre réponse n'ajoute presque rien à la réponse acceptée par @Ketan il y a quatre ans.
Archemar

-2

Je me rends compte que cela arrive assez tard, mais pour mémoire, voir mon script "batchaudiocvt" sur sourceforge. Il s'agit d'un script shell (assez volumineux) conçu pour une conversion de masse efficace des fichiers audio, entre de nombreux formats. En particulier, il fait de son mieux pour convertir les balises habituelles.


Cette question concerne la façon de gérer la boucle dans le shell. L'utilisateur connaît déjà la commande qu'il souhaite utiliser pour effectuer la conversion.
G-Man dit `` Réintègre Monica ''

Bienvenue sur Stack Exchange . Êtes-vous Eric Dujardin ? Si c'est le cas, il serait bon d'utiliser le formulaire de contact et de sélectionner `` Je dois fusionner les profils d'utilisateurs '' pour fusionner vos comptes.
Scott

Désolé, j'essayais juste d'aider avec l'objectif déclaré de convertir les fichiers. Quoi qu'il en soit, le script fourni peut valoir la peine d'être lu.
Eric Dujardin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.