Script Bash para converter todos * flac para * .mp3 com FFmpeg?

23

Eu quero converter todos * .flac para * .mp3 na pasta específica.

Isso é o que eu tentei, mas não funciona:

# 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

Como conseguir meu objetivo?

    
por Kevin Dong 12.02.2014 / 16:55

13 respostas

34

Tente isto:

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

Uma solução simples de 1 liner: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

link

Observe que isso será aplicado recursivamente no diretório fornecido. Ou seja se você executar isso a partir da sua pasta Music, ele converterá todos os flacs de subpastas e produzirá um arquivo .mp3 ao lado dele. Você também pode fazer isso sem o ffmpeg usando diretamente flac e lame (isto é, leia w / flac, pipe to lame, output em um arquivo .mp3), como mostrado no link.

    
por 24.10.2014 / 20:11
8

Se você tiver alguns espaços em branco nos nomes dos arquivos:

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

Eu trabalhei na resposta do @ Ketan usando o avconv, já que o ffmpeg não funciona bem aqui.

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

Isso converte arquivos flac em uma pasta em mp3 arquivos e move-os para uma pasta "mp3" existente. Os arquivos serão nomeados no modelo "original_name.flac.mp3"

    
por 07.07.2015 / 15:28
1

Paralelo ao FTW (sem dúvida você tem mais de um núcleo - por que não usá-los?):

ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done
    
por 27.07.2015 / 23:04
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
    
por 12.02.2014 / 17:28
1

Eu peguei tudo que encontrei aqui (e talvez em outros sites) e criei uma pequena ferramenta para não apenas criar mp3s de flacs recursivamente, mas também preservar caminhos relativos para criá-los em outro lugar com suporte multithread.

oh, e sim, eu vejo, eu não usei ffmpeg nesse caso, porque meu OSMC não proveu pacotes para ffmpeg, apenas avconv, mas já que você já está aqui, eu acho que você sabe, é " basicamente "o mesmo - pelo menos para a parte mais importante. Basta substituir o comando "avconv" por "ffmpeg". Minhas primeiras execuções foram com o ffmpeg bin e as mesmas opções exatas.

Eu não sou um hacker bash, mas eu consegui, como meu primeiro bashscript com as demandas dadas, e talvez alguém se beneficie. Estou aberto para qualquer sugestão do seu lado, mas até agora funciona para mim.

meu script para girar as 4 instâncias, uma para cada núcleo, é assim:

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

E o script de trabalho assim:

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

que pode ser encontrado em link

Atenciosamente, Kay

    
por 12.01.2018 / 18:59
0

Por exemplo, se você tiver vários arquivos avi:

ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3
    
por 29.12.2015 / 20:39
0

Se isso puder ajudar .... Eu escrevi um pequeno script para fazer isso .... Você precisa ter o ffmpeg / flac instalado.

Como funciona:

São necessários dois argumentos:

  1. A pasta da sua biblioteca de músicas (flac / ogg / mp3 ...)
  2. A pasta de destino (você precisa criá-la antes).

Produz:

  • Uma cópia exata da pasta de origem para a pasta de destino, com:
    • os arquivos não flac copiados para.
    • os arquivos flac transformados em mp3 (alta qualidade VBR)
  • Um arquivo run.sh com os comandos para converter os arquivos flac (este script é executado automaticamente).

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

    
por 04.08.2017 / 13:21
0

para um in * .flac

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

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

concluído

    
por 29.12.2017 / 09:18
0

Para converter recursivamente em mp3 todos os arquivos flac ou wav em pastas aninhadas, usei este comando:

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

Ele criará uma pasta chamada "mp3" dentro de uma pasta com arquivos flac ou wav e, dentro da pasta mp3, salvará os arquivos MP3 em um bitrate de 320kbps, sem manter a extensão do arquivo antigo no nome.

    
por 03.06.2018 / 01:18
0

O GNU Parallel é feito para esse tipo de tarefa:

# 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

Ele executará os trabalhos em paralelo (um trabalho por núcleo de CPU) e garantirá que a saída no terminal não seja misturada.

    
por 03.06.2018 / 10:36
-1

Eu percebo que isso chega bem tarde, mas para a memória, veja meu script "batchaudiocvt" no sourceforge. É um script de shell (bastante grande) projetado para conversão em massa eficiente de arquivos de áudio, entre vários formatos. Em particular, faz o melhor para converter as tags usuais.

    
por 31.10.2018 / 23:35