![Opção 1](https://rvso.com/image/1606702/Op%C3%A7%C3%A3o%201.png)
Tenho vários arquivos .mp3 que gostaria de modificar para que comecem com uma voz dizendo o nome do arquivo. A maneira mais fácil de fazer isso (ou assim pensei) seria algo como o seguinte:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv $file $BASE-bak.mp3
say "[[volm 0.4]] $BASE" -o $BASE-pre.aiff
ffmpeg -i $BASE-pre.aiff -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 $BASE-pre.mp3
rm $BASE-pre.aiff
mp3cat -o $file $BASE-pre.mp3 $BASE-bak.mp3
done
Essequasefunciona, mas o arquivo mp3 resultante está quebrado (tem o tamanho certo, mas silencioso, e sempre para de tocar após o tempo necessário (presumo) para dizer o nome do arquivo (cerca de 2 segundos). Tudo parece quebrar no mp3cat
etapa No entanto, usar ffmpeg
ou mp3wrap
outras coisas também não parecem funcionar, e meu palpite é que tem algo a ver com o arquivo produzido por say
não ter a quantidade certa de fluxos (seja lá o que isso signifique).
Sugestões sobre como consertar isso ou como fazer isso de uma maneira totalmente diferente?
Responder1
Modificou seu script para usar ffmpeg. Como sempre, faça backup de seus arquivos antes de executar os scripts para evitar perda de dados.
Opção 1
Mais lento, recodificará os arquivos, mas preservará os metadados:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.mp3" -i "${BASE}-bak.mp3" -filter_complex [0:a][1:a]concat=n=2:v=0:a=1 -map_metadata 1 "${file}"
rm "${BASE}-pre.mp3"
done
Opção 2:
Rápido, sem recodificação, os metadados serão perdidos:
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
mv "${file}" "${BASE}-bak.mp3"
say "[[volm 0.4]] ${BASE}" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
rm "${BASE}-pre.aiff"
echo "file '${BASE}-pre.mp3'" >temp
echo "file '${BASE}-bak.mp3'" >>temp
ffmpeg -f concat -safe 0 -i temp "${file}"
rm "${BASE}-pre.mp3"
rm temp
done
De qualquer forma, os arquivos resultantes parecem funcionar bem com o QuickTime e reproduzem o arquivo inteiro corretamente.
Responder2
Tente isto: Converta o arquivo .mp3 de destino também no mesmo formato que você está convertendo. Reescrevendo seus passos com algumas modificações e tome cuidado:
mkdir -p backup/
mkdir -p working/
for file in ./*.mp3; do
BASE="$(basename "$file" .mp3)"
say "[[volm 0.4]] $BASE" -o "${BASE}-pre.aiff"
ffmpeg -i "${BASE}-pre.aiff" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-pre.mp3"
ffmpeg -i "$file" -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 "${BASE}-bak.mp3"
rm "${BASE}-pre.aiff"
mv "$file" backup/
mp3cat -o "$file" "${BASE}-pre.mp3" "${BASE}-bak.mp3"
mv "${BASE}-pre.mp3" working/
mv "${BASE}-bak.mp3" working/
done