Tomé todo lo que encontré aquí (y tal vez en algunos otros sitios) y creé una pequeña herramienta para no solo crear mp3 de flacs de forma recursiva, sino también preservar rutas relativas para crearlos en otros lugares con soporte de subprocesos múltiples.
Ah, y sí, ya veo, no utilicé ffmpeg en ese caso, porque mi OSMC no proporcionó paquetes para ffmpeg, solo avconv, pero como ya estás aquí, supongo que ya sabes, es "básicamente" el igual, al menos para la parte más importante. Simplemente reemplace el comando "avconv" con "ffmpeg". Mis primeras ejecuciones fueron con el contenedor ffmpeg y exactamente las mismas opciones.
De ninguna manera soy un hacker bash, pero lo logré, como mi primer bashscript con las demandas dadas, y tal vez alguien se beneficie. Estoy abierto a cualquier sugerencia de su parte, pero hasta ahora me funciona.
mi script para activar las 4 instancias, una para cada núcleo, es así:
#!/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"
Y el script de trabajo como este:
#!/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 se puede encontrar en
https://github.com/erdnuesse/flac-to-mp3
Saludos, Kay.