Массовое .flac -> .mp3 транскодирование: Как написать сценарий оболочки, который сохраняет информацию тега ID3?

9

В последние недели я перешел от довольно практического подхода к транскодированию .flac -> .mp3 к гораздо более «установленному и забытому».

Первым шагом было прекращение использования внешнего интерфейса с графическим интерфейсом (Audacity с плагином LAME) и использование метода, который я описал здесь .

Вторым шагом был поиск сценария оболочки bash, который сообщал бы, что этот командный цикл работает рекурсивно, позволяя транскодировать каталоги со многими подкаталогами, содержащими файлы .flac, за один простой шаг. Этот ответ был предоставлен пользователем на askubuntu.com.

Теперь я хочу узнать, как еще улучшить детали, чтобы сохранить информацию тега ID3. Методы, связанные с вышеупомянутыми данными, удаляют теги ID3, оставляя минимум (т.е. остается только поле заголовка).

Может ли кто-нибудь научить меня, как написать такой сценарий оболочки?


Скрипт оболочки был обновлен таким образом:

#!/bin/bash
file="$1"
flac -cd "$file" | lame --preset fast extreme - "${file%.flac}.mp3"
id3cp "$file" "${file%.flac}.mp3"

Выполнение find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;в ~ / Desktop / stack дает следующий вывод:

01 - Amon Tobin - Chomp Samba.flac: done         
LAME 3.98.4 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding <stdin> to ./01 - Amon Tobin - Chomp Samba.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III VBR(q=0)
Parsing ./01 - Amon Tobin - Chomp Samba.flac: done.  Copying to ./01 - Amon Tobin - Chomp Samba.mp3: done

id3info для оригинального .flac и результирующего .mp3 дает соответственно:

*** Tag information for 01 - Amon Tobin - Chomp Samba.flac

(т.е. ничего);

*** Tag information for 01 - Amon Tobin - Chomp Samba.mp3
*** mp3 info
MPEG1/layer III
Bitrate: 128KBps
Frequency: 44KHz

.Flac определенно содержит информацию тега. Я могу убедиться в этом, открыв EasyTAG. EasyTAG называет это тегом FLAC Vorbis, но тегом ID3 для .mp3. Это проблема?

boehj
источник
Вы пробовали использовать ffmpeg?
Hello71
Нет, не имею Никогда по-настоящему не использовал его раньше в CLI, если честно. Кто-то рассказал мне об этом сценарии Perl. Я попробую это завтра и сообщу, что уже поздно.
Boehj

Ответы:

7
#!/bin/sh

file="$1"
outfile=${file%.flac}.mp3

eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/")

flac -cd "$file" | lame --preset fast extreme \
        --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \
        --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \
        - "$outfile"
Kambus
источник
Спасибо, Камбус! Это в значительной степени делает свое дело. Большинство тегов, которые я хочу, уже есть, после транскодирования: название, альбом, исполнитель, год, номер дорожки. Поле CD (1/1, 1/2 и т. Д.) Не прошло, и ни одно из них не имеет поля для «Track Number Of ». Но это не очень беспокоит меня. Интересно, что я попробовал этот скрипт в каталоге, содержащем музыку «Trip Hop». Теги были сохранены в такте, но сценарий изменил жанр с «Trip Hop» на «Trip-Hop». Так что я полагаю, что он опирается на базу данных известных жанров. Большое спасибо еще раз за ваш вклад!
Boehj
@pedrogent: Я рад, что смог помочь! Вы можете вручную проверить другие теги с помощью «metaflac --export-tags-to-file» и использовать их так же, как $ TITLE и другие, но проблема в том, что в id3 AFAIK для них нет эквивалентных полей. Может быть, вы можете поместить их в тег комментария. Да, есть предопределенный список жанров: ссылка
Kambus
Привет Камбус. Да, я думаю, что отчасти проблема в том, что нет четкого «стандарта» для данных тегов ID3. Тег комментария интерпретируется очень по-разному от игрока к игроку (или не совсем). Ваш сценарий потрясающий. Еще раз спасибо.
Boehj
1

Как использовать mp3fs для массового кодирования flac в mp3

Вместо того чтобы использовать программу для преобразования файлов flac в mp3, вы можете использовать mp3fs, чтобы представить их как виртуальные mp3, и программу, которая может ставить в очередь задания на копирование. Это прекрасно работает для меня.

Скачайте и установите mp3fs и ultracopier:

sudo apt-get install mp3fs ultracopier

Создайте пару папок flac и mp3 для каждой mp3fs, которую вы хотите запустить. У меня двухъядерный процессор, поэтому я запускаю два. Если вы храните каталоги flac в разделе, где находятся ваши файлы flac, вы можете быстро их переместить. Этот раздел называется «Хранилище» в моей системе.

cd /media/Storage
mkdir mp3fs mp3fs/flac_1 mp3fs/mp3_1 mp3fs/flac_2 mp3fs/mp3_2

Вы можете смонтировать каталоги из командной строки или добавив их в /etc/fstab. Вы также можете настроить битрейт и алгоритм кодирования виртуальных mp3-файлов во время монтирования. Я хочу mp3 с постоянным битрейтом 320kbps, и lame может занять все время, необходимое для создания лучшего mp3, которое только возможно.

В командной строке:

mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 -o allow_other,ro
mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 -o allow_other,ro

Если предохранитель жалуется, как

fusermount: не удалось открыть /etc/fuse.conf: доступ запрещен
fusermount: опция allow_other разрешена, только если в файле etc / fuse.conf установлено 'user_allow_other'

затем раскомментируйте user_allow_otherпараметр в /etc/fuse.confи / или сделайте его читаемым с помощью

sudo chmod 644 /etc/fuse.conf

Или из /etc/fstab:

mp3fs#/media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 fuse user,ro,allow_other,bitrate=320,quality=0 0 0
mp3fs#/media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 fuse user,ro,allow_other,bitrate=320,quality=0 0 0

После добавления каталогов /etc/fstabвы можете смонтировать их, используя

sudo mount -a

Выполнено! Запустите ультракопир. Он поместит значок индикатора на вашу панель гномов или что-то еще, что вы используете. Нажмите на нее, выберите добавить копию. Я сделал это дважды, чтобы использовать два ядра. Используйте свой файловый браузер, чтобы переместить некоторые флаки в flac_1. Перейдите в каталог mp3_1 и перетащите ваши mp3-файлы в одно из окон ультраокопировального устройства, чтобы начать очередь копирования. Ultracopier спросит место назначения файлов. Теперь одно ядро ​​занято кодированием партии флагов в mp3.

Чтобы использовать другое ядро, переместите файлы flac в flac_2 и перетащите файлы mp3 из mp3_2 во второе окно ультракопировального устройства.

Обновление: вместо ультракопира я сейчас использую MiniCopier, его немного проще использовать. Смотрите комментарии ниже.

Арджан Дриман
источник
Кажется, есть ошибка в списке каталогов с последними версиями mp3fs и fuse: sourceforge.net/tracker/…
Ophidian
@Ophidian: Интересно. Я провел несколько тестов на некоторых машинах, используя разные дистрибутивы. Я запустил их по минуте, без каких-либо ошибок. Версия mp3fs, которую я использовал, та же самая, 0.30. Я использовал ядра 2.3.38, 2.3.39 и 3.0.0, libfuse версий 2.8.4 и 2.8.6. Libfuse упоминается в сообщениях об ошибках 2.8.5. Этого недостаточно, чтобы заключить, что виноват fuse, однако, возможно, стоит попробовать другую версию, если вы столкнетесь с проблемами при использовании 2.8.5. Возможно, вы пробовали mp3fs? На каком ядре и с каким libfuse? Были ли у вас проблемы?
Арджан Дриман
Вместо ультракопира я сейчас использую MiniCopier , его немного проще использовать. Это Java-приложение, оно не требует установки, но нуждается в JRE. Он имеет значок корзины и значок коробки. Вы можете перетащить один или несколько источников из файлового менеджера на значок корзины, каталог назначения на значок коробки, и это все, что вам нужно сделать, чтобы добавить задание копирования в очередь. В MiniCopier есть отдельная вкладка для неисправных предметов. MiniCopier использует меньше циклов процессора, чем ультракопир, 1% против 3% в моей системе. Это может просто сэкономить 12 минут в 10-часовой очереди ;-)
Арджан Дриман,
Если вам нужна очередь копирования на основе оболочки, я нашел решение в superuser . Без настроек вы не сможете запустить 2 очереди с ним, и я не уверен, что это будет делать с ошибками.
Арджан Дриман
0

id3cpне может работать, так как FLAC не использует ID3; вместо этого он использует тэги Vorbis.

avconvимеет возможность поддерживать теги путем конвертации. Это немного непостоянно, его значение зависит от комбинации кодеков , но в вашем случае работает так (версия 9.16-6):

avconv -i in.flac -map_metadata 0:g:0 out.mp3

Применение всех файлов FLAC в папке (рекурсивно) так же просто, как это: (использование bash)

for f in */**/*.flac; do
  avconv -i "${f}" -map_metadata 0:g:0 "`echo "${f}" | sed -e s/flac$/mp3/`";
done

Обратите внимание, что avconvиспользует lame автоматически; Существуют и другие варианты контроля качества и тому подобное. Проверьте man avconvдетали.

Рафаэль
источник