вторник, 18 марта 2008 г.

Сборка и настройка MPlayer для Mac OS X (Hackintosh)

*
При отсутствии повара пользуют и кухарку...
(Народная мудрость)

Всем хорош Мак, только видео в нём смотреть нечем... И нет универсального инструмента для тупенького удовлетворения насущных потребностей типа:

сконвертировать фильмец для просмотра на мобилке (Nokia 7610)
рипнуть DVD
перегнать из HDTV в обычную авишку с x264 кодеком
нарезать превьюшек для фильма
посмотреть тот же DVD в нормальном качестве (имеется в виду ГРАМОТНОЕ применение фильтров деинтерлейсинга и постпроцессинга, а не тупые шаблоны, зашитые неизвестно кем и хз куда)
и т.п.

В *nix всё это легко и непринуждённо делается связкой MPlayer + mencoder + ffmpeg, а поскольку Mac OS X тоже *nix - то нет видимых причин, что мешают нам собрать эти шедевры и для Мака. Если Вы приготовились орать о том, что дескать можно воспользоваться готовыми сборками/портами - STFU! Эти "готовые" отличаются во-первых древностью, а во-вторых не имеют в наличии нужного нам функционала.

Ежели нет желания лишний раз "топтать клаву", можно ограничиться "чем Бог послал":
Handbrake - б/м нормальный конвертор видео
MacTheRipper - A DVD extractor for Mac OS X
MPlayer for Mac OS X - готовая сборка MPlayer-а
VLC - эт типа супер-пупер видеоплеер для быдломассы... Кому как, а у меня сие поделие вызывает только рвотные позывы. Качество кода - не побоюсь этого слова - говно, да и картинка так себе...
RealPlayer - в принципе - довольно интересное и вменяемое поделие, пусть и закрытое для широкой публики. Мне сей продукт по какой-то необъяснимой причине весьма симпатичен. Несмотря ни на что - must have.
Кроме того есть "дефолтный" QuickTime, пинать который уже просто скучно, но стоит признать, что Pro версия таки прокатит под пивко... Есть DivX Player, поезд которого давно ушёл и непонятно вообще, что держит его на плаву. Может есть что-то ещё, дико проприетарное и требующее "утром деньги - вечером стулья" - в анус. Поскольку я не претендую на "истину в последней инстанции", то даже упоминание о подобных "продуктах" без предварительной 100%-ной предоплаты считаю преступным.

А наша дорога ведёт к MacPorts Project - MUST HAVE для всех любознательных Маководов (иначе получается, что купили TRUE Unix, а Unix софт и не пользуем... О том, что Xcode необходим для сих благородных забав не забыли?). Хотя надо признать и факт наличия обширной коллекции свободного софта для Мака, существующего вне рамок MacPorts (что не может не радовать). Но именно MacPorts поможет нам установить в систему все необходимые компоненты для правильной сборки MPlayer-а и ffmpeg-а. Что значит правильная? Только то, что все прочие мультимедиа приложения после этого можно смело выкинуть найух и не испытывать при сём ни малейшего дискомфорта.

Единственное, что требует "ручного" труда - библиотеки amr*.


> cat get_amr

#!/bin/sh
wget http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.0.tar.bz2
wget http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.2.tar.bz2


Версии amrnb-7.0.0.0 и amrwb-7.0.0.2 являются наиболее актуальными на сегодня. Качаем, компилим, ставим. Посетив ftp сервер можно не мудрствуя лукаво хапнуть в будущем зело более актуальный релиз. Напомню, что для легального использования этих кодеков в некоммерческих целях и сугубо для себя любимого я связался с юридическим отделом 3gpp консорциума (3GPPLegal@etsi.org) и получил официальное разрешение на компиляцию бинарников и поддержки 3gp в сторонних продуктах (MPlayer + mencoder + ffmpeg). Эта инициатива также способствовала появлению amr* библиотек и поддержке amr* в ffmpeg для репозитория packman (SuSE рулит!).

Для нарезки превьюшек накорябал убогий скриптец, работающий с ffmpeg и mencoder-ом:
movie_splitter
о его опциях в кратце можно пофтыкать в сём трэде:
MPlayer + MEncoder

Переходим к "водным процедурам". Перво-наперво - смотрим, что именно нам предстоит тащить из svn репозитория:

> cat get_mplayer

#!/bin/sh
svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer
svn checkout svn://svn.mplayerhq.hu/mplayerosx/trunk/ mplayerosx
ln -sf ./mplayer ./main
ln -sf ./mplayer ./main_noaltivec


На кой буй нам вторая строка спрашиваете - так не ограничивать же себя только консолью! Коли собираем нормальный плеер - так уж прикрутить Cocoa интерфейс и сделать всё как "у взрослых" сам Бог велел. Отдельного упоминания стоит slave режим MPlayer-а. Это значит, что он может работать как back-end для любого гуя. Imho - это гораздо правильнее, чем использовать библиотеки типа Xine, поскольку для поьзователя возможности по настройке/конфигурации режима воспроизведения MPlayer-а в slave режиме зело более привлекательны, чем тупое обращение к вызовам библиотек (того же Xine).

Создание же симлинков main и main_noaltivec необходимо для формирования должной структуры каталогов по сборке гуя для Mac OS X. По-хорошему тут должны быть не симлинки, а копии исходников с собранными бинарями mplayer-а (с поддержкой altivec инструкций и без оной), но, поскольку собирем для себя, то сии тонкости и куртуазности нам не указ.

Шаг нумеро разЪ:

> sudo port install Xft2 XviD a52dec aalib autoconf automake cdparanoia faac faad2 fontconfig freetype fribidi gettext giflib glib2 gtk2 id3lib id3tool id3v2 jpeg lame libcddb libcdio libdv libdvdcss libdvdplay libdvdread libid3tag libmad libmpcdec libogg libpng libsdl libsdl-framework libtheora libtool libungif libvorbis live555 lzo2 pkgconfig pango smpeg x264 zlib


Надеюсь, что не пропустил чего-то важного. Даже если и упустил - Вы сами сможете восполнить пробелы. Установка glib2 и gtk2 на случай если вдруг появится желание собрать и традиционный gmplayer (--enable-gui). Теперь чешем в каталог с исходниками mplayer-а и рисуем ему конфигурационный файл:


: mplayer > cat ./config_build_01

#!/bin/sh
make distclean
export PKG_CONFIG_PATH="/opt/local/lib/pkgconfig:\
/usr/X11R6/lib/pkgconfig:\
/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:\
/sw/lib/pkgconfig:$PKG_CONFIG_PATH"

./configure --with-extraincdir=/opt/local/include \
--with-extralibdir=/opt/local/lib \
--enable-largefiles --enable-menu \
--disable-3dnow --disable-3dnowext --disable-fastmemcpy \
--with-freetype-config=/opt/local/bin/freetype-config \
--enable-dvdread --enable-libdvdcss-internal \
--with-fribidi-config=/opt/local/bin/fribidi-config $1
read a1
make && \
sudo make install
#EOF


Наиболее пронырливые уже могут заметить отсутствие указания на /opt/local/lib/live в выражении --with-extraincdir= . Это означает, что потоковые трансляции нам с этой сборкой не смотреть. Обусловлено по большей части моей ленью. При включении в сборку live555 сбивается механизм автоконфигурации доступных компонентов. Это характерно только для Mac OS X, так что мне просто влом лезть и разбираться. Можно конечно же попробовать чуток более навороченный вариантец конфига:


: mplayer > cat ./config_build_not_working_yet


#!/bin/sh
make distclean
export PKG_CONFIG_PATH="/opt/local/lib/pkgconfig:\
/usr/X11R6/lib/pkgconfig:/sw/lib/pkgconfig\
/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"

./configure --with-extraincdir=/opt/local/include:/opt/local/lib/live:\
/opt/local/lib:/usr/include:/usr/local/include \
--with-extralibdir=/opt/local/lib:/opt/local/lib/live:\
/usr/lib:/usr/local/lib \
--enable-largefiles --enable-menu \
--enable-x264 --enable-xvid --enable-libdv \
--enable-libamr_nb --enable-libamr_wb \
--with-freetype-config=/opt/local/bin/freetype-config \
--enable-dvdread --enable-libdvdcss-internal \
--disable-3dnow --disable-3dnowext --disable-fastmemcpy \
--with-fribidi-config=/opt/local/bin/fribidi-config $1
read a1
make
read a1
sudo make install
#EOF


Да только при таком подходе придётся ещё что-то рисовать для CFLAGS и LDFLAGS (хз что если честно), иначе велик шанс нарваться на расплату (что самое обидное - так это то, что сбой идёт именно на линковке самого бинаря mplayer-а! то бишь все компоненты собраны, а собрать воедино не получается...). Посему на поддержку live555 в mplayer-е для Mac OS X 10.4 пока забил болт. Трансляции смотрю RealPlayer-ом по причине дикой идиосинкразии к vlc.

Запускаем наш ./config_build_01 и смотрим коровьими глазами на результаты (перед компиляцией он покажет итоги конфига и будет ждать нажатия на Enter для продолжения работы):


Config files successfully generated by ./configure --with-extraincdir=/opt/local/include --with-extralibdir=/opt/local/lib --enable-largefiles --enable-menu --disable-3dnow --disable-3dnowext --disable-fastmemcpy --with-freetype-config=/opt/local/bin/freetype-config --enable-dvdread --enable-libdvdcss-internal --with-fribidi-config=/opt/local/bin/fribidi-config !

Install prefix: /usr/local
Data directory: /usr/local/share/mplayer
Config direct.: /usr/local/etc/mplayer

Byte order: little-endian
Optimizing for: k8

Languages:
Messages/GUI: en
Manual pages: en

Enabled optional drivers:
Input: ftp tv cddb cdda libdvdcss(internal) dvdread(external) vcd network
Codecs: x264 xvid libdv libamr_wb libamr_nb libavcodec qtx real xanim win32 faad2 faac musepack libmpeg2 liba52 mp3lib libtheora tremor(internal) libmad liblzo gif
Audio output: openal esd sdl mpegpes(file) macosx
Video output: sdl gif89a pnm jpeg png mpegpes(file) aa opengl xv x11 xover md5sum tga macosx quartz
Audio filters:

Disabled optional drivers:
Input: dvdnav vstream pvr radio tv-teletext tv-v4l2 tv-v4l1 tv-dshow live555 nemesi dvb smb
Codecs: libdca speex toolame twolame
Audio output: sun alsa jack pulse arts oss v4l2 ivtv dxr2 nas
Video output: zr zr2 v4l2 ivtv dxr3 dxr2 vesa fbdev svga caca ggi xmga mga xvidix winvidix cvidix 3dfx dga xvmc dfbmga directfb bl xvr100 tdfx_vid s3fb tdfxfb
Audio filters: ladspa


Основное внимание - на последнюю секцию Disabled optional drivers. Если Вы видите, что лакомый кусочек недоступен - установите требуемый компонент и повторите процедуру конфигурирования. Как видите я прекрасно обхожусь без поддержки меню DVD дисков (пусть сперва заплятят за просмотр рекламы), мне не нужна поддержка Самбы (smb) и скрепя сердце отказался от live555. Оставшиеся сиротливо за бортом кодеки интереса практически не представляют (хотя кому-то может и пригодится speex). Всё прочее (видео и аудиовывод плюс фильтры аудио) для Mac OS X несущественно, поскольку... это Mac OS X, а не хвост собачий.

Собрали, поставили в /usr/local (по-умолчанию). Самое время накидать костяк конфига для себя любимого:


> cat ~/.mplayer/config

# Write your default config options here!
ao="macosx"
vo="macosx"
double="yes"
framedrop="yes"
vf=kerndeint,pp,screenshot="yes"
autoq=100
idx="yes"


Эт значит, что мы будем использовать родной вывод macosx для аудио и видео, плюс двойной буфер для получения чёткой и стабильной картинки, плюс индексацию побитых авишек и динамический режим постобработки изображения. На первых порах этого достаточно, а дальше уж сами (man mplayer).

Проверяем как оно работает. Если всё путём - чешем в каталог mplayerosx, знакомимся с содержанием Makefile-а (я заремил в нём пару несущественных строк) и собираем настоящий Какао-гуй, шоб всё как у взрослых...


: mplayerosx > cat config_build

#!/bin/sh
make clean
export PKG_CONFIG_PATH="/opt/local/lib/pkgconfig:\
/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"
make dist


Поскольку гхм... грешен... то автоматическая сборка гуя всегда заканчивается одинаково:

..............................................................................
hdiutil: create failed - internal error


Не беда. Чешем в

mplayerosx/dist/MPlayer OSX.app/Contents/Resources/\
External_Binaries/mplayer.app/Contents/MacOS

и в

mplayerosx/dist/MPlayer OSX.app/Contents/Resources/\
External_Binaries/mplayer_noaltivec.app/Contents/MacOS


Проверяем наличие бинаря 'mplayer', который мы собрали не так давно со всем тщанием и установили в /usr/local/bin. Как правило его там не будет. Копируем ручками (хоть из /usr/local/bin, хоть из каталога с исходниками, где мы его собирали). Всё. mplayerosx/dist/MPlayer OSX.app - и есть наше чудо-юдо-приложение. Смело засовываем его в /Applications вместо прежнего убожества.

Запускаем. Command+L - покажет лог MPlayer-а и параметры, передаваемые гуём. Для полного счастья рисуем в Preferences -> Miscellaneous -> Advanced settings: Additional parameters:

-double -framedrop -vf kerndeint,pp,screenshot -autoq 100 -idx


там же при желании можно сбросить все цепочки фильтров, передаваемых гуём на исполнение, и нарисовать свою собственную.




P.S. для ffmpeg-а схалявил:

> sudo port edit ffmpeg

рихтанул сам порт, добив всего, чего душа пожелала (типа x264, libamr* и т.п.), и засадил тупенько:

> sudo port install ffmpeg

полёт нормальный :)

2 комментария:

Анонимный комментирует...

а вот зачем macports?
я раньше тоже fink пользовался, но это лишний мусор в системе.

Unknown комментирует...

ffmpeg собирается прекрасно c variants, ну, кроме libamr