У владельцев наладонников, карманных плееров, мобильников и т.п. бренчаще-звенящей портативной машинерии постоянная головная боль — как бы в обычно скромные объёмы памяти запихнуть побольше музыки или аудиокнижек. А памяти много не бывает. Поэтому естественно сам собой возникает вопрос об ужатии коллекции до каких-то минимальных объёмов. Решается это по-разному — в зависимости от возможностей, вкусов и предпочтений.
Один из вариантов — перекодировать в 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. Великим программерам банановыми шкурками не кидаться и пальцы не гнуть — я не программист ни разу, просто иногда совсем уж тошно ждать милостей от природы. Писано великим граматеем для ещё больших граматеев.
Один из вариантов — перекодировать в 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