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 mp3cat
paso. Sin embargo, usar ffmpeg
u mp3wrap
otras cosas tampoco parece funcionar, y supongo que tiene algo que ver con el archivo producido al say
no 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