Опция 1

Опция 1

У меня есть куча файлов .mp3, которые я хотел бы изменить так, чтобы они начинались с голоса, произносящего имя файла. Самый простой способ сделать это (или так я думал) будет примерно следующим:

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

Этотпочтиработает, но полученный mp3-файл поврежден (он правильной длины, но тихий, и всегда останавливает воспроизведение после того, как (я предполагаю) будет произнесено имя файла (примерно 2 секунды). Кажется, все прерывается на этом этапе mp3cat. Однако использование ffmpegили mp3wrapили других вещей, похоже, тоже не работает, и я предполагаю, что это как-то связано с созданным файлом из-за sayотсутствия нужного количества потоков (что бы это ни значило).

Есть ли у вас предложения, как это исправить или как сделать это совершенно по-другому?

решение1

Изменил ваш скрипт для использования ffmpeg. Как всегда, сделайте резервную копию файлов перед запуском скриптов, чтобы избежать потери данных.

Опция 1

Медленнее, перекодирует файлы, но сохраняет метаданные:

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

Вариант 2:

Быстро, без перекодирования, метаданные будут потеряны:

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

В любом случае полученные файлы, судя по всему, нормально работают с QuickTime, и он корректно воспроизводит весь файл.

решение2

Попробуйте это: Конвертируйте целевой .mp3 также в тот же формат, который вы конвертируете. Переписывая ваши шаги с несколькими изменениями и будьте осторожны:

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

Связанный контент