Alex Dragon (alex_dragon) wrote,
Alex Dragon
alex_dragon

Category:

MP3 to OGG конвертер — bat-файл

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

Subscribe

Recent Posts from This Journal

  • (no subject)

    Дня два теперь во всех утюгах и лентах будут страдать за Сирию — некромантия не помогла. Само собой тут же вылезут на катедру люди в тогах и начнут…

  • Торжество либеральной демократии

    Глянул что там на Би-Би-Си клевещут про ЮК, пришёл в тихий восторг: На сайте телеканала YTN опубликован текст обращения президента к нации, в…

  • (no subject)

    А смешно в Южной Корее пошутили.

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments