Пакетная работа с файлами в командной строке. Перекодирование mp3-файлов для изменения битрейта.

Мой yepp-плейер при всем его удобстве (особенно радует его неубиваемость и то, что он работает от батарейки, которую несложно достать в поле) отличается небольшой емкостью — всего 128М. Посему, музыку для него я обычно ужимаю до битрейта в 128 — лучшее качество я все равно не смогу оценить в наушниках, а место можно сэкономить.

Некоторое время я это перекодирование выполнял через пакетную обработку в Audacity, однако перед экзаменом по философии внезапно выяснилось, что Audacity на текущую ось я почему-то не поставил. Зато у меня был lame — который можно использовать для этих целей с соответствующими ключами, например так:

lame -h -b 128 --vbr-new music_old.mp3 music_new.mp3

-b 128 — битрейт 128
-h — использовать более медленный но качественно лучший алгоритм сжатия
--vbr-new — задействовать variable bitrate и еще более новый, быстрый и качественный алгоритм сжатия

Все эти ключи (и все остальное) можно посмотреть либо через man lame, либо запустив в комстроке lame --help.

Теперь нужно было сделать пакетную обработку — чтобы не задавать по одной команде на каждый отдельно взятый файл, а перекодировать все одним пакетом. Я воспользовался своей собственной старой заметкой про пакетную обработку djvu и на ее базе задал такую вот строку.

for x in *.mp3; do lame -V0 -h -b 128 --vbr-new $x $x.new; done

В запущенной директории она перебирает все файлы с расширением .mp3 и для каждого из них запускает lame, добавляя к окончанию получившегося файла «.new».

Все отлично сработало. Осталось только скопировать все файлы с .new-расширением в другую папку и «откусить» им этот .new-хвост, вернув прежний вид.

Я использовал утилиту rename. Она переименовывает файлы по регулярным выражениям примерно так, как это происходит в vim и sed:

rename 's/старый шаблон/новый шаблон/' *.mp3

Сразу запускать переименование не рекомендую — лучше сначала проверить как оно произойдет. Сделать «тестовый прогон» и убедиться, что не было ошибок. Для чего нужно два ключа:

-v подробно описывать действия
-n ничего не переименовывать — просто показать результат в режиме «пробного просмотра»

Пример:

$ ls *.new

1.mp3.new  2.mp3.new  3.mp3.new

$ rename -v -n 's/mp3.new$/mp3/' *.new

1.mp3.new renamed as 1.mp3
2.mp3.new renamed as 2.mp3
3.mp3.new renamed as 3.mp3

Ну и убедившись, что все сработало как надо — можно запустить rename без ключа -n — и переименовать файлы.

$ rename -v -n 's/mp3.new$/mp3/' *.new

1.mp3.new renamed as 1.mp3
2.mp3.new renamed as 2.mp3
3.mp3.new renamed as 3.mp3

$ rename -v 's/mp3.new$/mp3/' *.new
1.mp3.new renamed as 1.mp3
2.mp3.new renamed as 2.mp3
3.mp3.new renamed as 3.mp3

$ ls *.mp3
1.mp3  2.mp3  3.mp3
Реклама

9 Responses to Пакетная работа с файлами в командной строке. Перекодирование mp3-файлов для изменения битрейта.

  1. А еще можно для пакетной обработки использовать find, что бы не только в данном подкаталоге, но и глубже. ;)
    Что нибудь вроде:

    find . -type f -name \*.mp3 -exec lame -h -b 128 —vbr-new «{}» \;

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

    ls *.mp3 | while read NAME; do lame -h -b 128 —vbr-new «$NAME»; done

    при этом ls выдает имена файлов построчно и они целиком попадают в переменную NAME. А так как она в кавычках, то и обрабатываться будет даже с пробелом.

    Еще: для lame можно не указывать второе имя, просто после обработки получишь файлы вида: filename.mp3.mp3 :) Их легко отсортировать и переименовать, если надо. Впрочем я не парюсь, заливаю с таким именем. ;)

    Удачи!

  2. О! Отлично! :) Пасибо :))) Особенно спасибо за find — это действительно, наверное лучший из вариантов. Сколько им пользуюсь, но не приходило в голову, что можно использовать для конкретно пакетной обработки :)

    Может это мне только кажется (или я недостаточно копался), но в сети в основном водятся примеры общего плана без привязки к конкретике. Т.е. все знают, что можно сцепить несколько команд в одну, но конкретно «какие», «когда» и «зачем» рассматриваются не очень часто. Из известных мне реально хороших и полезных сборников примеров — «Дзен консоли» Петра Семилетова.

    Так что любой совет в этом плане очень полезен :) Когда писал — надеялся что спровоцирую описание подобных полезностей :))) Спасибо еще раз.

  3. Highway Star:

    Я бы все же для музыки посоветовал минимум 192.

  4. Ну да, но мне нужно экономить место :( Или там выигрыш небольшой получается? Вроде бы где-то читал рекомендацию на 128.

  5. Highway Star:

    Выигрыш в качестве очень заметный просто.

  6. SI:

    Приветствую! Спасибо и OllyCat
    Замечательная статья, очень полезно. Добился хорошего результата, НО:
    пока я не заменил кавычки « » в строке
    ls *.mp3 | while read NAME; do lame -h -b 128 –vbr-new «$NAME»; done
    на обычные кавычки » » — никак не получалось обработать, чуть голову не сломал :)

  7. SI:

    вот дела — это форум кавычки портит, оказывается. ОБЫЧНЫЕ кавычки должны быть :), те,что рядом с клавишей Enter

  8. Это из-за того, что комментарии форматируются по-своему. В теле поста кавычки нормально показываются. Тут нужно ставить тег ".

  9. В смысле — тег <code></code> — тогда все будет нормально. Обычно на это не заморачиваются — поскольку все более или менее имеют представление про то, что в командной строке можно использовать только одинарные ' или двойные " кавычки.

    Я рад, что вы разобрались самостоятельно. Всегда ужасно неприятно, если сталкиваешься с чем-нибудь загадочным, особенно если что-то нужно делать срочно.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: