Добавление Replay Gain тегов музыкальной коллекции


Anonymous - Posted on 02 Март 2010

Любому человеку, имеющему большую музыкальную коллекцию, знакома проблема, возникающая при прослушивании подряд нескольких треков из разных альбомов: из-за разных уровней громкости переход между треками перестает быть плавным, и приходится вручную крутить регулятор громкости. К счастью, проблема решаема, и решение -- использование Replay Gain.

Выдержка из Википедии:

Цитата:

Replay Gain (ReplayGain, Replaygain, выравнивание громкости[1]) — стандарт представления информации, позволяющей аудиоплеерам, использующим её, воспроизводить файлы в медиа-библиотеке с однородной громкостью.

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

Многие плееры под Linux поддерживают ReplayGain теги, пользователю остается только добавить их. Для этого я написал данный простой скрипт, который проходит по музыкальной коллекции, анализирует файлы и добавляет теги. Предполагается, что все файлы расположены по принципу %artist%/%album%/%track%.%ext%, и что расширения находятся в нижнем регистре. Требуются программы vorbisgain, mp3gain, metaflac.

#!/bin/bash
 
# заменить на верную директорию
MUSIC_DIR="/home/username/Audio/Music"
 
cd "$MUSIC_DIR"
for artist in *
do
    if [ -d "$artist" ]; then
        cd "$artist"
        for album in *
        do
            if [ -d "$album" ]; then
                cd "$album"
                echo `pwd`
                # MP3 gain
                mp3gain -a -r -k -T -p *.mp3
                vorbisgain -f -a -s -r *.ogg
                metaflac --add-replay-gain *.flac
                cd ..
            fi
        done
        cd ..;
    fi
done

Данный скрипт довольно примитивен (я плохо знаком с Bash скриптингом), поэтому любые замечания приветствуются.

0
Ваша оценка: Ничего

Хорошее дело Ж:-)
Можно не привязыватся к структуре каталогов, а искать сразу все необходимые файлы. Вот первое решение в лоб:

find ~/mp3/ -type f | while read F; do 
    case "$F" in
        *.[mM][Pp]3)  mp3gain -a -r -k -T -p "$F"     ;; 
        *.ogg)        vorbisgain -f -a -s -r "$F"     ;;
        *.flac)       metaflac --add-replay-gain "$F" ;;
    esac;
 done

Но что бы было быстрее, можно запускать три отдельных find, и вызывать програмки не для каждого файла, а для многих

find ~/mp3/ -name '*.[mM][Pp]3'    -type f -exec mp3gain -a -r -k -T -p     '{}' +
find ~/mp3/ -name '*.[oO][oO][gG]' -type f -exec vorbisgain -f -a -s -r     '{}' +
find ~/mp3/ -name '*.flac'         -type f -exec metaflac --add-replay-gain '{}' +

Не нужно запускать три find: лучше использовать круглые скобки и оператор -or:

find ~/mp3/ -type f -and \( \
   \( -iname "*.mp3"  -exec mp3gain -a -r -k -T -p     '{}' + \) -or \
   \( -iname "*.ogg"  -exec vorbisgain -f -a -s -r     '{}' + \) -or \
   \( -iname "*.flac" -exec metaflac --add-replay-gain '{}' + \)\
\)

А за идею спасибо, отличная штука! :)

В man mp3gain написано:
"If you specify -r and -a, only the second one will work"

Просмотрел. Сразу видно - поздно вечером скрипт писал

find ~/mp3/ -iname '*.mp3' -type f -exec mp3gain -a -r -k -T -p '{}' +

В этом случае не будет работать Album Gain (хотя для Track Gain сойдет)

а вот так вот, должно работать и с Album Gain

find ~/mp3/ -type f -and \( -iname '*.mp3' -or -name '*.ogg' -or -iname '*.flac' \) |
    awk -FIGNORECASE=1 '{d=gensub("[^/]*$","",""); if(h[d]++) next }
                /mp3$/  {system("mp3gain -a -k -T -p        \""d"*.mp3\"")} 
                /ogg$/  {system("vorbisgain -f -a -s -r     \""d"*.ogg\"")}
                /flac$/ {system("metaflac --add-replay-gain \""d"*.flac\"")}'

Скрипт в awk хранит в хеше уже пройденные директории и запускает для новых директорий нужный скрипт.
Вроде как должен работать и с директориями в имени которых есть пробел.

век живи, век RTFM Ж:-)
спасибо

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.