web-dev-qa-db-fra.com

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

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?

31
Kevin Dong

Essaye ça:

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

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. 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, diriger vers lame, sortir dans un fichier .mp3), comme indiqué dans le lien.

52
Lewis Diamond

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
8
Daeseong Kim

GNU Parallel est conçu pour ce type 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

2
Ole Tange

J'ai pris tout ce que j'ai trouvé ici (et peut-être sur d'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 packages pour ffmpeg, seulement avconv, mais puisque vous Je suis déjà là, je suppose que vous savez, c'est "fondamentalement" la même chose - du moins pour la partie la plus importante. Remplacez simplement la commande avconv par ffmpeg. Mes premiers runs ont été avec le ffmpeg bin et exactement les mêmes options.

Je ne suis en aucun cas un pirate bash, mais je l'ai réussi, comme mon premier script bash avec les exigences 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-mp

2
Kay Urbach

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 fichiers flac d'un dossier en mp3 fichiers et se déplace ensuite vers un dossier "mp3" existant. Les fichiers seront nommés dans le modèle "nom_original.flac.mp3"

1
DanBC
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
X Tian

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
0
DenisVS

Par exemple, si vous avez plusieurs fichiers avi:

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

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 garder l'ancienne extension de fichier dans le nom.

0
Riccardo Volpe

FTW parallèle (sans doute, vous avez plus d'un cœur - pourquoi ne pas les utiliser?):

ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done
0
hoffmanc

La commande Shell suivante examine récursivement tous les sous-dossiers à partir du dossier actuel et convertit tous les fichiers .flac au format .mp3, en préservant les noms de fichiers et la structure de répertoire d'origine.

Si vous souhaitez convertir tous vos fichiers .flac en .mp3, mais conservez les fichiers source .flac d'origine, utilisez:

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -vn -c:a libmp3lame -ab 320k -y "${FILE%.flac}.mp3";' _ '{}' \;

-ab est le débit binaire audio souhaité pour vos fichiers mp3 de sortie (généralement compris entre 128k et 320k, où une meilleure qualité est meilleure mais une taille de fichier plus grande).

En cas de problème ou si vous souhaitez rétablir la conversion de vos fichiers .flac à un débit binaire plus élevé, les fichiers source .flac d'origine seront conservés et la répétition de la commande ci-dessus remplacera vos fichiers .mp3 générés précédemment par de nouveaux ( le -y flag indique à ffmpeg d'écraser les fichiers de sortie précédents avec le même nom sans demander de confirmation).

Une fois que vous êtes satisfait que tous les fichiers ont été convertis avec succès, vous pouvez ensuite supprimer les fichiers .flac d'origine avec ce script:

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; rm "${FILE}";' _ '{}' \;

Alternativement, vous pouvez convertir récursivement tous les fichiers .flac en .mp3 et supprimer les fichiers .flac d'origine en une seule fois avec une seule ligne de script, mais utilisez avec prudence, car cela supprimera vos fichiers source:

find . -type f -name "*.flac" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -vn -c:a libmp3lame -ab 320k -y "${FILE%.flac}.mp3" && rm "${FILE}";' _ '{}' \;

Si vous souhaitez convertir récursivement des fichiers audio à partir de formats autres que .flac en .mp3, modifiez les scripts ci-dessus afin de remplacer '.flac' par l'extension de fichier d'entrée appropriée (par exemple, '.wav', '.wma' etc. )

0
Dave

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

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)
  • UNE run.sh fichier avec les commandes pour convertir les fichiers flac (ce script s'exécute 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
Laurent

pour un in * .flac

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

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

terminé

0
Peter McConnell