Чтобы закачать такую музыку на аудио-плеер, умеющий воспроизводить только mp3 или ogg, приходится разбивать flac на отдельные mp3-треки.
Кроме разбивки flac-файла на отдельные файлы и преобразования каждого из файлов в формат mp3 полезно также перенести всю полезную информацию из cue-файла в теги mp3-файла. Для этого нам понадобятся следующие пакеты: shntool, cuetools, lame, enca. Установим их:
# apt-get install shntool cuetools lame encashntool потребуется для того, чтобы разбить 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 комментариев:
http://opendesktop.org/content/show.php/Flacon?content=113388
http://opendesktop.org/content/show.php/gCue2tracks?content=80703
Зачем все так сложно, есть ведь специальные проги, которые сами все разбивают и тебе остается только имя исполнителя написать
А нет таких специальных прог, чтобы ложку ко рту подносили и отгоняли мух?
Вместо "for((I=1;I<NUMBER;I++));" должно быть "for((I=1;I <= NUMBER;I++));",иначе последний трек не конвертит.
Спасибо за поправку. Возможно скрипт на компьютере я исправил, а тут не обновил.
lame -b 192 --cbr \
Почему бы не 320 кбит/с сделать?
А почему именно 320?
Однажды я тестировал разные битрейты, пережимая музыку FLAC в MP3. Для меня всё, что было выше 128, на моём оборудовании, звучало одинаково. Следующий стандартный битрейт - это 160, но более распространён - 192, поэтому я стал сжимать всегда именно с этим битрейтом. Оптимальное соотношение объём/качество. Для меня.
ну это уже дело вкуса)
запустил скрипт, вывод такой:
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
Добавьте в строку с enca параметр "-L russian". На момент создания скрипта всё работало нормально, возможно новая версия enca требует обязательного указания языка распознаваемой кодировки.
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 по-прежнему ругается
Версия enca 1.12
Откуда берется этот /CRLF ?
Параметр -e в enca указать не забыли?
Нет.
FROMCP=`enca -e -L russian *.cue`
iconv -f $FROMCP -t UTF-8 *.cue > /tmp/list.cue
Предлагаю поставить пакет tofrodos и перед первой командой скрипта прописать fromdos *.cue
Спасибо... Все перекодировал...
Только есть маленькая проблемка с японскими тегами. пруфпик
Мой вариант см. http://pastebin.com/ptVaVUZW
Во-первых, новая enca избавляет от необходимости плясок с iconv, во-вторых, мне не понравилось именование 01.mp3, 02.mp3 etc, тогда как shntool позволяет легко скроить имя типа NN_Performer-Title.mp3
Но в данном варианте теги не сохраняются.
Дойдут руки -- допилю. А может кто предложит свое решение.
Владимиру -- спасибо.
>Но в данном варианте теги не сохраняются.
Ради чего и устраивались танцы с бубном. Дальше, имея теги, можно с помощью exfalso легко назвать файл как хочется и положить куда нужно. А не пытаться выковырять эту информацию из очередного оригинального способа именования файлов.
Я, например, использую в exfalso такой шаблон:
/home/music/<artist>/<date>-<album>/<tracknumber>-<title>
маленькая косметика
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
CRLF конец строки
CRLF - это CR и LF. Возврат каретки и перевод строки. Однако, что вы посоветуете человеку, чтобы решить его проблему? Воспользоваться dos2unix?
Отправить комментарий