Один из вариантов — перекодировать в ogg, как самый доступный, свободный и, главное, обеспечивающий более-менее приличное качество на низких битрейтах формат. Для тех, у кого наличное железо позволяет — это один из самых приемлимых выходов.
Каковы варианты реализации? Конвертеров всяких много, foobar2000 тот же. Однако людям, не пугающихся консоли, рано или поздно приходит в голову, что можно как-то проще, красивее и аскетичней.
Для линуксоидов это не вопрос — богатые возможности линуксовой среды предоставляют самые разнообразные возможности в самых экзотических вариантах. Под вынью всё, как известно, гораздо скромней. Встаёт вопрос: как при минимуме средств и стороннего софта решить задачу?
Ответом стал где-то добытый скриптик, называвшийся «MP3 to OGG AutoTranscoder». Идея простая: в цикле обходить каталог с подкаталогами, искать в них mp3 и скармливать их дуэту из Lame'а, декодирующего mp3, и oggenc'а, кодирующего соответственно в ogg. По ходу Tag копировал из исходного файла теги — что вообще прелесть. Скрипт был простой, состоящий из двух батников, один в одну строку, другой строчек в пять.
Однако он имел некоторые существенные недостатки: обрабатывал файлы только под собой, то есть либо его нужно было кидать в каталог с эмпэшками, либо их к нему. При этом исходные файлы удалял. Кроме того, из-за особенностей реализации lame'а возникала проблема. А именно: из lame'а декодированные данные передавались кодеру через конвеер, при этом lame неправильно сообщал длительность и oggenc жутко обламывался, не ожидая внезапного конца и такой подляны. В общем, в конце файла получался неприятный щелчок. Вариант обхода был простой и тупой: декодировать в промежуточный wav. Тогда щелчка не было. Подобным образом действоваал некий древний перловый скрипт, виденный мной во времена оны — лет так семь-восемь назад.
Однако не исчезала надежда, что это когда-то поправят — хотелось универсальности и возможности выбора стратегии без постоянного переписывания скрипта. Хоть и писать немного — а всё же лень вспоминать, что там где какие закорючки означают. Кстати, таки была решена — свежий lame не пакостит.
Хотелось возможности относительно простого конфигурирования, опять же без ковыряния в коде — как-то вот не радуют намертво прибитые установки для битрейта, ресэмплинга и даунмиксинга.
Ну и кроме того, всё же хотелось одним файлом — даже два уже как-то напрягают. Чем больше мелочи — тем легче при копировании забыть положить.
В общем, взял я напильник и немного поточил. Результаты чего представляю обчеству. Называется сие чудо «Alex Dragon's MP3 to OGG converter v1.1».
Особенности и отличия от пращура:
установка всех важных переменных вынесена отдельным блоком от тела основного цикла;
в опциях конфигурирования есть возможность выбрать произвольно качество, частоту и преобразования стерео в моно (способствует при кодировании в основном речевых программ, книжку можно и в моно послушать);
возможность выбора вариантов кодирования через поток либо промежуточный файл; возможность выбирать удалять или не удалять исходные файлы;
возможность запускать скрипт для заданной директории (то есть задать параметром путь к нужному каталогу, типа converter.bat x:\some\dir);
и в довесок такая фишка, как детектирование в моно или стерео исходный файл.
Последнее нужно, что бы жутко не обламаться на смеси моно и стерео файлов при даунмиксе. Дело в том, что если файл моно, а задан --downmix, то oggenc ругается, что он умеет делать даунмикс только со стереофайлами, а про остальные знать не знает и не хочет. А именно «Can't downmix except from stereo to mono». При этом всё продолжало работать — lame бодро отчитывался о декодированных фреймах, tag упорно пытался скопировать теги в пустой ogg. Представляете картину: ставите на ночку торбу книжек кодировать, в надежде по утрам и вечерам, давясь в транспорте на работу и с, приобщаться к шедеврам мировой классики, а утречком получаете много-много оггов нулевого размера. Причём, по лени и забывчивости копии исходников вы, конечно, не сделали. Прощай плоды бессоных ночей дежурства на торрентах и бдений на файлообменниках… А исходники, они разные бывают — одни в моно, другие в стерео, а хочется всё скопом и разом, особо не заглядывая в свойства, «настроил, запустил и забыл». Надеюсь, я эту проблему решил — во всяком случае у меня работает.
Требуется: Микросос Вынь XP (на других не пробовал), Lame, Ogg Vorbis encoder и Tag (ссылки на страницы со скомпилированными бинарниками).
Что бы вы не бегали по инету, всё собрал в один архивчик: http://narod.ru/disk/17563670000/ADMTOC_11.7Z.html
Входят:
сам скрипт,
lame.exe — LAME 32bits version 3.98.2,
oggenc2.exe — OggEnc v2.85 Generic (libvorbis 1.2.3),
Tag.exe — Tag 2.0.52
lame_help.txt
oggenc_help.txt
tag_help.txt — вывод встроенной справки утилит этого комплекта.
DirInfo — файл описания каталога.
За полными наборам и документацией, буде появится потребность, стучитесь по указанным выше ссылкам и на сайты родных им организаций — http://www.xiph.org, http://lame.sourceforge.net
P.S. Самое смешное, что у меня была довольно старая версия Автотранскодера, когдая я уже сочинил одним батником, оказалось, что автор это уже давно сделал в более свежих. Тем не менее, как мне кажется, мой удобней.
P.P.S. Великим программерам банановыми шкурками не кидаться и пальцы не гнуть — я не программист ни разу, просто иногда совсем уж тошно ждать милостей от природы. Писано великим граматеем для ещё больших граматеев.
@echo off if main==%1 goto MAIN %COMSPEC% /E:on /V:on /C call %0 main %1 exit :MAIN rem Alex Dragon's MP3 to OGG converter v1.1 rem bat-скрипт для конвертирования mp3-файлов в формат ogg. rem Является развитием идеи скрипта "MP3 to OGG AutoTranscoder 1.0" rem от VEG (http://vorbis.org.ru) rem Использование: пропишите опции конфигурации, если не устраивают rem по умолчанию. В качестве параметра запуска можно задать путь к требуемому rem каталогу: converter.bat x:\some\dir rem Все файлы в этом каталоге и подкаталогах будут обработаны автоматически. rem Либо поместите скрипт в директорию с mp3 файлами, запустите. Подробнее rem читайте ниже. rem ---------------------------------------------------------------------------- rem Установка параметров кодирования Ogg. rem Frequency - частота передискретизации (см. --resample в документации rem по oggenc.exe), десятичное целое, если не требуется - оставить пустым, rem будет использована частота исходного файла, значение по умолчанию - нет. set Frequency= rem Quality - качество ogg-файла в условных единицах от -1 до 10 (в некоторых rem реализациях кодера в справке указано от -2, но у меня с этим параметром rem выдаёт ошибку), см. -q в док-ции (Внимание: дробная часть отделяется rem не точкой, а ЗАПЯТОЙ!), если не требуется - оставить пустым, кодировщик rem использует своё внутреннее значение по умолчанию (обычно 3,0), здесь rem в скрипте - выставлено 1,5. set Quality=1,5 rem Bitrate - номинальная скорость сжатого потока в килобитах в секунду (kbps), rem взаимоисключающе с Quality, если заданы оба - кодировщику в этом скрипте rem будет передано Quality. Значение по умолчанию: нет. set Bitrate= rem Downmix - сведение стерео в моно, 0 - нет, 1 - включено, по умолчанию - 0. rem Если указано отличное значение - будет принудительно установлен в ноль. set Downmix=0 rem Для достижения максимального сжатия при более-менее приемлимом качестве для rem речевых программ, например аудиокниг, можно порекомендовать следующие rem параметры: Frequency=24000, Quality=0 (либо Bitrate=24), Downmix=1. rem ---------------------------------------------------------------------------- rem TmpFile - использовать промежуточный wav-файл. lame сперва декодирует mp3 rem в несжатый wav, а затем уже oggenc перекодирует этот wav в ogg. Другая rem стратегия - поток от lame'а будет передаваться непосредственно oggenc через rem конвеер, при этом увеличивается общая скорость, иногда довольно rem существенно - что особенно заметно при большом количестве файлов большой rem длительности и на слабых машинах с медленными винтами. Возможность выбора rem была сделана в связи с тем, что в некоторых версиях lame rem (предположительно всех до 3.98.1) была ошибка, приводящая при поточном rem кодировани к неприятному щелчку в конце файла. При использовании rem промежуточного wav'а этого не происходит. rem 0 - не использовать, 1 (или любое ненулевое значение) - использовать. rem По умолчанию - 0 set TmpFile=0 rem DeleteSrc - удаление исходных файлов. 1 - удалять, 0 - не удалять. rem По умолчанию - 0, отключено. Будьте внимательны! Очень легко лишиться rem любовно собираемой коллекции. set DeleteSrc=0 rem Frequency, Quality, Bitrate и Downmix можно не задавать - будут rem использованы значения по умолчанию. rem TmpFile, DeleteSrc должны быть заданы явно. rem ---------------------------------------------------------------------------- rem Здесь можно задать дополнительные опции для lame и oggenc. Например, при rem поточном кодировании вывод на экран lame и oggenc перекрывается, из-за чего rem возникает эффект раздражающего мерцания и видимость мусора внизу экрана. rem Для устранения можно подавить вывод того или другого, либо обоих сразу, для rem чего их нужно запускать в режиме молчания (silent mode). Оба сразу rem не рекомендуется, потому что тогда не видно, что происходит - пока rem не начнёт работу Tag, никаких видимых изменений происходить не будет. rem По умолчанию - пусто. rem set LameAddOpts=--silent rem set VorbisAddOpts=-Q set LameAddOpts= set VorbisAddOpts= rem ---------------------------------------------------------------------------- rem Здесь устанавливаются дополнительные опции для Tag; если не знаете что rem делаете - лучше не трогайте, по умолчанию - пусто. rem Некоторые замечания относительно Tag. rem Tag копирует только текстовую информацию, картинки не переносятся. rem В некоторых случаях tag.exe вываливается с ошибкой и предложением сообщить rem о ней в Microsoft после попытки скопировать теги из файлов, обработанных rem iTunes. Причиной, судя по всему, является нестанадартное размещение или rem кодирование картинки обложки (Cover Art). Вероятны и иные ошибки, мне rem неизвестные. rem Варианты обхода: попробовать определить и отключить проблемные теги. Для rem просмотра списка имеющихся в файле тегов: tag.exe file.mp3. В моём случае rem оказалось, что сбоит на "Cover Art (front)". Решение: перекрыть тег пустым rem значением. rem set Tags=-t "Cover Art (front)=" rem Для подавления вывода можно использовать комбинацию --hidetags --hideinfo rem (--hidenames уже включено) - тогда будет высвечиваться только заголовок rem программы с номером версии и сообщение о выполнении задачи. set Tags= rem ---------------------------------------------------------------------------- rem Установка путей к lame, oggenc и tag.exe. По умолчанию скрипт можно rem запустить из любого места, при условии, что все исполняемые файлы комплекта rem находятся с ним в одной директории: rem x:\bat_dir\converter.bat y:\mp3_dir rem Если вы хотите помещать сам скрипт в директорию с mp3-файлами или rem использовать свои версии программ, то пропишите полные пути к lame, oggenc rem и tag.exe (либо поместите их в %PATH%) и закомментируйте строчку rem set PATH=%~dp0;%PATH%. Впрочем, помещённый в %PATH% скрипт прекрасно rem вызывается из текущей диектории, поэтому остаётся только напечатать rem converter.bat и расслабиться. set LAME=lame.exe set TAG=tag.exe set VORBIS=oggenc2.exe set PATH=%~dp0;%PATH% rem ---------------------------------------------------------------------------- rem На этом опции конфигурирования заканчиваются, далее идёт окончательная rem установка переменных и собственно выполняемая часть. rem ---------------------------------------------------------------------------- set ERR=Ошибка: не определена переменная if defined Frequency set Frequency=--resample %Frequency% if defined Quality (set Quality=-q%Quality%) else if defined Bitrate set Quality=-b%Bitrate% if not defined Downmix set Downmix=0 if not defined TmpFile set ERR=%ERR% "TmpFile"&goto ERRMSG if not defined DeleteSrc set ERR=%ERR% "DeleteSrc"&goto ERRMSG set VORBIS=%VORBIS% %Quality% %Frequency% %VorbisAddOpts% set LAME=%LAME% %LameAddOpts% --decode set Version=Alex Dragon's MP3 to OGG converter v1.1 set HR========================================= set P=%~f2 if not defined P (set P=.\*.mp3) else ( if not exist "%P%\." ((set ERR=Неправильно задан путь)&goto ERRMSG) else set P="%P%\*.mp3" ) for /F "delims=" %%F in ('dir /S /A-D /B /O:N %P%') do ( echo.&echo %HR%&echo %Version%&echo %HR%&echo. if %Downmix%==1 (for /F "tokens=4 delims=, " %%M in ('%Tag% --hidetags --hidenames --simple "%%~dpnF.mp3" 2^>^&1^|^ findstr /L "Details:"') do ( if Mono==%%M set Downmix= if Stereo==%%M set Downmix=--downmix ) ) else set Downmix= if %TmpFile%==0 (%LAME% "%%~dpnF.mp3" - | %VORBIS% !Downmix! -o "%%~dpnF.ogg" -) else ( %LAME% "%%~dpnF.mp3" -o "%%~dpnF.wav" %VORBIS% !Downmix! "%%~dpnF.wav" -o "%%~dpnF.ogg" del "%%~dpnF.wav" ) %TAG% --simple --hidenames %Tags% -t "ENCODEDBY=ADMTOC v1.1" --fromfile "%%~dpnF.mp3" "%%~dpnF.ogg" if %DeleteSrc%==1 (if exist "%%~dpnF.ogg" del "%%~dpnF.mp3") echo. ) goto END :ERRMSG echo. echo %ERR%. :END echo on