Bash скрипт для перетворення всіх * flac в * .mp3 за допомогою FFmpeg?


28

Я хочу перетворити всі * .flac в * .mp3 у конкретній папці.

Це те, що я намагався, але не працює:

# 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

Як досягти своєї мети?


3
ви спробували "ЗА ЛОП"?
Даніла Ладнер

@DanilaLadner Ще не. Дякую за підказку.
Кевін Донг

Я написав сценарій, який робить це паралельно, і копіює теги на: http://tuxhelp.org/#flac-distiller

Вибачте, я це забув. Після перетворення імені файлу в файл file.avi.mp3 ви можете використовувати: перейменувати "s / .avi // g" * .avi.mp3 для видалення .avi.

1
Дайте комп’ютерному перерві після важкої роботи.
MeowMeow

Відповіді:


37

Спробуйте це:

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

1
Він не працює з файлами, що містять простір. Як я можу змінити $(basename "${i/.flac}")обробку пробілів?
ппр

1
@ppr Спробуйте поставити цей рядок перед forциклом: IFS = $ '\ n'
mkc

6
Я вирішив проблему простору, змінюючи $(basename "${i/.flac}").mp3до "$(basename "${i/.flac}").mp3"(покласти лапки навколо нього)
MalcolmOcean

50

Просте рішення з 1 вкладиша: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

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

Зауважте, що це буде застосовано рекурсивно у вказаному каталозі. Тобто, якщо ви запускаєте це з папки "Музика", вона перетворить усі фрагменти з папок і створить .mp3 поруч. Ви також можете зробити це без ffmpeg, безпосередньо використовуючи flac та lame (тобто читати w / flac, pipe to lame, виводити у файл .mp3), як показано у посиланні.


Ви можете використовувати, -maxdepth 1я думаю, як у відповіді X Tian, ​​щоб обмежити рекурсивність.

2
Так, ти можеш. Ви також можете використовувати ls, перекладені на xargs або for для циклу. Я просто роблю (можливо, неправильне) припущення, що рекурсивний пошук більше відповідає тому, що потрібно ОП (тобто змінити всі .flac з моєї музичної бібліотеки).
Льюїс Діамант

16
Ця команда чудова - проте; Ви закінчуєте файли з ім'ям * .flac.mp3. Використовуючи вашу команду, я придумав це ...find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \;
Шейн

2
Так, як я пояснював у блозі, мені подобається цей аспект додавання .mp3, оскільки він говорить мені, що ці файли походять з джерела без втрат, який слід знайти десь на моєму жорсткому диску.
Льюїс Діамант

@Shane коментар працював на мене.
Чаддрі Вакас

8

Якщо у назвах файлів є пробіли:

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

У мене папка із сумішшю mp4 та wav-файлів. Як я конвертую їх у mp3? Дякую.
kRazzy R

2

Я взяв усе, що я знайшов тут (а може бути, і на деяких інших сайтах) і створив невеликий інструмент, щоб не лише створювати mp3-файли рекурсивно, але й зберігати відносні шляхи для створення їх в іншому місці з підтримкою багатопотокових записів.

о, і так, я бачу, я не використовував ffmpeg в цьому випадку, тому що мій OSMC не надав пакети для ffmpeg, тільки avconv, але оскільки ви вже тут, я думаю, ви знаєте, це "в основному" те саме - принаймні для найважливішої частини. Просто замініть команду "avconv" на "ffmpeg". Перші мої пробіжки були з кошиком ffmpeg і точно такими ж варіантами.

Я ні в якому разі не хакер-хакер, але мені це вдалося, як мій перший епізод із заданими вимогами, і, можливо, хтось піде на користь. Я відкритий для будь-яких пропозицій з вашого боку, але поки це працює для мене.

мій сценарій розкручувати 4 екземпляри, по одному для кожного ядра, такий:

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

І такий сценарій робочого:

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

які можна знайти за адресою https://github.com/erdnuesse/flac-to-mp3

З повагою, Кей


Ласкаво просимо на борт, добрі зусилля. +1
Alex Stragies

1

Я працював над відповіддю @ Ketan, використовуючи avconv, оскільки ffmpeg тут не працює добре.

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

Це перетворює flacфайли в папці у mp3файли та переміщується до існуючої папки "mp3". Файли будуть названі в моделі "original_name.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
sed вираз потребує закінчення '
Хайме М.

1

Паралель GNU створена для таких завдань:

# 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

Він буде виконувати завдання паралельно (одне завдання на ядро ​​центрального процесора) і стежити, щоб вихід на терміналі не змішувався разом.

Щоб дізнатися більше, витратьте 15 хвилин на читання розділу 1 + 2: https://zenodo.org/record/1146014


Це виглядає цікаво. Чи можете ви пояснити, що {.}.mp3 :::робить конструкція? Або посилатися на ручний розділ, який пояснює це?
Jottr

0

Паралельний FTW (без сумніву, у вас є більше одного ядра - чому б не використовувати їх?):

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



0

Якщо це може допомогти .... Я написав невеликий скрипт bash для цього .... Вам потрібно встановити ffmpeg / flac.

Як це працює:

Це бере 2 аргументи:

  1. Папка вашої музичної бібліотеки (flac / ogg / mp3 ...)
  2. Цільова папка (її потрібно створити раніше).

Він виробляє:

  • Точна копія з вихідної папки в цільову папку з:
    • файли non flac скопійовані у.
    • файли flac, перетворені в mp3 (висока якість VBR)
  • Файл run.sh з командами для перетворення файлів flac (цей скрипт виконується автоматично).

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

Для рекурсивного перетворення в mp3 всіх flac або wav-файлів у вкладені папки я використав цю команду:

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

Це створить папку з назвою "mp3" всередині файлу з файлами flac або wav, а всередині папки mp3 збереже відносні mp3-файли з бітрейтом 320 кбіт / с, не зберігаючи в назві старе розширення файлу.


0

Назва файлу - "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

Подумайте про використання shellcheck.net. Є досить багато пропозицій щодо вашого сценарію.
llogan

-1

для a в * .flac

робити OUTF =echo "$a" | sed s/\.flac$/.mp3/g

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

зроблено


2
Ласкаво просимо до U&L, ваша відповідь навряд чи щось додасть до @Ketan прийнятої відповіді чотири роки тому.
Архемар

-2

Я усвідомлюю, що це приходить досить пізно, але на пам'ять дивіться мій сценарій "batchaudiocvt" на sourceforge. Це (досить великий) скрипт оболонки, призначений для ефективної масової конверсії аудіофайлів між багатьма форматами. Зокрема, вона робить все можливе для перетворення звичайних тегів.


Це питання про те, як обробити петлю в оболонці. Користувач вже знає команду, яку хоче використовувати для перетворення.
G-Man каже: "Відновіть Моніку"

Ласкаво просимо до обміну стеками . Ти Ерік Дюджардін ? Якщо це так, було б добре скористатися контактною формою та вибрати "" Мені потрібно об'єднати профілі користувачів ", щоб об'єднати ваші облікові записи.
Скотт

Вибачте, я просто намагався допомогти у встановленні цілі перетворення файлів. У будь-якому випадку поданий сценарій, можливо, варто прочитати.
Ерік Дюджардін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.