Opção 1

Opção 1

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 mp3catetapa No entanto, usar ffmpegou mp3wrapoutras coisas também não parecem funcionar, e meu palpite é que tem algo a ver com o arquivo produzido por saynã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

informação relacionada