Как конвертировать MP4 в MP3 с помощью Bash
Конвертация видеофайлов в аудиофайлы — это распространенная задача для многих пользователей. В этой статье мы рассмотрим, как использовать Bash и FFmpeg для преобразования файлов формата MP4 в MP3. Однако, как нередко бывает, на пути есть некоторые сложности. Давайте вместе разберём одну из типичных проблем, с которой может столкнуться пользователь.
Проблема с экоранированием
Недавно я попытался конвертировать файлы MP4 в MP3 с помощью следующего Bash-скрипта:
IFS=$'\n'
for f in $(ls -1 --quoting-style=escape -R ./*.mp4); do ffmpeg -i "$f" "${f%.mp4}.mp3"; done
Однако при выполнении скрипта FFmpeg выдаёт ошибку:
./Asu\ no\ Yozora\ Shoukaihan.mp4: No such file or directory
При ручном вводе команды всё работает без ошибок. Это ставит вопрос: в чём проблема?
Почему возникает ошибка?
Причина, по которой скрипт не работает должным образом, заключается в обработке экранирования. Экранирование предназначено не для FFmpeg, а для оболочки (shell). При вводе команды оболочка разбивает её на "слова", обрабатывает кавычки и экранирование, а затем передаёт "чистые" значения вашим программам, таким как FFmpeg.
Например, если у нас есть команда:
file=One\ two\ three.mp4
или
file="One two three.mp4"
обратные косые черты (или кавычки) обрабатываются во время анализа ввода и не становятся частью значения. Это означает, что если в результате обработки появляется обратная косая черта, она не будет учтена при расширении переменной.
Неверная обработка вывода ls
Использование $(ls)
в цикле for
— это плохая практика. Результаты расширения $()
подвергаются разделению слов с помощью переменной IFS (Internal Field Separator), но не раскавычиванию. Это означает, что в ваших значениях могут оставаться буквалки, как, например, обратные косые черты.
Лучшей практикой будет использовать команду globbing Bash:
for f in ./*.mp4; do
ffmpeg -i "$f" "${f%.mp4}.mp3"
done
Использование globstar для рекурсивного поиска
Если вам нужно рекурсивно обрабатывать файлы, Bash предлагает опцию globstar
. Вы можете включить её следующей командой:
shopt -s globstar
for f in ./**/*.mp4; do
ffmpeg -i "$f" "${f%.mp4}.mp3"
done
Это позволит избежать затруднений с экранированием и сделает ваш код более чистым и понятным.
Заключение
Конвертация файлов MP4 в MP3 с помощью Bash и FFmpeg может быть выполнена легко, если учитывать особенности обработки строк в оболочке. Избегайте использования $(ls)
и используйте globbing для более чистого и безопасного кода. Если у вас возникли дополнительные вопросы, не стесняйтесь задавать их в комментариях!