Bash-Skript, um alle * flac * .mp3 mit FFmpeg zu konvertieren?


28

Ich möchte alle * .flac in * .mp3 in dem spezifischen Ordner konvertieren.

Das habe ich versucht, aber es funktioniert nicht:

# 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

Wie erreiche ich mein Ziel?


3
hast du "FOR LOOP" ausprobiert?
Danila Ladner

@DanilaLadner Noch nicht. Danke für den Hinweis.
Kevin Dong

Parallel dazu habe ich ein Skript geschrieben, das die Tags kopiert: http://tuxhelp.org/#flac-distiller

Entschuldigung, ich habe es vergessen. Nach der Umwandlung des Dateinamens in file.avi.mp3 können Sie Folgendes verwenden: Benennen Sie "s / .avi // g" * .avi.mp3 um, um .avi zu entfernen.

1
Geben Sie dem Computer nach harter Arbeit eine Pause.
MeowMeow

Antworten:


37

Versuche dies:

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

1
Es funktioniert nicht mit Dateien, die Speicherplatz enthalten. Wie kann ich $(basename "${i/.flac}")den Umgang mit Leerzeichen ändern ?
3.

1
@ppr Stellen Sie diese Zeile kurz vor die forSchleife: IFS = $ '\ n'
mkc

6
Ich habe das Platzproblem gelöst, indem ich $(basename "${i/.flac}").mp3zu "$(basename "${i/.flac}").mp3"(Anführungszeichen)
MalcolmOcean

50

Eine einfache 1-Liner-Lösung: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

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

Beachten Sie, dass dies im angegebenen Verzeichnis rekursiv angewendet wird. Wenn Sie dies in Ihrem Musikordner ausführen, werden alle Flacs aus Unterordnern konvertiert, und es wird eine MP3-Datei daneben erstellt. Sie können es auch ohne ffmpeg tun, indem Sie direkt flac und lame verwenden (dh w / flac lesen, von Pipe zu Lame, in eine Datei .mp3 ausgeben), wie im Link gezeigt.


Sie können -maxdepth 1wie in X Tians Antwort denken, um die Rekursivität zu begrenzen.

2
Ja, du kannst. Sie können auch ls als Pipeline für xargs oder eine for-Schleife verwenden. Ich gehe nur von der (möglicherweise falschen) Annahme aus, dass eine rekursive Suche eher dem OP entspricht (dh alle .flac aus meiner Musikbibliothek ändern).
Lewis Diamond

16
Dieser Befehl ist jedoch großartig. Am Ende haben Sie Dateien mit dem Namen * .flac.mp3. Auf Ihren Befehl hin habe ich mir find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Shane,

2
Ja, wie ich im Blog erklärt habe, gefällt mir dieser Aspekt des Hinzufügens der .mp3-Datei, da er besagt, dass diese Dateien aus einer verlustfreien Quelle stammen, die sich irgendwo auf meiner Festplatte befinden sollte.
Lewis Diamond

@ Shane Kommentar hat bei mir funktioniert.
Chaudhry Waqas

8

Wenn die Dateinamen Leerzeichen enthalten:

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

Ich habe einen Ordner mit einer Mischung aus MP3- und WAV-Dateien. Wie konvertiere ich sie alle in MP3? Vielen Dank.
kRazzy R

2

Ich habe alles genommen, was ich hier (und vielleicht auch auf anderen Websites) gefunden habe, und ein kleines Tool erstellt, um nicht nur MP3s von Flacs rekursiv zu erstellen, sondern auch relative Pfade beizubehalten, um sie mit Multithread-Unterstützung an anderer Stelle zu erstellen.

oh, und ja, ich verstehe, ich habe ffmpeg in diesem Fall nicht verwendet, weil mein OSMC keine Pakete für ffmpeg, nur für avconv, zur Verfügung stellte, aber da Sie bereits hier sind, schätze ich, wissen Sie, dass es "im Grunde" das ist das Gleiche - zumindest für den wichtigsten Teil. Ersetzen Sie einfach den Befehl "avconv" durch "ffmpeg". Meine ersten Läufe waren mit dem ffmpeg bin und genau den gleichen Optionen.

Ich bin auf keinen Fall ein Bash-Hacker, aber ich habe es geschafft, als mein erstes Bash-Skript mit den gegebenen Anforderungen, und vielleicht wird jemand davon profitieren. Ich bin offen für alle Vorschläge von Ihrer Seite, aber bisher funktioniert es für mich.

Mein Skript zum Hochfahren der 4 Instanzen, eine für jeden Kern, sieht folgendermaßen aus:

#!/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"

Und das Arbeitsskript sieht so aus:

#!/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

Die finden Sie unter https://github.com/erdnuesse/flac-to-mp3

Grüße, Kay


Willkommen an Bord, gute Mühe. +1
Alex Stragies

1

Ich habe mit avconv an @ Ketans Antwort gearbeitet, da ffmpeg hier nicht gut funktioniert.

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

Dadurch werden flacDateien in einem Ordner in mp3Dateien konvertiert und anschließend in einen vorhandenen "mp3" -Ordner verschoben. Dateien werden im Modell "original_name.flac.mp3" benannt


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
sed Ausdruck braucht ein Ende '
Jaime M.

1

GNU Parallel ist für diese Art von Aufgaben gemacht:

# 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

Die Jobs werden parallel ausgeführt (ein Job pro CPU-Kern) und es wird sichergestellt, dass die Ausgabe auf dem Terminal nicht gemischt wird.

Um mehr zu erfahren, lesen Sie 15 Minuten lang Kapitel 1 + 2: https://zenodo.org/record/1146014


Das sieht interessant aus. Können Sie erklären, was das {.}.mp3 :::Konstrukt macht? Oder beziehen Sie sich auf den Handbuchabschnitt, der dies erklärt?
29.


0

Wenn Sie beispielsweise mehrere AVI-Dateien haben:

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

0

Wenn es helfen kann ... Ich habe ein kleines Bash-Skript geschrieben, um dies zu tun ... Sie müssen ffmpeg / flac installiert haben.

Wie es funktioniert:

Es braucht 2 Argumente:

  1. Der Ordner Ihrer Musikbibliothek (flac / ogg / mp3 ...)
  2. Der Zielordner (Sie müssen ihn vorher erstellen).

Es produziert:

  • Eine genaue Kopie vom Quellordner in den Zielordner mit:
    • Die Nicht-FLAC-Dateien, in die kopiert wurde.
    • die flac dateien in mp3 umgewandelt (VBR hohe qualität)
  • Eine run.sh-Datei mit den Befehlen zum Konvertieren der flac-Dateien (dieses Skript wird automatisch ausgeführt).

#!/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

Um alle flac- oder wav-Dateien in verschachtelten Ordnern rekursiv in mp3 umzuwandeln, habe ich diesen Befehl verwendet:

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"' \;

Es erstellt einen Ordner mit dem Namen "mp3" in dem Ordner mit den Dateien "flac" oder "wav" und speichert relative mp3-Dateien mit einer Bitrate von 320 kbps, ohne die alte Dateierweiterung im Namen zu belassen.


0

Der Dateiname ist "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

Erwägen Sie die Verwendung von shellcheck.net. Es enthält einige Vorschläge zu Ihrem Skript.
Logan

-1

für eine in * .flac

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

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

getan


2
Willkommen bei U & L, Ihre Antwort fügt der von @Ketan akzeptierten Antwort vor vier Jahren kaum etwas hinzu.
Archemar

-2

Mir ist klar, dass dies ziemlich spät kommt, aber für den Speicher siehe mein Skript "batchaudiocvt" auf sourceforge. Es ist ein (ziemlich großes) Shell-Skript, das für die effiziente Massenkonvertierung von Audiodateien zwischen vielen Formaten entwickelt wurde. Insbesondere ist es am besten, die üblichen Tags zu konvertieren.


In dieser Frage geht es darum, wie mit der Schleife in der Shell umgegangen wird. Der Benutzer kennt bereits den Befehl, den er für die Konvertierung verwenden möchte.
G-Man sagt, dass Monica

Willkommen bei Stack Exchange . Sind Sie Eric Dujardin ? In diesem Fall empfiehlt es sich, das Kontaktformular zu verwenden und "Ich muss Benutzerprofile zusammenführen" auszuwählen, damit Ihre Konten zusammengeführt werden.
Scott

Entschuldigung, ich habe nur versucht, mit dem erklärten Ziel zu helfen, die Dateien zu konvertieren. In jedem Fall ist das bereitgestellte Skript eine Lektüre wert.
Eric Dujardin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.