
Ich habe eine Reihe von MP3-Dateien, die ich so ändern möchte, dass sie mit einer Stimme beginnen, die den Dateinamen vorliest. Der einfachste Weg, dies zu tun (dachte ich zumindest), wäre etwa wie folgt:
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
Dasfastfunktioniert, aber die resultierende MP3-Datei ist defekt (sie hat die richtige Länge, ist aber stumm und die Wiedergabe wird immer nach der (vermutlich) zum Aussprechen des Dateinamens benötigten Zeit (ungefähr 2 Sekunden) beendet). Bei diesem Schritt scheint alles kaputt zu gehen . Die Verwendung von oder oder anderen Dingen scheint mp3cat
jedoch auch nicht zu funktionieren, und ich vermute, dass es etwas mit der Datei zu tun hat, die dadurch erzeugt wird, dass nicht die richtige Anzahl von Streams vorhanden ist (was auch immer das bedeuten mag).ffmpeg
mp3wrap
say
Vorschläge, wie man das beheben oder wie man es ganz anders machen kann?
Antwort1
Ihr Skript wurde so geändert, dass es ffmpeg verwendet. Sichern Sie wie immer Ihre Dateien, bevor Sie die Skripte ausführen, um Datenverlust zu vermeiden.
Option 1
Langsamer, kodiert die Dateien neu, behält aber die Metadaten bei:
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
Option 2:
Schnell, keine Neukodierung, Metadaten gehen verloren:
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
In jedem Fall scheinen die resultierenden Dateien mit QuickTime einwandfrei zu funktionieren und die gesamte Datei wird ordnungsgemäß abgespielt.
Antwort2
Versuchen Sie Folgendes: Konvertieren Sie die Ziel-MP3-Datei ebenfalls in dasselbe Format, das Sie konvertieren. Schreiben Sie Ihre Schritte mit ein paar Änderungen und Vorsichtshinweisen neu:
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