![Опция 1](https://rvso.com/image/1606702/%D0%9E%D0%BF%D1%86%D0%B8%D1%8F%201.png)
У меня есть куча файлов .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