понедельник, 23 августа 2010 г.

flac & cue в mp3

Иногда попадаются рипы компакт-дисков, сделанные аудиофилами. Аудиофилам обычно очень важно, чтобы рип представлял собой точную копию компакт-диска, поэтому они часто делают рипы всего диска в виде одного файла формате flac, который они сопровождают ещё и файлом со списком дорожек в формате cue.

Чтобы закачать такую музыку на аудио-плеер, умеющий воспроизводить только mp3 или ogg, приходится разбивать flac на отдельные mp3-треки.

Кроме разбивки flac-файла на отдельные файлы и преобразования каждого из файлов в формат mp3 полезно также перенести всю полезную информацию из cue-файла в теги mp3-файла. Для этого нам понадобятся следующие пакеты: shntool, cuetools, lame, enca. Установим их:
# apt-get install shntool cuetools lame enca
shntool потребуется для того, чтобы разбить flac-файл на отдельные wav-файлы, cuetools понадобится для извлечения полезной информации из cue-файла, lame - для кодирования wav-файлов в формат mp3 и простановки тегов, enca используется для автоматического определения кодировки текста в cue-файле (поскольку cue-файл мог быть создан как в Windows, так и в Linux и может иметь символы самых разных алфавитов).

Теперь можно попытаться соединить всё это в единый скрипт:
#!/bin/sh

FROMCP=`enca -e *.cue`
iconv -f $FROMCP -t UTF-8 *.cue > /tmp/list.cue

DATE=`grep "REM DATE" /tmp/list.cue | sed -e 's/REM DATE \(.*\)/\1/g'`
GENRE=`grep "REM GENRE" /tmp/list.cue | sed -e 's/REM GENRE \(.*\)/\1/g'`
COMMENT=`grep "REM COMMENT" /tmp/list.cue | sed -e 's/REM COMMENT \(.*\)/\1/g'`
NUMBER=`cueprint -d "%N" /tmp/list.cue`

shntool split -f /tmp/list.cue *.flac -t %n

for((I=1;I<=NUMBER;I++));
do
  cueprint -n $I -t "ARTIST=\"%p\"\nALBUM=\"%T\"\nTRACKNUMBER=\"%n\"\nTITLE=\"%t\"\n" /tmp/list.cue > /tmp/tags
  . /tmp/tags
  J=`printf "%02d" $I`
  lame -b 192 --cbr \
    --ty "$DATE" \
    --tg "$GENRE" \
    --tc "$COMMENT" \
    --ta "$ARTIST" \
    --tl "$ALBUM" \
    --tn "$TRACKNUMBER" \
    --tt "$TITLE" \
    --add-id3v2 \
    --id3v2-only \
    $J.wav $J.mp3
  rm $J.wav
done

rm /tmp/list.cue /tmp/tags
Скрипт рассчитан на то, что в текущем каталоге имеется только один cue-файл и один flac-файл.

Иногда вместо flac используется ape, который с лицензионной стороны намного хуже flac'а. В частности, существовавший когда-то на просторах опенсорса проект mac (Monkey's Audio Codec), исчез именно из-за лицензионных проблем. Не смотря на это, кое-где ещё можно найти как исходники, так и deb-пакет. После установки пакета shntool можно использовать прежним образом, единственное отличие будет заключаться лишь в том, что вместо flac-файла нужно будет указать ape-файл.

Обновлено 3 сентября 2010 года. При обновлении этой заметки и скрипта был использован комментарий к моей старой заметке Конвертируем FLAC в MP3 под Debian.

20 комментариев:

  1. http://opendesktop.org/content/show.php/Flacon?content=113388

    http://opendesktop.org/content/show.php/gCue2tracks?content=80703

    ОтветитьУдалить
  2. Зачем все так сложно, есть ведь специальные проги, которые сами все разбивают и тебе остается только имя исполнителя написать

    ОтветитьУдалить
  3. А нет таких специальных прог, чтобы ложку ко рту подносили и отгоняли мух?

    ОтветитьУдалить
  4. Вместо "for((I=1;I<NUMBER;I++));" должно быть "for((I=1;I <= NUMBER;I++));",иначе последний трек не конвертит.

    ОтветитьУдалить
  5. Спасибо за поправку. Возможно скрипт на компьютере я исправил, а тут не обновил.

    ОтветитьУдалить
  6. lame -b 192 --cbr \
    Почему бы не 320 кбит/с сделать?

    ОтветитьУдалить
  7. А почему именно 320?

    Однажды я тестировал разные битрейты, пережимая музыку FLAC в MP3. Для меня всё, что было выше 128, на моём оборудовании, звучало одинаково. Следующий стандартный битрейт - это 160, но более распространён - 192, поэтому я стал сжимать всегда именно с этим битрейтом. Оптимальное соотношение объём/качество. Для меня.

    ОтветитьУдалить
  8. ну это уже дело вкуса)

    запустил скрипт, вывод такой:

    enca: Cannot determine (or understand) your language preferences.
    Please use `-L language', or `-L none' if your language is not supported
    (only a few multibyte encodings can be recognized then).
    Run `enca --list languages' to get a list of supported languages.
    iconv: conversion from `-t' is not supported
    Try `iconv --help' or `iconv --usage' for more information.
    1: syntax error
    /tmp/list.cue: input file error
    shntool [split]: error: no split points given -- nothing to do
    rm: cannot remove `/tmp/tags': No such file or directory

    ОтветитьУдалить
  9. Добавьте в строку с enca параметр "-L russian". На момент создания скрипта всё работало нормально, возможно новая версия enca требует обязательного указания языка распознаваемой кодировки.

    ОтветитьУдалить
  10. iconv: conversion from `UTF-8/CRLF' is not supported
    Try `iconv --help' or `iconv --usage' for more information.
    1: syntax error
    /tmp/list.cue: input file error
    shntool [split]: error: no split points given -- nothing to do
    rm: cannot remove `/tmp/tags': No such file or directory

    iconv по-прежнему ругается

    ОтветитьУдалить
  11. Версия enca 1.12
    Откуда берется этот /CRLF ?

    ОтветитьУдалить
  12. Параметр -e в enca указать не забыли?

    ОтветитьУдалить
  13. Нет.

    FROMCP=`enca -e -L russian *.cue`
    iconv -f $FROMCP -t UTF-8 *.cue > /tmp/list.cue

    ОтветитьУдалить
  14. Предлагаю поставить пакет tofrodos и перед первой командой скрипта прописать fromdos *.cue

    ОтветитьУдалить
  15. Спасибо... Все перекодировал...
    Только есть маленькая проблемка с японскими тегами. пруфпик

    ОтветитьУдалить
  16. Мой вариант см. http://pastebin.com/ptVaVUZW
    Во-первых, новая enca избавляет от необходимости плясок с iconv, во-вторых, мне не понравилось именование 01.mp3, 02.mp3 etc, тогда как shntool позволяет легко скроить имя типа NN_Performer-Title.mp3
    Но в данном варианте теги не сохраняются.
    Дойдут руки -- допилю. А может кто предложит свое решение.
    Владимиру -- спасибо.

    ОтветитьУдалить
  17. >Но в данном варианте теги не сохраняются.

    Ради чего и устраивались танцы с бубном. Дальше, имея теги, можно с помощью exfalso легко назвать файл как хочется и положить куда нужно. А не пытаться выковырять эту информацию из очередного оригинального способа именования файлов.

    Я, например, использую в exfalso такой шаблон:
    /home/music/<artist>/<date>-<album>/<tracknumber>-<title>

    ОтветитьУдалить
  18. маленькая косметика
    6,22d4
    < IFS='
    < '
    < if [ "$1" != "" ]
    < then
    < echo $1
    < echo "transform " $1
    < echo "please enter a name for flac-file"
    < read FLAC_NAME
    < ffmpeg -i $1 $FLAC_NAME.flac
    < ls -alh *.flac
    < fi
    <
    < if [ "$(ls *.flac 2> /dev/null)" = "" ]
    < then echo " cannot find any flac-file"
    < echo " please select a file for transformation"
    < exit
    < fi
    24c6
    < FROMCP=`enca -r *.cue`
    ---
    > FROMCP=`enca -e *.cue`
    32,33c14
    < shntool split -f /tmp/list.cue *.flac -t %n-%t
    < mkdir mp3
    ---
    > shntool split -f /tmp/list.cue *.flac -t %n
    35c16
    < for I in $( ls *.wav | sort | sed 's/.wav$//' )
    ---
    > #for((I=1;I<=NUMBER;I++));
    39c20
    < # J=`printf "%02d" $I`
    ---
    > J=`printf "%02d" $I`
    50,51c31,32
    < $I.wav mp3/$I.mp3
    < # rm $J.wav
    ---
    > $J.wav $J.mp3
    > rm $J.wav

    ОтветитьУдалить
  19. CRLF конец строки

    ОтветитьУдалить
  20. CRLF - это CR и LF. Возврат каретки и перевод строки. Однако, что вы посоветуете человеку, чтобы решить его проблему? Воспользоваться dos2unix?

    ОтветитьУдалить