2008-05-03

mediaserv

У меня дома живет Debian GNU/Linux, я там держу HDD с фильмами. Как только у меня появилась N810, я сразу задался вопросом - а как бы мне смотреть фильмы прямо с сервера, не затевая муторное копирование и перекодирование? Ответ мне подсказали достаточно быстро: mediaserv.

В основе этого решения лежит MPlayer, который запускается из-под скрипта tablet-encode для перекодирования видео. Данные в сеть раздает другой перловый скрипт - mediaserv. Вся эта связка уже натаскана на maemo, осталось только запустить и насладиться. Решение годится скорее для домашней сети, чем для вещания в инет, хотя некие наметки для многопользовательского режима все-таки есть.

Итак, последовательные шаги.

1. Установка MPlayer.

Качаем исходники MPlayer, распаковываем. Качаем оттуда же бинарные кодеки, распаковываем и копируем в /usr/local/lib/codecs.

Поскольку мы будем собирать пакет .deb, нам потребуются fakeroot и debhelper, установите их, если только вы уже не занимаетесь сборкой пакетов debian на этой машине. Также для MPlayer потребуется libconfhelper-perl и liblogfile-rotate-perl:

sudo apt-get install fakeroot debhelper \
libconfhelper-perl \
liblogfile-rotate-perl
Только после всего этого заходим в распакованный MPlayer и говорим:

DEB_BUILD_OPTIONS="--enable-largefiles --disable-tv" fakeroot debian/rules binary


Полный список опций скажет ./configure --help, с другой стороны можно не пижонить и набирать просто fakeroot debian/rules binary. Результат, как всегда, лежит каталогом выше, устанавливаем его в систему:

sudo dpkg -i ../mplayer_1.0svn_i386.deb

2. Качаем и распаковываем tablet-encoder. Его можно закинуть в PATH, но это необязательно, главное помнить путь.

3. Качаем и распаковываем mediaserv. Распакуйте и запустите install.sh: он создаст в каталог ~/.mediaserv и поместит туда файл config. Пробегитесь по настройкам и установите как минимум путь к tablet-encoder.

Кроме того, надо позаботиться об установке пакетов, от которых зависит mediaserv:


sudo apt-get install libdatetime-format-mail-perl \
libdatetime-format-w3cdtf-perl \
libdatetime-perl \
libtest-manifest-perl


Для отдачи наружу RSS-ленты, потребуются перловые модули XML::RSS и XML::Parser. Автор рекомендует ставить их через CPAN, но в Debian уже есть пакеты:

sudo apt-get install libxml-rss-perl libxml-parser-perl

4. Запускайте mediaserv, он напишет конфигурацию и форкнется, повиснув сервером.

5. Идите в браузере по адресу и порту, который вы пробили в ~/.mediaserv/config, выбирайте нужное видео. Далее, запускается встроенный медиапроигрыватель и... можно смотреть.

Нюансы (а как же без них?)

1. Перекодированные файлы не проигрываются

У меня замечательно генерировались страницы с тумбалисами в браузере, но при тычке на картинку, перекодированные файлы решительно отказывались проигрываться. Почти сразу я выяснил, что перекодированный видеофайл имеет нулевую длину. Причиной этого оказалось нежелание tablet-encode работать с ключами -p smallest и -p small: отредактируйте config и выставьте качество в average - все должно заработать.

2. Русский язык в наименованиях файлов

(если вы - фанатик транслитерационного наименования файлов, можете смело пропускать)

Поскольку HTTP-страницы mediaserv генерирует, считывая имена файлов "как есть", а Contnet-Type выставляет как "text/html; charset=utf-8", это может породить проблемы. Возьмем мой случай: локаль ru_RU.CP1251, скрипт считывает и выводит имена файлов в файловой системе, но браузер пытается истрактовать их как UTF-8. Получается нечитаемо по определению.

Казалось бы, нет ничего проще: поменять Content-Type с utf-8 на windows-1251, и дело с концом! Но в браузере-то все будет ОК, а вот медиа-плеер на таблетке будет решительно промахиваться и не находить фильм для просмотра, если в нем были русские буквы. Обратно получается ерудна.

На свою беду, я не поклонник правильных решений. Мой рецепт: перед выводом страниц и RSS-лент, перекодировать из текущей кодировки в UTF-8. Для этого надо подредактировать скрипт: в начале загрузить модуль Encoding:

use Encode qw(from_to);

а в процессе формирования текстовых строк использовать функцию form_to, например:


sub doBrowse {
...
$response->header( 'Content-Type' =>
'text/html; charset=utf-8' );
from_to($content, "cp1251", "utf8");
$response->content($content);
}
(и точно так же в других местах, например функция doRSS).

3. Рассинхронизация видео и звука

Получил такое на некоторых медиа-файлах. Как бороться - пока не понял...

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

dikiy.com комментирует...

А я вот несколько моментов не понял : файл начинает декодироваться только после клика на нём в браузере на странице mediaserv ? Хотелось бы чтобы декодирование происходило в фоне и заблаговременно - ибо приходится всё таки какое то время ждать после клика... на некоторых фильмах у меня тоже конкретная рассинхронизация звука :(

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

дык если заранее, то все упрощается. берем фильмы, натравливаем на них tablet-encode. результат отдаем наружу по http каталогом с видимым индексом через apache.

а со звуком - да, я сам пока не поборол...