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

  • Про китайский «социализм» из первых рук

    На самом деле про политику девочка не говорит ничего. Но, по-моему, красноречивее всего даже не то про что она рассказывает — хотя это более чем…

  • (no subject)

    Все так возбудились на венчание «наследника», в очередной раз пошли разговоры про реставрацию. Само по себе действо, конечно, до изжоги пошлое и…

  • (no subject)

    В самом деле, если Зеленскому можно быть президентом, почему Вассерману нельзя быть депутатом?

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments