У меня дома живет
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.deb2. Качаем и распаковываем
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-perl4. Запускайте 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.
Рассинхронизация видео и звукаПолучил такое на некоторых медиа-файлах. Как бороться - пока не понял...