Opción 1

Opción 1

Tengo un montón de archivos .mp3 que me gustaría modificar para que comiencen con una voz que diga el nombre del archivo. La forma más sencilla de hacer esto (o eso pensé) sería algo como lo siguiente:

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

Estecasifunciona, pero el archivo mp3 resultante está roto (tiene la longitud correcta, pero es silencioso y siempre deja de reproducirse después del tiempo necesario (supongo) para decir el nombre del archivo (aproximadamente 2 segundos). Todo parece romperse en el mp3catpaso. Sin embargo, usar ffmpegu mp3wrapotras cosas tampoco parece funcionar, y supongo que tiene algo que ver con el archivo producido al sayno tener la cantidad correcta de transmisiones (lo que sea que eso signifique).

¿Sugerencias sobre cómo solucionar este problema o cómo hacerlo de una manera completamente diferente?

Respuesta1

Modificó su script para usar ffmpeg. Como siempre, haga una copia de seguridad de sus archivos antes de ejecutar los scripts para evitar perder datos.

Opción 1

Más lento, volverá a codificar los archivos, pero conserva los metadatos:

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

Opcion 2:

Rápido, sin recodificación, se perderán los metadatos:

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 cualquier manera, los archivos resultantes parecen funcionar bien con QuickTime y reproduce el archivo completo correctamente.

Respuesta2

Pruebe esto: convierta el .mp3 de destino también al mismo formato que está convirtiendo. Reescribiendo tus pasos con algunas modificaciones y ten 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

información relacionada