Option 1

Option 1

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 mp3catjedoch 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).ffmpegmp3wrapsay

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

verwandte Informationen