Tente isto:
for i in *.flac ; do
ffmpeg -i "$i" -acodec libmp3lame $(basename "${i/.flac}").mp3
sleep 60
done
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?
Uma solução simples de 1 liner:
find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;
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.
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
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"
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
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
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 exemplo, se você tiver vários arquivos avi:
ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3
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:
Produz:
#!/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
para um in * .flac
OUTF = echo "$a" | sed s/\.flac$/.mp3/g
ffmpeg -i "$ a" -acodec libmp3lame "$ OUTF"
concluído
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.
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.
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.
Tags bash ffmpeg shell-script