Eu compus o seguinte script bash para concatenar automaticamente arquivos mp3 usando o ffmpeg:
i=0
for f in "${@:2}"
do
filter+="[$i:a:0]"
i=`expr $i + 1`
files+="-i $f "
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg $files -filter_complex $filter -map '[outa]' "$1.mp3"
No entanto, muitas vezes tenho que lidar com arquivos que possuem espaços em seus nomes de arquivos, mas quando arrastados para o terminal, todos os espaços escapam, gerando a seguinte chamada de comando:
./mergemp3.sh outfilename /path/to/my\ file\ with\ spaces.mp3 /path/to/another\ file\ with\ spaces.mp3
o que me parece correto. No entanto, o ffmpeg falha com
/path/to/my: No such file or directory
Então, obviamente, o ffmpeg não entende o espaço no nome do arquivo, embora seja corretamente escapado por uma barra invertida. Acho que há apenas um detalhe bacana acontecendo em relação a essa lista de nomes de arquivos. Alguma ideia?
Para maior clareza e segurança ao construir linhas de comando, os arrays são seus amigos:
Tente isso, que deve funcionar com qualquer shell, não apenas
bash
(com base em um truque que vi pela primeira vez em uma resposta de @Kusalananda):Isso é apenas sobre a parte do shell; Não tenho certeza de que esse material de filtro complexo seja realmente necessário.