понедельник, 12 января 2015 г.

HTPC своими руками (часть 2)

В первой части я рассказывал про аппаратную начинку своего HTPC. Теперь пора рассказать про его программную составляющую.

В самом начала HTPC-строения я использовал MythTV, серверная часть которого была установлена на обычном десктопе, а клиенты на том же компьютере и ноутбуке.


MythTV использовал аналоговый тв-тюнер (Beholder 507 FM), что давало возможность записывать интересные передачи с кабельного тв и смотреть их в удобное время на любом компьютере. Этот тюнер замечательно поддерживается в Linux, а его пульт дистанционного управления поддерживается LIRC.

Позже в одном из обновлений MythTV сломали работу с аналоговыми тюнерами и не спешили чинить, так что пришлось искать альтернативу. Еще один недостаток этого решения - записывать можно было только одну передачу одновременно, ведь тюнер может быть настроен только на один канал. Это ограничение можно было обойти добавив второй тюнер, но от этого апгрейда я отказался. Из положительных моментов - поддержка записи по расписанию, timeshift (вы можете поставить телепередачу на паузу и сходить за чаем) и пропуск рекламных блоков (не всегда определяло правильно).

С появлением Raspberry PI я начал миграцию своего HTPC на эту платформу. К сожалению использовать MythTV на Raspberry PI не получится, так как у него нет поддержки аппаратных декодеров, а на программную обработку не хватит ресурсов. В процессе поиска альтернативы для MythTV я пришел к XBMC (сейчас он уже называется Kodi, но поскольку версия, установленная у меня еще называется XMBC, то дальше я буду называть его по-старому).


Для raspberry pi есть несколько дистрибутивов с поддержкой XBMC - я точно помню что тестировал Raspbmc, OpenELEC и Raspbian. Наиболее стабильным и простым в установке оказался OpenELEC - дальше я работал только с этим дистрибутивом. У Raspberry PI есть поддержка CEC, которую я обнаружил совершенно случайно. Оказалось очень удобным, но на моем телевизоре LG работали только базовые функции вроде play/pause, stop, forward, rewind, next, previous и крестовина навигации (up, down, left, right). Чтобы заработал CEC, нужно включить поддержку SimpLink в телевизоре (в других телевизорах эта фича называется по-другому). В принципе этого хватало, а расширенное управление выполнялось со смартфона через Official XBMC Remote.

Поскольку Raspberry PI уже не используется, то дальнейшее описание приводится для HTPC на базе Gigabyte GB-XM14-1037. Установка очень проста - скачиваем дистрибутив с сайта OpenELEC и готовим установочный диск (в моем случае это флешка /dev/sdd). Будьте внимательны при выполнении этих команд - вы можете испортить содержимое другого диска.

$ wget -P /tmp http://releases.openelec.tv/OpenELEC-Generic.x86_64-4.2.1.tar
$ cd /tmp
$ tar -xf OpenELEC-Generic.x86_64-4.2.1.tar
$ cd OpenELEC-Generic.x86_64-4.2.1
$ sudo ./create_installstick /dev/sdd

Для начала установки нужно загрузить HTPC с созданной флешки. Сам процесс установки очень прост и состоит из далее, далее, далее...

Первая же загрузка показалась просто мгновенной в сравнении со старым вариантом на базе raspberry pi. Сказывается более мощный процессор и скорость ssd диска. Осталось подключить ресурсы домашней сети: фотографии, видео и IPTV от АтлантТелеком. Домашний сервер раздает ресурсы через Samba и NFS - поддержка обоих протоколов есть в XMBC.

Для поддержки IPTV на сервере установлен Tvheadend, который принимает multicast траффик и преобразует его в unicast - раньше сеть работала через wifi и это было необходимо. Сейчас HTPC подключен через ethernet, но менять что-то не вижу смысла. В следующей части я опишу особенности настройки Tvheadend в сети АтлантТелекома - возможно это кому-то пригодится. Tvheadend поддерживает запись по расписанию, timeshift и web клиент (нужен установленный плагин vlc).

Из плагинов установлен только Yahoo weather (для прогноза погоды), Youtube (для просмотра отложенного видео), tvheadend pvr клиент и retroarch для поддержки эмуляции старых консолей. С retroarch пришлось повозиться, т.к. версия для xbmc не устанавливается на 4.2.1. Я перепробовал много разных сборок, пока не нашелся рабочий вариант. После установки плагина нужно настроить соответствие кнопок gamepad'а и эмулятора. Мне пришлось пожертвовать одной из кнопок select, чтобы сохранился доступ к меню retroarch. Осталось скопировать rom-файлы в ~/emulators/retroarch/rom/ и насладиться игровым процессом. Как же мне не хватало возможности сохраниться в том же Comix Zone на сеге!

Пару слов о костылях, которыми пришлось поправлять некоторые моменты. Самым неприятным была случайная попытка выключить телевизор не тем пультом. При нажатии на "power" на пульте от HTPC последний без лишних вопросов выключался, а чтобы его включить приходилось нащупывать кнопку включения за телевизором. Эта проблема была решена радикально - я просто отключил реакцию на событие в конфигурации XBMC

$ cat ~/.xbmc/userdata/keymaps/remote.xml 
<keymap>
  <global>
      <remote>
          <power>NOOP</power>
      </remote>
  </global>
</keymap>

Вторым неприятным моментом было отсутствие повторения нажатия для Volume Up/Down и выражалось в невозможности быстро уменьшить или увеличить звук. Поиск в интернете навело меня на маленький скрипт, который решает эту проблему.

$ cat ~/volume.py
import json, sys, xbmc
step = 10
if sys.argv[1] == 'down':
    step *= -1
rpc = '{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["volume"]}, "id": 1}'
vol = json.loads(xbmc.executeJSONRPC(rpc))["result"]["volume"]
xbmc.executebuiltin('SetVolume(%d,showVolumeBar)' % (vol + step))

Теперь нужно повесить вызов этого скрипта в качестве обработчика VolUp/VolDown. Добавляем в файл ~/.xbmc/userdata/keymaps/remote.xml секцию

<keymap>
  <global>
      <remote>
          <volumeplus>RunScript("/storage/volume.py", "up")</volumeplus>
          <volumeminus>RunScript("/storage/volume.py", "down")</volumeminus>
      </remote>
  </global>
</keymap>

Теперь регулировка уровня звука идет с шагом 10%, если нужно меньше, то измените значение "step = 10" в файле ~/xbmc-volume.py.

Комментариев нет:

Отправить комментарий