воскресенье, 24 октября 2010 г.

Конвертирование ape в mp3 или flac с нарезкой

Очень многие, если не все, пользователи торрент-трекеров делают свои музыкальные раздачи следующим образом: один здоровенный файлище, мегабайт на 300-500, с целым альбомом в каком-нибудь формате без потерь, чаще всего *.ape, и рядом CUE-файл. CUE-файл это текстовый файл установленного формата, в котором содержатся названия и длительность треков и прочая метаинформация по альбому.

Грех жаловаться, хотя это и неудобно, но вот для прослушивания музыки у себя в плеере в наушниках по дороге на работу это не годится абсолютно. Во-первых, я не уверен (я не проверял) в том, что плеер поймёт, что *.ape + *.cue - это несколько отдельных треков, и позволит играть любой на выбор, а не все подряд по порядку. Во-вторых, не так там много места, чтоб ради пары-тройки композиций держать в плеере целый альбом в таком массивном формате, как *.ape. Я предпочитаю там хранить музыку в *.mp3 с высоким битрейтом.

Для лёгкого превращения одного огромного файла *.ape в несколько мелких *.mp3 с правильными названиями и тэгами я пытался написать свой скрипт на баше, но не был в этом успешен, ибо я не башеписец. Поэтому, отказавшись от мысли найти и скачать готовое решение где-нибудь, я написал собственное на PHP. Чтоб оно работало, понадобится...

...конечно, сам интерпретатор PHP. Помимо него, cuetools (набор программ для работы с *.cue-файлами для извлечения информации оттуда), shntools (набор программ для нарезания/слияния/обрезания и прочих операций со звуковыми файлами преимущественно в формате WAV; конкретно отсюда понадобится только shnsplit), ffmpeg для превращения *.ape в *.wav для shnsplit, lame для кодирования *.wav в *.mp3, ну и, если хотите не *.mp3, а *.flac, то тогда и flac. Для того, чтоб работало под виндой - подвиндовые аналоги.
<?php
$file = $argv[1];
if(!strlen($file))
{
die("No file\n");
}
// разжать исходный файл в wav для операций с ним
$command = 'ffmpeg -i "'.$file.'" tmp.wav';
`$command`;
$file = explode('.', $file);
unset($file[sizeof($file) - 1]);
$file = implode('.', $file);
// получение списка треков из cue
// можно изменить формат имени трека согласно man cueprint
$command = 'cueprint -t "%p - %n - %t\n" "'.$file.'.cue"';
$names = `$command`;
$names = explode("\n", $names);
unset($names[sizeof($names) - 1]);
if(!sizeof($names))
{
die("Cueprint error\n");
}
// нарезка большого wav-файла на отдельные треки
$command = 'cuebreakpoints "'.$file.'.cue" | shnsplit tmp.wav';
`$command`;
// кодирование треков из wav
for($i = 1; $i <= sizeof($names); $i++)
{
// кодирование в mp3
$command = 'lame -b 192 split-track'.($i < 10 ? '0': '').$i.'.wav';
// кодирование во flac
//$command = 'flac --delete-input-file split-track'.($i < 10 ? '0': '').$i.'.wav';
`$command`;
// при кодировании во flac эта строчка не нужна
unlink('split-track'.($i < 10 ? '0': '').$i.'.wav');

}
// простановка тэгов в mp3
$command = 'find *.mp3 | cuetag "'.$file.'.cue"';
// простановка тэгов во flac
//$command = 'find *.flac | cuetag "'.$file.'.cue"';
`$command`;
// переименование файлов
for($i = 0; $i < sizeof($names); $i++)
{
// переименование mp3
rename('split-track'.($i < 9 ? '0': '').($i + 1).'.wav.mp3', $names[$i].'.mp3');
// переименование flac
//rename('split-track'.($i < 9 ? '0': '').($i + 1).'.flac', $names[$i].'.flac');
}
// удаление большого wav-файла
unlink('tmp.wav');
?>

Комментариев нет:

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

Ублюдочный Гугл поломал форму комментариев. Извините.