Русский
Русский
English
Статистика
Реклама

Iptv

Тестируем плату для 4K Android ТВ-приставок на чипе Realtek RTD1395

27.08.2020 10:09:54 | Автор: admin


Мы недавно получили посылку от партнеров в Тайване компании Realtek. Внутри была плата Hercules OTT 32-битная, с памятью на 2 Гб и предустановленной ОС Android 9. Посмотрим, что она умеет и как ее можно использовать для разработки новых ТВ-приставок.

Плата Hercules OTT представляет собой Android IPTV box, который воспроизводит видео любых форматов с максимальным разрешением 4K. Обеспечена поддержка стриминговых сервисов Youtube, Netflix и др. посредством dash и hls. Будут работать и любые другие приложения для Android, такие как приложения аудио-видеозвонков и конференций. Однако с играми будут проблемы из за неудобства управления (придется подключать геймпад).

Realtek представила платы на базе чипа RTD1395 еще в 2018 году, их задействовали в своих абонентских устройствах операторы IP и кабельного телевидения, а также программисты, которые разрабатывают ПО для ТВ-приставок. Чип RTD1395 с четырьмя ядрами ARM Cortex-A53 и граф. процессором Mali-470 стал тогда более дешевой альтернативой для других моделей RTD1295 и RTD1296, но при этом поддерживал те же возможности работы с видео 4K. Сейчас аналогичные решения есть у Amlogic, Mediatek и других чип-вендоров, но о них мы расскажем в другой раз.

А сейчас сфокусируемся на нашей посылке.

Тестируем железо на плате


Так как плата Hercules ОТТ является отладочной, мы проверяли только физические способности чипа.

Итак, характеристики RTD1395ES:
  • 4-ядерный ARM Cortex-A53
  • Графический процессор ARM Mali-470 MP4
  • Декодер H.265 4K 60 fps, VP9 4K 60 fps, H.264 4K 30 fps
  • Кодировщик H.264 1080P 60 fps
  • HDR10, HLG, TCH Prime, Dolby Vision, HDR10+
  • USB2.0 хост/устройство
  • HDMI Tx v2.0b + CEC
  • 10/100 MAC и PHY + Gigabit Ethernet MAC
  • PCIe 2.0
  • SGMII
  • SDIO 3.0 и SD 3.0
  • I2S ввод/вывод
  • S/PDIF вывод




Результаты тестирования платы:
  • 2 х USB 2.0 оба работают
  • 1 х Ethernet 100 Мбитный порт работает
  • 1 х HDMI работает
  • 1 х S/PDIF работает
  • 1 х 3,5 мм аудиоразъем работает
  • 1 х слот для SD-карт работает
  • 1 х ИК-порт так как родного пульта у нас не было, а пульт от Amlogic не подошёл, то протестировать не смогли
  • 1 х USB Type-C только как питание
  • 1 х WIFI/Bluetooth-модуль: wifi работает, bluetooth не проверяли


Питание платы реализовано по кабелю Type-C на 5 Вольт так как отдельный разъём питания не распаян.

Для навигации в Android мы пробовали использовать пульт Opal с usb-свистком, который прежде работал со всеми IPTV-коробками, но на этой работать он отказался и даже не определялся в lsusb. Из-за этого пришлось пользоваться клавиатурой/мышью, что не очень удобно из-за отсутствия кнопок Back и Menu.

Сам процессор во время работы прилично греется, поэтому мы прилепили радиатор в виде тормозной колодки (см. на фото выше).

Тестируем воспроизведение видео


1. Запускаем 56 тестовых роликов


Проверяем возможности декодирования с помощью тестовых видео с сайта http://jell.yfish.us/

Открыть список из 56 видеофайлов для проверки:
jellyfish-3-mbps-hd-h264.mkv
jellyfish-3-mbps-hd-hevc-10bit.mkv
jellyfish-3-mbps-hd-hevc.mkv
jellyfish-5-mbps-hd-h264.mkv
jellyfish-5-mbps-hd-hevc.mkv
jellyfish-10-mbps-hd-h264.mkv
jellyfish-10-mbps-hd-hevc-10bit.mkv
jellyfish-10-mbps-hd-hevc.mkv
jellyfish-15-mbps-hd-h264.mkv
jellyfish-15-mbps-hd-hevc.mkv
jellyfish-20-mbps-hd-h264.mkv
jellyfish-20-mbps-hd-hevc-10bit.mkv
jellyfish-20-mbps-hd-hevc.mkv
jellyfish-25-mbps-hd-h264.mkv
jellyfish-25-mbps-hd-hevc.mkv
jellyfish-30-mbps-hd-h264.mkv
jellyfish-30-mbps-hd-hevc.mkv
jellyfish-35-mbps-hd-h264.mkv
jellyfish-35-mbps-hd-hevc.mkv
jellyfish-40-mbps-hd-h264.mkv
jellyfish-40-mbps-hd-hevc-10bit.mkv
jellyfish-40-mbps-hd-hevc.mkv
jellyfish-45-mbps-hd-h264.mkv
jellyfish-45-mbps-hd-hevc.mkv
jellyfish-50-mbps-hd-h264.mkv
jellyfish-50-mbps-hd-hevc.mkv
jellyfish-55-mbps-hd-h264.mkv
jellyfish-55-mbps-hd-hevc.mkv
jellyfish-60-mbps-hd-h264.mkv
jellyfish-60-mbps-hd-hevc-10bit.mkv
jellyfish-60-mbps-hd-hevc.mkv
jellyfish-70-mbps-hd-h264.mkv
jellyfish-70-mbps-hd-hevc.mkv
jellyfish-80-mbps-hd-h264.mkv
jellyfish-80-mbps-hd-hevc.mkv
jellyfish-90-mbps-hd-h264.mkv
jellyfish-90-mbps-hd-hevc-10bit.mkv
jellyfish-90-mbps-hd-hevc.mkv
jellyfish-100-mbps-hd-h264.mkv
jellyfish-100-mbps-hd-hevc.mkv
jellyfish-110-mbps-hd-h264.mkv
jellyfish-110-mbps-hd-hevc.mkv
jellyfish-120-mbps-4k-uhd-h264.mkv
jellyfish-120-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-140-mbps-4k-uhd-h264.mkv
jellyfish-140-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-160-mbps-4k-uhd-h264.mkv
jellyfish-160-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-180-mbps-4k-uhd-h264.mkv
jellyfish-180-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-200-mbps-4k-uhd-h264.mkv
jellyfish-200-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-250-mbps-4k-uhd-h264.mkv
jellyfish-250-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-300-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-400-mbps-4k-uhd-hevc-10bit.mkv


Из всех протестированных видео не запустились только 3 файла из-за краша в realtek.rvsd@1.0-service:
jellyfish-250-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-300-mbps-4k-uhd-hevc-10bit.mkv
jellyfish-400-mbps-4k-uhd-hevc-10bit.mkv

Лог ошибки воспроизведения:
DEBUG (4077 4077)  Fpid: 1815, tid: 4069, name: rvsd@1.0-servic  >>> /vendor/bin/hw/vendor.realtek.rvsd@1.0-service <<<            DEBUG (4077 4077)  Fsignal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------                                                    DEBUG (4077 4077)  FAbort message: 'FORTIFY: pthread_mutex_destroy called on a destroyed mutex (0xa7b1b06c)'


В 53 видеофайлах, которые успешно открылись в процессе тестирования, не было замечено подвисаний и пропуска кадров. Возможно, чип способен осилить и более сложные по битрейту видео, но мы этого не узнаем.

Скриншоты работы видеоплеера от Realtek получить не удалось. Вероятно, дело в том что плеер реализован не средствами Android, а имеет доступ напрямую к фреймбуферу, чтобы защитить контент от пиратства. В VLC и ExoPlayer скриншоты делаются без проблем.

При тестировании этих же видео в VLC файлы h264 играет до 180 Мбит/с, дальше уже не успевает подготавливать кадры. HEVC перестаёт воспроизводить на 120 Мбит/с (судя по логам крашей из-за нехватки памяти).

2. Запускаем тест Geekbench3


В тесте Geekbench3 система набрала 523/1656 баллов SingleCore/MultiCore, что примерно равно производительности чипа Amlogic S905 (500/1400) а в multicore даже немного опережает. Но при этом значительно отстаёт от Amlogic S905X2 (700/2200).



3. Проверяем разные fps


Мы тестировали видео с разной кадровой частотой (fps): 23.976, 24, 25, 50, 59.94, 60. С этим проблем не возникло.

Варианты видео с прогрессивной и чересстрочной развёрткой также воспроизводятся успешно.

4. Запускаем стримы HLS и Mpeg-Dash


Также протестировали воспроизведение HLS и Mpeg-Dash-стримов с помощью нескольких способов, а именно:

Способ 1. Воспроизведение стримов через агрегатор фильмов HD VideoBox, в котором при запуске видео можно выбрать плеер, в нашем случае VideoPlayer.




Способ 2. Воспроизведение HLS и Mpeg-Dash- стримов через youtube-приложение. Для тестирования брали ролики 4K 60 fps. Просадок кадров или затормаживания не заметили. На всех скриншотах из youtube получился чёрный экран вместо картинки, вероятно, из-за защиты контента.



На SmartYoutube скриншоты делаются корректно.

Способ 3. Скормить mpd- и m3u8-файлы напрямую плееру через файловый менеджер или браузер никак не удалось, но в некоторых случаях браузер способен воспроизводить видео.

Способ 4. Воспроизведение стримов DASH и HSL через Exoplayer Demo. Все видео, ссылки на которых были живы, воспроизводились успешно. Единственное, что не воспроизводилось защищённые видео Widevine, которые сопровождались надписью Это устройство не поддерживает требуемую DRM-схему (This device does not support the required DRM scheme)

5. Встроенные тесты видео от Realtek


Также на плате Hercules ОТТ есть и собственное предустановленное приложение для тестирования воспроизведения сразу нескольких видео. В ходе тестирования выяснилось, что в режиме, когда экран делится на 2 или в режиме картинка-в-картинке, более-менее сносно воспроизводится видео только с битрейтом до 45 Мбит/с и желательно MPEG4:



Видео с низким битрейтом 360 кбит/с, но 60 fps не осилил даже 2 видео одновременно.

Видео с низким битрейтом 670 кбит/с и 15 fps и разрешением 320x240 пикселей осилил одновременно 8 видео, при 9 и более некоторые могли не запуститься и кадры в видео терялись.



Также на плате Realtek предустановлена программа Encoder, которая позволяет транскодировать до 4 видео одновременно из mp4 в AVC-ts-файлы.





Проверили, что она может транскодировать:
1 видео 1080p60fps (скорость транскодирования около 54 fps)
2 параллельных видео 1080p30fps (скорость транскодирования около 23 fps)

6. Запускаем приложение OpenCamera


Для последней проверки запускаем приложение OpenCamera и подключаем usb-веб-камеру Logitech С920 для тестирования кодирования видеозаписи. Выяснили, что в формате AVC на плате можно записать видео до 1080p27fps. В формате HEVC записать видео не удалось.

Выводы


Тесты показали, что в целом чип RTD1395 соответствует заявленным показателям. Плату Hercules ОТТ можно использовать для разработки и отладки устройств типа Android TV, дисплеев Miracast and Intel Wireless, ТВ-приставок и стриминговых OTT-плееров. Также на ней можно разрабатывать прошивку на основе AOSP для операторов IP-телевидения.

А для полной объективной оценки этого решения можно еще изучить конкурентов с аналогичными характеристиками, таких как Amlogic s905x и более новый S905X2.
Подробнее..

KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 1

24.03.2021 02:04:36 | Автор: admin

Содержание:

  1. Лирическое отступление

  2. Мои требования к медиацентру

  3. Аппаратная часть, программная платформа:

    1. Неттоп

    2. Пульт ДУ

  4. Операционная система

    1. Подготовка и установка Kubuntu 20.04 LTS

    2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

    3. Монтирование основного диска для хранения данных

    4. Сетевые каталоги

    5. Установка и настройка VNC-сервера

    6. Настройка профиля HDMI в PulseAudio

  5. Установка и базовая настройка KODI

  6. IPTV. Как установить и настроить, какой сервис выбрать

  7. Библиотека KODI. Что это такое и как настроить

  8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

1. Лирическое отступление

Еще во времена своего первого телевизора со Smart TV часто ловил себя на мысли, что все это не то, неудобно, не всегда красиво А еще когда это все сопровождалось долгим откликом встроенной ОС, вылетами, требующие перезагрузок, начались поиски решения.

DLNA на какое-то время удовлетворял все потребности, хотя неудобств в его использовании хватало. Не устраивали лишние телодвижения для просмотра фильма, а особенно необходимость иметь компьютер, на котором хранится библиотека и просмотр только оффлайн контента.

Поиски продолжались и первым программным решением на базе самого телевизора был популярный тогда Fork Player, для установки которого еще нужно было поиграться с прошивкой самого телевизора, а после еще и с настройкой самого плеера. Здесь уже был получен онлайн-просмотр контента и IPTV. Работало все не очень стабильно, а интерфейс и юзабилити оставляли желать лучшего, и постоянно выводил из себя, живущих во мне эстета и перфекциониста.

И вот, практически год назад, было найдено и собрано ровно под свои нужды решение на базе KODI. Год использования и вылизывания всех нюансов дали мне понять, насколько великолепно это решение, насколько огромны возможности и насколько я сожалею о том, что не нашел его раньше.

Публикаций, подобных этой, на тему как я строил свой медиацентр в сети достаточно. Но все же, целью я ставлю донести в массы, в очередной раз, о том, что смотреть телевизор и любимый сериал можно не только в предустановленном на телевизоре приложении Netflix.

Да и просто хочется поделиться всем своим пройденным путем, по порядку, в одном месте. Мне бы такой гайд, когда я начинал знакомство с KODI, точно бы пригодился, потому как информацию черпал обрывками и в разных источниках А возможно и старый пользователь KODI почерпнет что-то новое.

2. Мои требования к медиацентру

Прежде, чем я начал погружаться в тему домашних медиацентров, я составил перечень задач, которые хотел бы на него возложить, а также общих требований как аппаратных, так и программных.

Вот мой список:

  • Просмотр IPTV. Как бы для некоторых это не было странно в 2021 году, но телевизор в первую очередь должен быть телевизором. С хорошим набором каналов с EPG на борту и в хорошем качестве. Архив передач приветствуется, но не обязателен.

  • Торрент-видео. Обязательна интеграция с популярными русскоязычными трекерами, просмотр на лету, скачивание во время просмотра.

  • Приятный интерфейс и юзабилити. Что бы все домочадцы без труда смогли самостоятельно посмотреть очередную серию Маша и Медведь или любимого сериала, а кто-то и новости по ТВ.

  • Встроенная библиотека. С возможностью загружать информацию о фильме/сериале из внешних источников.

  • Торрент-качалка. Обязательно внешнее управление.

  • Аппаратные требования. Платформа x86-64. Работа 24/7/365, бесшумность, управление аэромышью.

  • Требования к ПО. Полноценная ОС, желательно семейства GNU/Linux. Удаленный доступ. Внешнее управление, желательна поддержка android-устройств. Обновления.

3. Аппаратная часть, программная платформа

Все знакомства проводил на виртуальных машинах или мобильном телефоне с Android на борту. Когда поиски были завершены и выбор пал на KODI, нужно было определиться с платформой. На этапе знакомства были испробованы и готовые сборки, с отчасти урезанной ОС, типа LibreELEC и на базе Windows 8/10. Из-за желания использования медиацентра, как полную замену всей начинки телевизора и использования его, лишь как экрана, от Windows пришлось отказаться. Нужна была работа 24/7/365 включил телевизор включился экран, а KODI уже готов к работе, он и не выключался. Из-за надежности, стабильности и небольших навыков в работе, остановился на Ubuntu с окружением рабочего стола KDE Plasma Kubuntu 20.04 LTS.

К слову, вариант с одноплатным компьютером, например Raspberry Pi, не рассматривал. Учитывая ARM-платформу, не высокую производительность и SD-карту под хранилище, с моими задачами не справился бы.

3.1. Неттоп

Был приобретен мини-ПК на AliExpress, благо выбор различных исполнений и комплектующих огромен. Накопители в комплект не входили - из собственных запасов. Меньший по объему отдал под ОС, больший под основное хранилище. Габариты неттопа очень компактные, блок питания внешний. Охлаждение пассивное, корпус выполнен из металла и сам по себе является большим радиатором. Учитывая отсутствие воздушного охлаждения и даже жестких дисков, мой медиацентр не будет издавать ни малейшего шума или щелчков головки HDD. Полная тишина.

Характеристики, внешний вид и внутреннее устройство:

ЦП - Intel Celeron J1900, 4 ядра, 4 потока, 2 ГГц
ОЗУ - 4 Гб DDR3L 1333 МГц
SSD - 500 Гб (SATA III)
SSD - 64 Гб (mSata)
LAN 1 Гбит/с
HDMI 1.4
VGA
2xUSB 2.0
2xUSB 3.0



Забегая немного вперед, с уверенностью могу сказать, что такая конфигурация даже избыточна. В самые пики, максимальное значение LA, которое мне удалось увидеть редко превышало 3. Оперативной памяти 4 Гб также с большим запасом чуть более 3 Гб это максисимум, сколько могла загрузить система. По температурам также все отлично, в простое 36-40 С, при нагрузках 48-52 С.


Покупка на то время обошлась в 110 долларов с доставкой в г. Минск.

3.2. Пульт ДУ

Для управления нужна была аэромышь, и она же пульт вкл/выкл телевизора (ИК), дабы не плодить количество устройств и все управление совместить в одном. Там же, в поднебесной, был заказан пульт G10 со встроенным гироскопом, голосовым вводом и подсветкой кнопок. Адаптер USB в комплекте, с подключением не возникло никаких проблем.

Единственное, что не смог подружить головой ввод и Ubuntu. На Android все работает из коробки. Если к-то смог с этим делом разобраться поделитесь.

Все кнопки управления работали по своему предназначению, конфликтов с Ubuntu и KODI не было. Необходимо было только запрограммировать кнопку вкл/выкл на нужный ключ, чтобы им управлять питанием телевизора Samsung. Для этого удерживая кнопку вкл/выкл на аэромыши поднести пульт от телевизора и также зажать кнопку вкл/выкл. LED-индикатор медленно замигает это будет означать, что пульт закончил обучение.

Уже потом, в ходе эксплуатации, обратил внимание на слишком большие шаги кнопок регулировки громкости. Этот параметр также можно подкорректировать.

Регулировка скорости клавиш управления звуком:

  • От медленной к быстрой: нажмите и удерживайте кнопки "OK" и "Volume+". Скорость регулируется на быструю, пока горит LED-индикатор.

  • От быстрой к медленной: нажмите и удерживайте кнопки " OK " и "Volume-". Скорость регулируется на медленную, пока горит LED-индикатор.

4. Операционная система

Так как с операционной системой я определился в предыдущем разделе, перейдем к ее установке и настройке.

4.1. Подготовка и установка Kubuntu 20.04 LTS

Являясь пользователем Windows на домашнем ПК, готовил загрузочный flash-накопитель с помощью Rufus. Скачать последнюю версию, в том числе и портативную, всегда можно с официального сайта rufus.ie. Сам ISO-образ загружаем по ссылке kubuntu.org, я использовал 64-битную версию системы с длительной поддержкой (20.04.2 LTS).

Не думаю, что стоит подробно описывать ход установки ОС. Инструкция со скриншотами доступна в разделе Wiki на сайте Ubuntu. Для Kubuntu актуальной версии отличия будут лишь незначительные и то косметические в интерфейсе.

По завершении установки обязательно выполнить обновление системы

sudo apt-get update && sudo apt full-upgrade

4.2. Первичная настройка, удаление лишнего и установка пакетов для работы с системой

Устанавливаем минимальный набор программ для работы с системой. Я использую файловый менеджер midnight commander со строенным текстовым редактором mcedit, htop утилита мониторинга, ssh для удаленного управления, net-tools утилита для работы с сетевыми интерфейсами, landscape-common - отображает системную информацию в приветствии, при подключении по SSH

sudo apt-get install mc htop ssh net-tools landscape-common

Изначально, сетевой интерфейс работает по DHCP. Рекомендую сразу же присвоить статический IP-адрес, дабы в какой-то момент времени он не сменился, и вы не потеряли доступ к своему медиацентру.

Определяем все доступные сетевые интерфейсы в системе

ifconfig

Вывод:

kodi@kodi-pc:~$ ifconfigenp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.0.19  netmask 255.255.255.0  broadcast 192.168        inet6 fe80::8461:dcf8:d2c6:2d48  prefixlen 64  scopeid 0x20        ether 40:62:31:0a:11:a5  txqueuelen 1000  (Ethernet)        RX packets 3417519  bytes 5024924041 (5.0 GB)        RX errors 0  dropped 2  overruns 0  frame 0        TX packets 1059086  bytes 169628765 (169.6 MB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

В моем случае интерфейс enp1s0, ему назначен IP-адрес 192.168.0.19.

Назначим ему статический адрес 192.168.0.50 и будем дальше работать именно с ним, для этого необходимо отредактировать файл конфигурации netplan:

sudo mcedit /etc/netplan/00-installer-config.yaml

Привести к виду:

network: ethernets:  enp0s3:   addresses:    - 192.168.0.50/24   gateway4: 192.168.0.1   nameservers:    addresses: [192.168.0.1, 1.1.1.1]   optional: true version: 2 renderer: networkd

Где:
addresses IP-адрес, который будет назначен нашему сетевому интерфейсу
gateway4 IP-адрес нашего роутера
nameservers DNS сервера. Первый - наш роутер, 1.1.1.1 общедоступный DNS от Cloudflare

Сохраняем изменения и для надежности перезагружаем систему и проверяем (командой ifconfig). IP-адрес должен быть 192.168.0.50.

Для удобства, дальше работу продолжаю с домашнего ПК под управлением Windows 10 с помощью утилиты PuTTY по SSH-протоколу. SSH у нас уже установлен, используем порт 22.

SSH/SFTP-клиент для android-устройств

Среди домашних гаджетов у меня в обиходе есть планшет под управлением Android, который также иногда использую для администрирования. Могу порекомендовать очень удобного, но, к сожалению, платного клиента Termius.

Удаляем ненужные медиацентру приложения

sudo apt remove libreoffice-draw skanlite okular kpat ksudoku kmahjongg kmines kdeconnect konversation krdc ktorrent thunderbird firefox elisa vlc libreoffice-math libreoffice-calc libreoffice-writer usb-creator-kde kwalletmanager

Удаляем неиспользуемые пакеты из кэша, очищаем кэш утилиты apt и ненужные зависимости

sudo apt autoclean && apt clean && apt autoremove

Устанавливаем Google Chrome на замену Firefox

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.debsudo dpkg -i --force-depends google-chrome-stable_current_amd64.deb

В качестве торрент-клиента использую qBittorrent. Устанавливаем

sudo apt install qbittorrent

4.3. Монтирование основного диска для хранения данных

В моем медиацентре используется два SSD-накопителя (64 и 500 Гб). Меньший по объему уже используется и размечен под систему и приложения. Хранить все медиа-данные, торренты буду на накопителе большего объема. Для этого смонтируем его в файловую систему.

В моем случае накопитель sda1 отформатирован и имеет один раздел (ext4). Определяем его UUID

ls -l /dev/disk/by-uuid

Вывод:

lrwxrwxrwx 1 root root 10 мар 14 18:01 40792859-581c-46cb-be9d-ad9d9e6ce843 -> ../../sdb1lrwxrwxrwx 1 root root 10 мар 14 18:01 4f311605-04ff-4e66-8121-187f270a51f4 -> ../../sdb5lrwxrwxrwx 1 root root 10 мар 14 18:01 760198b6-694e-4d6f-b21c-ea0c530398c3 -> ../../sda1lrwxrwxrwx 1 root root 10 мар 14 18:01 c53e5dd8-c36a-48b1-8591-3aeb4bce60a0 -> ../../sdb7lrwxrwxrwx 1 root root 10 мар 14 18:01 f09293e9-209e-4dce-ba4f-56d2e33657e8 -> ../../sdb6

Все устройства на медиацентре буду монтировать в каталог /mnt. Вложенный каталог (например, kodi), куда непосредственно необходимо смонтировать раздел, создаем вручную и назначаем права

sudo mkdir /mnt/kodisudo chmod -R 0777 /mnt/kodi

Открываем для редактирования fstab

sudo mcedit /etc/fstab

и в конец файла добавляем параметры монтирования для нашего накопителя

UUID=760198b6-694e-4d6f-b21c-ea0c530398c3 /mnt/kodi ext4 rw,nosuid,nodev,relatime 0 0

Все, можно перезагрузить систему и проверить, что накопитель автоматически монтируется при старте.

4.4. Сетевые каталоги

Так как медиацентр, в моем случае, предполагает работу 24/7, удобно использовать его как общий ресурс для обмена данными между всеми домашними устройствами.

Я использую два каталога:

  • /mnt/smb каталог для обмена между устройствами. Удобно для обмена файловой информации между домашним ПК, ноутбуками и android-устройствами. На ПК с Windows 10 каталог примонтирован в систему, как сетевой диск. На мобильном телефоне использую файловый менеджер X-Plore, в котором также примонтирован этот каталог, всегда быстро и удобно скопировать информацию.

  • /mnt/kodi/qbittorrent каталог для загрузки торрентов с помощью qBittorrent (не забыть настроить сам qBittorrent на использование этого каталога, по умолчанию используется стандартный каталог загрузок). Так как загружать планирую не только видео-контент для просмотра на телевизоре, удобно использовать медиацентр как торрент-качалку, работающую 24/7. А забрать скачанную информацию всегда можно по средствам все того же смонтированного сетевого диска в Windows 10.

Создаем каталоги и назначаем права на чтение и запись

sudo mkdir /mnt/smbsudo mkdir /mnt/qbittorrentsudo chmod -R 0777 /mnt/smbsudo chmod -R 0777 /mnt/qbittorrent

Для расшаривания каталогов необходимо установить samba

sudo apt-get install samba

Конфигурируем samba

sudo mcedit /etc/samba/smb.conf

Так как секретную информацию держать там не планирую и все находится в домашнем окружении, гостевой доступ без пароля разрешаю для простоты авторизации и подключения сетевых дисков. В конец конфигурационного файла вставляем:

[smb]comment = smbpath = /mnt/smbbrowsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777[kodi-qbittorrent]comment = kodi-qbittorrentpath = /mnt/kodi/qbittorrentbrowsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777

И перезапускаем сервис samba

sudo /etc/init.d/smbd restart

Можно проверить с других устройств доступность каталогов и наличие прав на чтение и запись.

4.5. Установка и настройка VNC-сервера

Для администрирования и работ в системе медиацентра не планирую использовать собственные клавиатуру и мышь. SSH-протокола не всегда достаточно и иногда хорошо бы иметь доступ к рабочему столу. Этим и займемся.

Решено было использовать VNC-сервер, устанавливаем

sudo apt install x11vnc

Устанавливаем пароль

x11vnc -storepasswd "kodi" /etc/x11vnc.passsudo chmod ugo+r /etc/x11vnc.pass

Запускаем сервер

/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -bg

Для подключения я использую Real VNC Viewer для Windows или Android. Порт по умолчанию - 5900.

К сожалению, после перезагрузки системы VNC-сервер автоматически сам не запустится. Добавим в автозагрузку вручную.

Создаем крипт

sudo mcedit /usr/bin/VNCserver-start

Вставляем содержимое

#!/bin/sh/usr/bin/x11vnc -noxdamage -shared -dontdisconnect -many -noxfixes -rfbauth /etc/x11vnc.pass -bg

Делаем скрипт исполняемым

sudo chmod u+x /usr/VNCserver-start

Реализовать автозапуск VNC-сервера с помощью systemd так и не удалось. С автозапуском любого другого скрипта проблем нет, именно с VNC не смог разобраться с авторизацией.

Поэтому сделал не совсем красиво, но вариант рабочий. Параметры системы -> Рабочая среда -> Запуск и завершение -> Автозапуск. Добавить, как сценарий наш скрипт /usr/VNCserver-start.

4.6. Настройка профиля HDMI в PulseAudio

У меня телевизор подключен к мини-ПК через HDMI, а аудио разъем акустической системы подключен к разъему для наушников телевизора, но PulseAudio настаивает на том, что он отключен. Вручную в микшере можно выбрать выходное устройство. Все корректно, но после ближайшей перезагрузки системы профиль снова слетает. Решить проблему можно иначе - отключить модуль switch-on-port-available в конфигурационном файле PulseAudio

sudo mcedit /etc/pulse/default.pa

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

#load-module module-switch-on-port-available

После этих изменений с выводом звука не было никаких проблем.

Будем считать, основа нашего медиацентра ОС в лице Kubuntu 20.04 готова. Можно приступать к установке и запуску KODI!

5. Установка и базовая настройка KODI

Переходим непосредственно к KODI. Он есть в официальных репозиториях Ubuntu, но я бы рекомендовал использовать репозиторий стабильных версий сообщества XBMC (так до 2014 года назывался медиацентр). Например, на момент написания этого материала в середине марта 2021 года, в репозиториях Ubuntu версия KODI была 18.7, тогда как в репозитории сообщества уже была версия 19.0 Matrix.

Добавляем репозиторий, обновляем список пакетов и устанавливаем KODI

sudo add-apt-repository ppa:team-xbmc/ppasudo apt updatesudo apt install kodi

KODI установлен, запускаем. Нас приветствует стартовая страница медиацентра и несколько предложений включить неактивные дополнения. Отвечаем Yes только на дополнении PVR IPTV Simple Client, остальные отклоняем. Также будет предложено сразу настроить это дополнение пропускаем, им займемся позже.

Первым делом меняем язык, благо KODI поддерживает различные языки интерфейса, русский/белорусский/украинский не исключение.

Settings/Interface/Regional/RussianSettings/Interface/Regional/Russian

Попутно во всех разделах устанавливаем уровень настроек в Экспертный, это даст чуть больше параметров для настройки.

В настройках стиля включаем:

  • Использовать скользящую анимацию. Интерфейс будет больнее привлекательно сменять страницы, диалоговые окна и выводить уведомления.

  • Включить автопрокрутку для сюжетов и обзоров. В библиотеке и видеодополнениях информация о фильме/сериале/серии длинное описание будет плавно прокручиваться.

  • Режим касания. Добавит кнопки управления на экран. Необходимо, при использовании мыши/аэромыши.

  • Выбрать рейтинг для показа мультимедийных элементов Рейтинг. В медиатеке и видеодополнениях на эскизе фильма/сериала/серии будет добавлена пиктограмма с рейтингом TVDB (чуть позже установим и его).

Настройки/Интерфейс/Стиль/Настроить стильНастройки/Интерфейс/Стиль/Настроить стиль

Установим и настроим дополнение погоды. В этом же разделе включаем Показывать сведения о погоде на верхней панели. Вы будете направлены на страницу выбора дополнения, нажимаем Еще и устанавливаем Gismeteo.

Установка дополнения GismeteoУстановка дополнения Gismeteo

После установки будет предложено сразу и настроить. Вводим название города, выбираем его из списка. Информация о погоде должна отображаться сверху под часами и на главном экране в разделе Погода. Если сразу этого не произошло перезапустите KODI.

Раздел погода на главном экранеРаздел погода на главном экране

Возвращаемся к настройке стиля и в разделе Элементы главного меню. Отключаем лишнее. Я оставил лишь фильмы, сериалы, ТВ, дополнения, избранное.

Настройки/Интерфейс/Стиль/Настроить стиль/Элементы главного менюНастройки/Интерфейс/Стиль/Настроить стиль/Элементы главного меню

В разделе Картинки можно выбрать и установить набор фанартов из стандартного репозитория. Это фоновые изображения всех страниц медиацентра. Можно установить любой из понравившихся в списке с префиксом Skin Backgrounds - .

Настройки/Интерфейс/Стиль/Настроить стиль/КартинкиНастройки/Интерфейс/Стиль/Настроить стиль/Картинки

Какое-то время у меня был установлен набор Darkwood Design. Со временем, из нескольких официальных наборов репозитория Kodi.tv собрал самые удачные в дополнение, которое можете также установить себе - resource.images.skinbackgrounds.arbuzov.zip.

Что касаемо самих стилей, их предостаточно даже в официальных репозиториях. Но перебрав их все, остался на стиле по умолчанию Estuary, с цветовой схемой Midnight.

Оставшиеся параметры системы оставляем по умолчанию, кроме Настройки/Система/Дополнения Неизвестные источники. Этот параметр включить обязательно. Потребуется для установки некоторых дополнений из файлов.

Параметры Проигрывателя я также оставлял без изменений.

Переходим в раздел Настройки/Службы. В Управлении разрешаем удаленное управление по HTTP и устанавливаем пароль. Это нам понадобится для управления KODI с других устройств. Чуть позже разберемся, как это сделать.

Настройки/Службы/УправлениеНастройки/Службы/Управление

В разделе Сведения о системе можно наблюдать за состоянием вашего медиацентра. Здесь и общая информация о системе, накопителях, температурах, сети, а также о каналах PVR.

В разделе Сведения есть счетчик общего времени наработки KODI. Любопытная информация. Мой медиацентр уже наработал 284 дня.

Настройки/Сведения о системе/СведенияНастройки/Сведения о системе/Сведения

Раздел с наиболее значимой информацией Оборудование. Из коробки температура ЦП у меня отображалась также, как и сейчас частота ЦП - -1C. Частоту побороть так и не смог, а вот с температурой разобраться удалось.

Настройки/Сведения о системе/ОборудованиеНастройки/Сведения о системе/Оборудование

Необходимо KODI указать, где брать информацию о температуре. Настраивается в конфигурационном файле advancedsettings.xml. В нем вообще много чего интересного, можно прочесть на официальной странице KODI/Wiki.

Если файла нет создаем его самостоятельно

mcedit /home/имя_пользователя/.kodi/userdata/advancedsettings.xml
<advancedsettings><cputempcommand>sed -e 's/\([0-9]*\)[0-9]\{3\}.*/\1 C/' /sys/class/thermal/thermal_zone0/temp</cputempcommand></advancedsettings>

После перезапуска KODI, температура отображается верно. Какой параметр использовать, например, для Raspberry Pi можно прочесть здесь.

6. IPTV. Как установить и настроить, какой сервис выбрать

Для вещания IPTV в KODI потребуется дополнение PVR IPTV Simple Client, которое мы согласились включить при первом запуске.

Что делать, если при первом запуске дополнение не было предложено включить и сейчас его вообще нет в списке дополнений или было включено, но не запускается и отмечено, как неактивное, а попытки запустить вручную завершаются ошибкой?

Ошибка при попытке включить дополнение PVR IPTV Simple ClientОшибка при попытке включить дополнение PVR IPTV Simple Client

Трудно сказать с чем связано, но на этапе тестирования на виртуальных машинах и установке на боевой сервер год назад у меня возникли проблемы с его запуском из коробки (при первом запуске KODI ничего не предложил и в списке моих дополнений его не было).

Установку выполнил вручную. Обязательно использовать последнюю версию deb-пакета. Смотрим актуальную версию здесь - pkgs.org/download/kodi-pvr-iptvsimple. Не забыть верно выбрать дистрибутив и архитектуру.

В моем случае последняя версия 7.5.0 скачиваем для Ubuntu 20.04 LTS (Focal Fossa) и устанавливаем

wget http://ppa.launchpad.net/team-xbmc/ppa/ubuntu/pool/main/k/kodi-pvr-iptvsimple/kodi-pvr-iptvsimple_7.5.0-1~focal_amd64.debsudo dpkg -i ./kodi-pvr-iptvsimple_7.5.0-1_focal_amd64.deb

После установки запускаем KODI, проверяем установлен и запущен ли наш PVR IPTV Simple Client.

Прежде, чем перейдем к настройкам клиента, необходимо определиться с сервисом. На просторах сети их достаточно большое количество, как платных, так и бесплатных, с архивами и без, хороших и плохих. Какое-то время пользовался бесплатными самообновляемыми плейлистами. Мне показалось это дорогой в никуда. Много не рабочих каналов, иногда и вовсе не работал ни один, низкая скорость передачи, постоянная буферизация, особенно в вечернее время и на выходных. К набору каналов, особенно в HD качестве, также есть вопросы.

Был найден оптимальный вариант - ILookTV. Сервис платный 1$/месяц. За эту неподъемную сумму я получил просто огромный список каналов, чуть более 100 из которых в HD-качестве. За год использования не было ни одного сбоя в работе. Что касается скорости передачи, то при моем интернете 25 Мбит/с - проблем не возникало ни разу. Каналы открываются мгновенно, без буферизации. Также хочется отметить качественные логотипы каналов. У других сервисов с этим явные проблемы, во всяком случае, у тех которыми пользовался я.

С регистрацией и оплатой, думаю, проблем возникнуть не должно. Описывать подробно это не буду. Первые сутки, кстати, можно попробовать бесплатно.

В личном кабинете в разделе Плейлист рекомендую выбрать только нужные вам группы каналов (много зарубежных, не русскоговорящих). Помимо выбора групп, также рекомендую пройтись и по самим каналам и отключить не нужные. Это сделать можно в разделе Конструктор. Так, например, изначально мой плейлист составлял 1800+ каналов. После выключения лишних осталось 593 канала.

Будем считать плейлист готов, можно подключать в KODI. Переходим в личном кабинете в раздел Плейлист/Скачать. Использовать можно как ссылку, так и m3u8-плейлист. При использовании ссылки возможны проблемы с доступом к сервису из-за блокировок провайдера. Скачиваем плейлист.

IPTV-плейлист готов, скачиваемIPTV-плейлист готов, скачиваем

Переходим к настройкам клиента Дополнения/Мои дополнения/Клиенты PVR/PVR IPTV Simple Client.

В разделе Основные указываем локальное расположение нашего плейлиста

В разделе EPG указываем ссылку на программу передач (ГИД):

http://epg.it999.ru/edem.xml.gz

При некорректном взаимодействии с часовыми поясами и разницей во времени, можно вручную настроить смещение +/- в часах.

В разделе Channel Logos расположение не трогаем, для Channel logos from XMLTV установить Предпочтительно M3U.

Применяем настройки и перезапускаем KODI. При старте KODI выполнит сканирование плейлиста и обновит программу передач. Об этом будет информировать нас в верхнем правом углу. По завершении переходим в раздел ТВ и наблюдаем все наши каналы, наслаждаемся просмотром.

Раздел "ТВ" на главном экране KODIРаздел "ТВ" на главном экране KODIСписок каналов, справа подробная информацияСписок каналов, справа подробная информацияТВ-программаТВ-программаВ разделе Сведения о системе/Служба PVR также должна появиться общая информация о каналахВ разделе Сведения о системе/Служба PVR также должна появиться общая информация о каналах

7. Библиотека KODI. Что это такое и как настроить

Библиотека KODI великолепна по своему функционалу и автоматизации всех процессов. Для меня это просто находка. Она структурирует по разделам Фильмы/Сериалы/Музыка и т.д. ваши медиа-данные, загружая автоматически со сторонних ресурсов трейлеры, постеры, информацию о сюжете, актерах, рейтинг и прочее, прочее... Лично я не использую офлайн-медиа, так как локально у меня не хранятся ни фильмы, ни сериалы. Но библиотека отлично взаимодействует и с другими видеодополнениями для просмотра онлайн, в частности с Elementum, который установим чуть позже.

Прежде, чем будем настраивать библиотеку, необходимо установить несколько дополнений с источниками сведений. Мой медиацентр работает с TVDB и КиноПоиск.

Дополнения KinoPoisk в официальных репозиториях нет. Необходимо установить сторонний репозиторий Seppius (скачиваем по ссылке). В браузере дополнений выбрать установку из файла ZIP и указать путь к только что скачанному архиву.

По завершении установки репозитория, возвращаемся назад и выбираем Установить из репозитория/Все репозитории/Источники сведений и устанавливаем в разделе Сведения о сериалах TVDB (new), а в разделе Сведения о фильмах - KinoPoisk.

Дополнения установлены, переходим к настройке библиотеки. Создаем два каталога, для раздельного хранения информации о фильмах и сериалах, например:

/mnt/kodi/library/Movies библиотека фильмов
/mnt/kodi/library/Shows библиотека сериалов

Далее переходим в Настройки/Медиа/Медиатека/Видео и нажимаем добавить Видеоисточник. Добавляем каталог с фильмами, даем произвольное название источнику.

В типе содержимого указываем, что этот каталог содержит фильмы, источник сведений KinoPoisk. Параметры сканирования, как на скриншоте.

Аналогично поступаем и с источником для сериалов. Обратите внимание на отличие в настройках и параметрах сканирования, это важно.

Настройка библиотеки завершена. Пока она пуста, после установки Elementum сможете добавить в нее несколько фильмов/сериалов и проверить, верно ли все настроено. Таким же образом вы можете добавить и локальные (или сетевые) каталоги с фильмами/сериалами/клипами/музыкой, KODI просканирует ваши медиафайлы, и они уже будут отображаться на главном экране в соответствующих разделах. Не забудьте только для работы с клипами и музыкой установить нужные дополнения источников сведений.

8. Elementum и Burst. Настраиваем просмотр контента торрент-онлайн

Это, наверное, самый важный функционал всего медиацентра, из-за которого все и затевалось. Elementum видеодополнение, которое у нас будет работать с торрент-трекерами. Дополнение отлично справляется не только с проигрыванием онлайн торрент-контента, но и с поиском, отличным отображением всей информации о фильмах и сериалах с постерами, актерами и их фотографиями. В общем, просто не заменимая вещь. Burst дополнение к Elementum провайдер, который непосредственно взаимодействует с трекерами.

Итак, все по порядку. В официальных репозиториях Elementum нет. Его необходимо скачать с сайта разработчика - elementum.surge.sh, выбрав платформу (у нас Linux x64).

Устанавливаем также из файла ZIP, как устанавливали репозиторий для Кинопоиска, при подготовке библиотеки. По завершении установки KODI сам предложит установить дополнение Burst соглашаемся.

Переходим к настройкам Elementum. Привожу свои настройки на скриншотах. Обязательно указать пути для загрузок, торрентов, включить интеграцию с библиотекой KODI и указать путь к самой библиотеке (ее создавали в предыдущем разделе).

Что касается настроек загрузок, то мой накопитель в 500 Гб совершенно не лимитирует. Я установил параметры в использование файлов, максимальное. Файлы автоматически не удаляются после просмотра. Их периодически удаляю вручную.

Настройки BitTorrent оставил по умолчанию. Торренты загружаются и сидируются без ограничений по скорости. Прокси-сервер не включаем, это важно.

Переходим к настройкам провайдера Burst в Дополнения/Программные дополнения. Прокси также не используем. В разделах Разрешение и Качество выбрал только 1080p/720p и качество выше Screener/SCR, так как телевизор не поддерживает 2K/4K, а экранки не смотрю.

Настройки Elementum BurstНастройки Elementum Burst

И самое главное, указываем трекеры, с которыми будем работать. Я использую следующие (остальные отключил, так как большее количество трекеров увеличит время поиска и, как показала практика, ничего стоящего они дают в выдачах):

Открытые:
MegaPeer

Закрытые (нужна регистрация на сайте, в настройках Burst указать логин/пароль):
Rustorka
NNM-Club
RuTracker
Кинозал

Этого небольшого списка трекеров хватает с головой. За все время использования и множества просмотренных фильмов лишь несколько раз не были найдены раздачи. Но, если у кого-то есть инвайты на самые закрытые трекеры буду рад принять.

Применяем настройки и запускаем Elementum.

Главное меню дополнения ElementumГлавное меню дополнения Elementum

Перейдите, например, в раздел Фильмы/Самые просматриваемы и выберите любой фильм.

Если все верно настроено Burst просканирует, указанные вами трекеры, и предложит выбрать стрим.

Список раздачСписок раздач

Выбрав стрим, Elementum буферизирует порядка 20-50 Мб (в зависимости от общего размера фильма) и начинает его воспроизведение.

Если завершить просмотр, согласно нашим настройкам, скачивание продолжится в фоновом режиме, информация о прогрессе будет в верхнем правом углу. Этот параметр можно отключить в настройках Elementum, тогда при остановке просмотра, загрузка будет останавливаться (или останавливаться и удаляться торрент + файл).

Для того, чтобы добавить фильм/сериал из Elementum в библиотеку из контекстного меню выбрать Добавить в библиотеку.

Котекстное меню фильма/сериала в ElementumКотекстное меню фильма/сериала в Elementum

Все добавленные фильмы и сериалы в библиотеку будут доступны из главного экрана, в соответствующих разделах. Автоматически отмечаются просмотренные фильмы/серии/сезоны, загружаются постеры, рейтинг и описание.

"Сериалы" на главном экране"Сериалы" на главном экранеСписок серий в разделе "Сериалы"Список серий в разделе "Сериалы"Раздел "Фильмы" на главном экранеРаздел "Фильмы" на главном экране

На главном экране будут отображаться лишь недавние и просматриваемые. После того, как фильм/сериал просмотрен, он пропадает с главного экрана и находится уже в общей библиотеке, в соответствующем разделе. Указывается общее количество фильмов и сериалов, режим отображения и сортировки можно настроить под себя.

Все фильмы библиотекиВсе фильмы библиотеки

На данном этапе основные настройки выполнены, медиацентром уже можно пользоваться и получать удовольствие от просмотра.

В следующей публикации поговорим о возможности внешнего управления KODI/Elementum и qBittorrent с помощью веб-интерфейса и Android-устройств. А также внедрим в наш медиацентр функцию учета трафика с возможностью отображения и анализа в веб-интерфейсе. Не забудем и о резервном копировании, как операционной системы, так и самого KODI.

Подробнее..

KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 2

24.03.2021 18:04:11 | Автор: admin

Продолжаем "изобретать" свой медиацентр. Начало здесь - KODI. Как я собирал свой самый удобный и функциональный медиацентр для дома. Часть 1.

Содержание:

  1. Просмотр YouTube

  2. Внешнее управление медиацентром и системой

    1. Управление qBittorrent (веб-интерфейс и мобильное приложение для Android)

    2. Управление KODI Android-устройством (Yatse, Kore)

    3. Веб-интерфейс KODI и Elementum

  3. Учет трафика медиацентра (vnStat + веб-интерфейс)

  4. Резервное копирование KODI

1. Просмотр YouTube

Было бы странно иметь современный медиацентр без возможности просмотра роликов на самом популярном видеохостинге - YouTube. Для этого есть одноименное дополнение из официального репозитория. Дополнение отлично взаимодействует и синхронизирует историю, каналы, подписки и прочее. Все как у всех. Что-то особо описывать и обозревать не вижу смысла.

Единственное, с чем могут возникнуть проблемы с авторизацией на сервисе. Для этого необходимо в консоли приложений Google создать API-проект и получить идентификатор клиента, ключ API и cсекретный код клиента. Только имея эти данные вы сможете авторизовать дополнение. На просторах сети достаточное количество пошаговых инструкций. Например, одна из них на overclockers.ru.

Но есть куда более элегантный, удобный и быстрый способ проигрывания YouTube-роликов на медиацентре KODI с помощью мобильного телефона и стандартного приложения YouTube в нем. Никаких дополнений и настроек в самом медиацентре, при этом, не требуется. К этому мы вернемся чуть позже, когда будем рассматривать управление медиацентром с помощью мобильного телефона.

2. Внешнее управление медиацентром и системой

Построив такой умный медиацентр, было бы не лишним иметь возможность управлять всеми процессами не только с самого медиацентра и подключенного в него пульта ДУ или клавиатуры/мыши.

Возможность удаленного администрирования Ubuntu по SSH-протоколу реализовали, VNC-подключение есть. Все исправно работает как с Windows, так и c Android-устройств (если пропустили, смотрите разделы 2 и 5 предыдущей публикации).

2.1. Управление qBittorrent (веб-интерфейс и мобильное приложение на Android)

Не забываем, что медиацентр у нас, по совместительству, фоновая и круглосуточная торрент-качалка. И, чтобы не мешать домочадцам смотреть мультики или новости можно спокойно управлять своими загрузками. Никто этого даже и не заметит.

Для этого в настройках qBittorrent включить использование веб-интерфейса, задав логин/пароль и порт. Я указываю 8081, если помните порт 8080 мы указывали в настройках KODI, он уже занят.

Теперь можем проверить доступность веб-интерфейса. Он полностью повторяет интерфейс самого приложения, работает без нареканий - рекомендую!

Помимо веб-интерфейса, использую и приложение на android-устройствах - qBittorrent Controller. Настроить подключение к вашему серверу не сложно. Вам понадобиться все тот же порт, логин и пароль.

2.2. Управление KODI Android-устройством (Yatse, Kore)

С управлением системой и торрент-качалкой разобрались, осталось самое главное управление KODI. С этим у вашего медиацентра будет полный порядок.

Для Android-платформ на выбор есть два варианта:
Kore официальное бесплатное приложение;
Yatse стороннее платное ($3.56). Большинству будет достаточно и бесплатного функционала.

Оба варианта отлично справляются со своими задачами. Для подключения используется порт 8080 и логин/пароль, заданный при первоначальной настройке KODI. Оба приложения позволяют управлять просмотром IPTV и контента из библиотеки, дополнениями. Библиотека кэшируется и доступна без подключения к медиацентру, просматривать информацию о фильмах и сериалах можно за пределами домашней сети. Хочется отметить, что Yatse с этим справляется немного лучше. Например, моя библиотека, наполненная исключительно онлайн контентом из Elementum, отображается со всеми постерами и изображениями, Kore отображает только локальные. С логотипами каналов из m3u8-плейлиста IPTV не справляется ни одно приложение, если логотипы локальные отобразят оба.

Из отличительного функционала обоих приложений, хотелось бы выделить интеграцию с Android. На любом медиафайле из контекстного меню можно выбрать пункт Воспроизведение на медиацентре KODI. Итого, любую фотографию, видео или аудиофайл, буквально в несколько кликов вы можете отправить на большой экран вашего телевизора. Еще более приятно - из приложения YouTube на своем телефоне/планшете вы можете нажать Поделиться и также выбрать Воспроизведение на медиацентре KODI - видеоролик мгновенно начнет воспроизведение на вашем телевизоре. По этой причине, кстати, я не использую дополнение YouTube, о котором недавно шла речь, хоть оно установлено и подключено к аккаунту. Гораздо удобнее и быстрее проигрывать ролики с телефона, чем из дополнения.

Виджеты рабочего стола поддерживает только Yatse. Только он еще, кстати, умеет отправлять текст на медиацентр. Удобно при необходимости набора текста на телефоне куда быстрее набрать, чем вводить с экранной клавиатуры, даже аэромышью.

Какое выбрать решать вам. Лично я отдаю предпочтение Yatse. Больше возможностей даже в бесплатной версии, гибкие настройки и более привлекательный интерфейс.

Скриншоты Yatse
Таким не хитрым способом можно проиграть любой медиа-файл с вашего телефона на телевизоре. Это же работает и в приложении YouTubeТаким не хитрым способом можно проиграть любой медиа-файл с вашего телефона на телевизоре. Это же работает и в приложении YouTube
Скриншоты Kore

2.3. Веб-интерфейс KODI и Elementum

Также для удаленного управления у медиацентра есть и веб-интерфейс. Для доступа необходим все тот же порт (8080) и логин/пароль. Функционал довольно-таки ограниченный, но его вполне достаточно для просмотра и запуска контента из библиотеки и IPTV. Взаимодействие с дополнениями также поддержано. Внешний вид веб интерфейса можно изменить, доступно несколько вариантов из стандартного официального репозитория KODI.

Свой веб-интерфейс также имеет и дополнение Elementum. Позволяет просматривать текущее состояние торрентов, добавлять новые из файла или magnet-ссылки, а также удалять уже имеющиеся. Из него также можно напрямую запустить воспроизведение торрента на медиацентре.

Скриншоты веб интерфейсов KODI и Elementum

3. Учет трафика медиацентра (vnStat + веб-интерфейс)

Мониторинг объемов входящего/исходящего трафика для медиацентра, конечно, не совсем актуален, но на длинной дистанции - любопытная информация. Для реализации этой задачи существует множество программ, в том числе и для Ubuntu. Если оставить в этом списке лишь те, которые имеют в своем составе графический интерфейс (веб, например) и анализ данных подходящего совсем немного, из-за своей масштабности, так как это будут полноценные приложения администрирования сети с огромным набором возможностей и, как следствие, высокой ресурсоемкостью. Нагружать медиацентр, ненужными в домашних условиях инструментами, не хотелось бы.

Для простого учета и отображения статистики отлично подойдет vnStat - легковесная программа для мониторинга сетевого трафика для операционной системы Linux с использованием интерфейса командной строки. Программа будет следить не за нашим KODI, а за сетевым интерфейсом. Это именно то, что нужно, так как помимо KODI, работает еще и qBittorrent.

Из коробки поставляется без веб-интерфейса, но благодаря энтузиастам, в сети есть несколько вариантов, отлично взаимодействующих с vnStat. Мне понравился вариант jsvnstat. На сайте разработчика также есть раздел Demo, в котором можно пощупать, как это выглядит и работает.

jsvnstat разработан в далеком 2013 году и, к сожалению, с тех пор не обновлялся. В связи с этим, актуальную версию самого vnStat веб-интерфейс не поддерживает. Не проблема нам будет достаточно возможностей и более старых версий.

Методом перебора нашел последнюю поддерживаемую версию vnStat 1.14. В репозиториях Ubuntu ее уже нет. Можно скачать из репозитория моего GitHub.

Скачиваем и устанавливаем нужную версию

wget https://github.com/arboozov/kodi/raw/master/vnstat_1.14-1ubuntu2_amd64.debsudo dpkg -I vnstat_1.14-1ubuntu2_amd64.deb

Блокируем обновление пакета vnstat, дабы при обновлениях системы не получить самую свежую версию и остаться без работающего веб-интерфейса

sudo apt-mark hold vnstat

Создаем БД для нашего сетевого интерфейса (в моем случае это enp1s0)

vnstat -i -u enp1s0

Устанавливаем и запускаем веб-сервер

sudo add-apt-repository ppa:ondrej/phpsudo apt-get updatesudo apt-get install apache2 php5.6 php5.6-gd wget libapache2-mod-php5.6sudo service apache2 restart

Теперь необходимо загрузить и разместить сам веб-интерфейс на нашем медиацентре. Можно использовать оригинальный вариант с сайта разработчика, либо немного измененный мой вариант. Глобальных правок я не вносил, но немного подправил внешний вид, цвета, убрал лишнее и скорректировал расчет суммарного объема входящего/исходящего трафика в ТБ.

Загружаем, например, мой вариант

wget https://github.com/arboozov/kodi/raw/master/jsvnstat.zip

Распаковываем архив по пути /var/www/html/stat/

unzip jsvnstat.zip -d /var/www/html/stat/

Задаем параметру $interface наш сетевой интерфейс, с которым будем работать, сохраняем изменения

mcedit /var/www/html/stat/settings.php

Настройка завершена, переходим по адресу http://IP-адрес_вашего_медиацентра/stat/. Если все сделано верно отобразится наш веб-интерфейс с анализом трафика с момента установки пакета. БД по умолчанию будет обновляться автоматически каждые 5 минут.

4. Резервное копирование KODI

Медиацентр с KODI на борту, обросший дополнительными возможностями на базе Kubuntu 20.04, полностью настроен и готов к работе. На этом этапе стоит задуматься над резервным копированием и сохранением всего, что сделано, в этом первоначальном состоянии. Не будем недооценивать стабильность и надежность работы нашей операционной системы, но на случай выхода из строя аппаратной части, того же SSD-накопителя, например, хотелось бы иметь возможность быстро восстановить работу, причем в том же состоянии, с наименьшими усилиями. С нуля производить установку и настройку снова сомнительное удовольствие.

Рекомендую иметь хотя бы одну копию (например, первоначального состояния) всей системы. Я сохранил образ диска с помощью Clonezilla. Имея такую копию, без особого труда, можно сказать в пару кликов, меняем накопитель и поднимаем Kubuntu со всеми настройками. Подробно описывать порядок снятия или установки образа не буду. Кто не сталкивался с работой Clonezilla хорошая инструкция на русском языке со скриншотами на losst.ru.

Что касается резервирования самого KODI, то я выполняю копирование с помощью программного дополнения Backup из официального репозитория в автоматическом режиме 1 раз в неделю. Никакого участия от меня в этом не требуется, нужно лишь один раз все правильно настроить.

Так как у меня медиацентр работает и подключен к сети круглосуточно, работу планировщика настроил на еженедельное копирование всех данных KODI в понедельник в 4:00 с хранением двух копий в архиве. То есть, условно, на третей неделе, при резервном копировании будет удалена самая старая копия (с первой недели).

Но где же хранить резервные копии? Хранить под собой на том же диске выстрел себе в ногу, на такой бэкап можно даже не тратить время. Сетевой каталог на другом домашнем хосте в моем случае не вариант, ночью все ПК выключены, днем тоже нет постоянного графика. Включать, например, в ночь каждого понедельника (по моему расписанию) домашний компьютер сомнительная автоматизация. Хотелось бы не участвовать в этом процессе от слова совсем.

Dropbox

Дополнение поддерживает интеграцию с этим популярным файловым хостингом. Подключение не сложное. Необходимо через консоль в личном кабинете сервиса создать приложение для работы с API, предоставить ему необходимый доступ (чтение, запись и удаление), а полученные ключи указать дополнению и авторизоваться. Для авторизации Backup сгенерирует ссылку, перейдя по которой Dropbox сгенерирует код валидации для подтверждения. Работает все очень хорошо, за одним исключением. Авторизации хватает на одну сессию. После перезапуска KODI авторизоваться необходимо повторно. Без авторизации, понятное дело, резервная копия не будет загружена на хостинг. Как итог, процесс опять же требует нашего вмешательства вариант нам не подходит.

Яндекс.Диск

Дополнение не поддерживает работу с этим облачным сервисом, но ведь никто нам не мешает примонтировать его в систему и указать его в настройках Backup, как локальную директорию, а о том, что она не локальная, знать дополнению не обязательно. Этот вариант нам подходит приступаем к работе.

В разделе Управление аккаунтом Яндекс.Диска создаем пароль приложения по WebDAV API.

Для работы с WebDAV API в Ubuntu, устанавливаем в систему пакет davfs2

sudo apt-get install davfs2

Создаем каталог, куда будем монтировать наш Яндекс.Диск и назначаем права

sudo mkdir /mnt/yandex.disksudo chmod -R 0777 /mnt/yandex.disk

Добавляем аккаунт нашего Яндекса в davfs2, где:
логин имя пользователя в сервисе Яндекс, без @домена
пароль ID, созданный в паролях приложений аккаунта Яндекс.Диск

echo "https://webdav.yandex.ru логин пароль" >> /etc/davfs2/secrets

Монтируем в директорию /mnt/yandex.disk

sudo mount -t davfs https://webdav.yandex.ru /mnt/yandex.disk

Конфигурируем fstab, чтобы монтирование Яндекс.Диска в наш каталог происходило автоматически, при старте системы

sudo mcedit /etc/fstab

Вставить в конец файла

https://webdav.yandex.ru:443 /mnt/yandex.disk davfs user,rw,_netdev 0 0

Осталось лишь указать наш каталог в настройках дополнения Backup.

Не будем дожидаться ближайшей ночи понедельника и запустим создание резервной копии вручную. После года работы KODI, объем данных для резервирования у меня составляет 1.61 Гб, после архивации 1.35 Гб. В верхнем правом углу будет выводиться информация о ходе выполнения резервной копии.

Google Drive

По аналогии можно настроить бэкап KODI и на сервис от Google. Отличие будет лишь в монтировании его в систему. Приступаем.

Нам понадобится пакет google-drive-ocamlfuse. Добавляем в систему репозиторий, обновляем список пакетов и устанавливаем

sudo add-apt-repository ppa:alessandro-strada/ppasudo apt-get updatesudo apt-get install google-drive-ocamlfuse

Создаем директорию, куда будем монтировать и назначаем права

sudo mkdir /mnt/google.drivesudo chmod -R 0777 /mnt/google.drive

Теперь необходимо из-под пользователя (не sudo), авторизованного в системе из консоли выполнить команду

google-drive-ocamlfuse /mnt/google.drive

Вы будете перенаправлены в браузер для авторизации. По ее завершении Google у вас спросит разрешить ли KODI управлять вашим диском подтверждаем.

Готово, можно перейти в директорию /mnt/google.drive и увидеть там свои файлы в облаке.

Как и в случае с Яндекс.Диском, Google Drive после перезапуска системы автоматически не смонтирует ваш диск. Настроим автомонтирование самостоятельно.

Создаем скрипт

mcedit /usr/bin/gdfuse

Вставляем содержимое

#!/bin/bashgoogle-drive-ocamlfuse -label $1 $*exit 0

Назначаем права на выполнение и копируем в root

sudo chmod +x /usr/bin/gdfusesudo cp -r /home/имя_пользователя/.gdfuse /root/

Осталось лишь сконфигурировать fstab

sudo mcedit /etc/fstab

Вставляем в конец файла

gdfuse#default /mnt/google.drive fuse allow_other 0 0

Теперь ваш облачный диск всегда будет монтироваться в систему автоматически.

В завершении темы о резервном копировании KODI, хочется добавить, что, помимо стандартных данных для резервирования, можно добавить и свой каталог. С единственным ограничением каталог должен быть по пути /home/имя_пользователя/.kodi/. Например, у меня там находится каталог wiki с какими-то моими заметками, скриптами и настройками. Для этого в настройках дополнения Backup в Типы файлов сменить режим с Simple на Advanced и добавить нужный каталог он теперь также будет добавлен в архив резервной копии.


Таким образом, при наличии небольшого количества времени и навыков, получаем мультимедийный комбайн с дополнительными возможностями домашнего сервера и множеством комфортных способов управления, способного работать 24/7/365, аналога которому я пока не нашел, возможно лишь по тому, что и не искал он целиком и полностью устраивает меня и моих домочадцев.

P.S. В планах на втором телевизоре также поднять KODI (вероятно на Raspberry Pi 3/4) и синхронизировать оба устройства с помощью MySQL. Публикация о проделанной работе в этом направлении обязательно будет.

Подробнее..

Как разработать аналог Zoom для ТВ-приставок на RDK и Linux. Разбираемся с фреймворком GStreamer

29.09.2020 16:20:30 | Автор: admin
Сценарии: как использовать приложение для видеоконференций на SmartTV и ТВ-приставкахСценарии: как использовать приложение для видеоконференций на SmartTV и ТВ-приставках

Пандемия COVID-19 стала катализатором для новых полезных сервисов. Например, Zoom стал настолько успешным, что по стоимости обогнал в этом месяце IBM. Нас вдохновил этот пример, и мы решили пойти еще дальше: а что если онлайн-конференции реализовать на приставках и Smart TV, чтобы общаться не только по работе, но устраивать удаленные посиделки на диване с друзьями? Но ведь тогда можно на футболе вместе покричать, и кино посмотреть или спортом заняться под контролем тренера.

Почему-то у операторов цифрового ТВ такой услуги не оказалось, хотя с инженерной точки зрения все эти функции вполне можно реализовать на ТВ-приставках на базе Linux/Android и RDK. Мы это проверили на практике и вот теперь делимся с читателями Хабра своим рецептом создания аналога Zoom и видеоконференций через Smart TV. Разберем архитектуру решения и кодирование видеопотока с использованием GStreamer. Информацию для работы с этим фреймворком мы собирали по крупицам, но оно того стоило.

Разбираемся с архитектурой

При разработке архитектуры приложений для ТВ-приставок важно учитывать потенциальные ограничения программной и аппаратной части этих устройств. Те, кто создает desktop-программы, как правило, не сталкиваются с этими сложностями, а для embedded-разработчиков это обычное дело.

Итак, с чем мы столкнемся на ТВ-приставках:

  1. Ограниченность ресурсов процессоров и самих приставок. Чаще всего в STB-устройствах используются разнообразные ARM-процессоры, они несут в себя ряд ограничений и дополнительных задач, в частности необходимость использования аппаратного кодирования/декодирование видеопотока. Всегда нужно учитывать, что быстродействие одно из узких мест.

  2. Разность архитектур в приставках разных производителей. Некоторые базируются на Android, другие на RDK, третьи на дистрибутивах на базе Linux со своими ограничениями и нюансами. Поэтому на старте разработки лучше выбрать наиболее общие и кроссплатформенные решения в разных модулях программы. Уже не говоря о поддержке desktop-версии. А уже потом переходить к частным случаям.

  3. Сетевые ограничения. Многие приставки работают как по Ethernet так и по wifi. Сжатие и передача видео/аудиопотока еще одно узкое место в приложениях такого рода.

  4. Безопасность передачи потока и др. вопросы безопасности данных.

  5. Поддержка камер и микрофонов на встроенных платформах.

Теперь можно разложить по полочкам и саму архитектуру. Аналог Zoom для ТВ-приставок будет состоять из нескольких больших компонентов и модулей:

  • Захват видеопотока

  • Захват аудиопотока

  • Сетевой модуль

  • Модуль кодирования видео/аудиопотока

  • Модуль декодирования видео/аудиопотока

  • Вывод видеоконференции на экран

  • Вывод звука

  • Цветовые преобразования

  • Несколько других второстепенных компонентов

В упрощенном виде один из вариантов архитектуры можно изобразить так:

Архитектура приложения для видеоконференций через Smart TVАрхитектура приложения для видеоконференций через Smart TV

В рамках статьи мы сфокусируемся на кодировании декодирования видеопотока и на возможной реализации с использованием фреймворка GStreamer, т.к. это один из ключевых моментов в разработке приложений для видеоконференций.

Кодирование/декодирование потока

1) Преимущества GStreamer

Как мы уже отметили, одним из узких мест является передача видеопотока. Предположим у вас есть камера, отдающие кадры на скорости 30 кадров с секунду на небольшом разрешении 640x480. Итого, в RGB24 получается:

640 х 480 х 3 х 30 = 27 648 000 байт в секунду, т.е. более 26 Мбайт в секунду, что по понятным причинам совершенно неприемлемо в рамках сетевой передачи.

Один из вариантов решения реализовать кодирование какой-нибудь библиотекой. И тут, как можно уже было догадаться из названия статьи, выбор пал на фреймворк GStreamer. Почему именно эта библиотека? Вот несколько ее преимуществ на фоне остальных решений:

  1. Хорошая кроссплатформенность и отличная поддержка Linux и Android.

  2. На RDK Gstreamer является стандартом кодирования/декодирования и включен в дистрибутив по-умолчанию.

  3. Поддержках широкого набора модулей, фильтров и кодеков. Тот же FFmpeg, который можно использовать для тех же целей, де-факто является лишь одним из модулей GStreamerа.

  4. Простота построения конвейера (pipeline). Выстроить цепочку кодирования/декодирования не составляет большого труда, а сам подход конвейера позволяет легко заменять кодеки, фильтры и прочее без лишнего переписывания кода.

  5. API для работы С/C++ идет комплекте.

  6. Поддержка аппаратных кодеров/декодеров, в частности OpenMAX API что крайне важно при работе с ТВ-приставками.

2) Знакомимся с GStreamer разбираемся с конвейерами

Прежде чем приступать к рассмотрению кода, давайте разберемся с тем, что можно делать пока и без него. В состав GStreamer входят полезные утилиты для работы, в частности:

gst-inspect-1.0 позволит посмотреть список доступных кодеков и модулей, так что можно сразу увидеть, что будет работать, и выбрать набор фильтров и кодеков.

gst-launch-1.0 позволяет запустить любой конвейер (pipeline).

В GStreamer используется схема декодирования, по которой поток последовательно проходит через разные компоненты, начиная с source, заканчивая sink-выводом. При этом source может быть любым файл, устройство, для вывода (sink) также можно указать нужное файл, экран, сетевые выводы и протоколы (наподобие RTP).

Подробнее про использование утилит и принцип построения конвейера можно почитать в другой статье на Хабре. Классический пример проигрывания mp4-файла:

gst-launch-1.0 filesrc location=file.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

На входе принимается mp4-файл, который проходит через демуксер mp4 qtdemux, парсер h264, затем через декодер, конвертер и, наконец, идет вывод на экран.

Можно заменить autovideosink на filesink с параметром файла и вывести декодированный поток прямиком в файл.

3) Пишем приложение на GStreamer C/C++ API. Попробуем декодировать

Теперь, когда мы разобрались немного с использованием gst-launch-1.0, проделаем все тоже самое, только уже в рамках приложения. Принцип останется тем же: мы встраиваем декодирующий конвейер (pipeline), однако уже с использованием библиотеки GStreamer и glib-событий.

О простейшем примере построения filesrc в filesink с кодом хорошо рассказано в другой хабрастатье GStreamer: элементы и контейнеры. Мы же рассмотрим чуть более реалистичный и сложный живой пример H264-декодирования.

Инициализация GStreamer-приложения происходит один раз при помощи

gstinit (NULL, NULL);

Если вы хотите сразу видеть происходящее в деталях, можно выстроить уровень логирования перед инициализацией

gst_debug_set_active(TRUE);gst_debug_set_default_threshold(GST_LEVEL_LOG);

Учтите: сколько бы у вас не было конвейеров в приложении, инициализировать gstinit достаточно один раз.

Создадим новый event-loop, в котором будут обрабатываться события:

GMainLoop *loop;loop = g_main_loop_new (NULL, FALSE);

И теперь можно начать выстраивать наш конвейер:

Объявим необходимые элементы, в частности сам конвейер как тип GstElement:

GstElement *pipeline, *source, *demuxer, *parser, *decoder, *conv, *sink;pipeline = gst_pipeline_new ("video-decoder");source   = gst_element_factory_make ("filesrc",       "file-source");demuxer  = gst_element_factory_make ("qtdemux",      "h264-demuxer");parser   = gst_element_factory_make ("h264parse",      "h264-parser");decoder  = gst_element_factory_make ("avdec_h264",     "h264-decoder");conv     = gst_element_factory_make ("videoconvert",  "converter");sink     = gst_element_factory_make ("appsink", "video-output");

Каждый элемент конвейера создается через gst_element_factory_make, где первым параметром идет тип, а вторым его условное название для GStreamer, на которое он впоследствии будет опираться, например при выдаче ошибок.

Также не мешало бы проверить, что все компоненты найдены, в противном случае gst_element_factory_make, возвращает NULL.

if (!pipeline || !source || !demuxer || !parser || !decoder || !conv || !sink) {// не инициализирован один элемент - остановкаreturn;}

Установим тот самый параметр location через gob_ject_set:

gob_ject_set (G_OBJECT (source), "location", argv[1], NULL);

Остальные параметры в других элементах можно выставлять аналогичным образом.

Теперь необходим обработчик сообщений GStreamer, создадим соответствующий bus_call:

GstBus *bus;guint bus_watch_id;bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);gst_object_unref (bus);

gst_object_unref и другие подобные вызовы нужны для очищения выделенных объектов.

Затем объявим сам обработчик сообщений:

static gbooleanbus_call (GstBus     *bus,          GstMessage *msg,          gpointer    data){  GMainLoop *loop = (GMainLoop *) data;  switch (GST_MESSAGE_TYPE (msg)) {    case GST_MESSAGE_EOS:      LOGI ("End of stream\n");      g_main_loop_quit (loop);      break;    case GST_MESSAGE_ERROR: {      gchar  *debug;      GError *error;      gst_message_parse_error (msg, &error, &debug);      g_free (debug);      LOGE ("Error: %s\n", error->message);      g_error_free (error);      g_main_loop_quit (loop);      break;    }    default:      break;  }  return TRUE;}

А теперь самое важное: собираем и добавляем все созданные элементы в единый конвейер, тот самый что выстраивали через gst-launch. Очередность добавления, естественно, важна:

gst_bin_add_many (GST_BIN (pipeline), source, demuxer, parser, decoder, conv, sink, NULL);gst_element_link_many (source, demuxer, parser, decoder, conv, sink, NULL);

Стоит также заметить, что такой подход линковки элементов прекрасно работает для потоковых выходов, но в случае именно проигрывания (autovideosink) необходима дополнительная синхронизация и динамическая линковка демуксера и парсера:

  gst_element_link (source, demuxer);  gst_element_link_many (parser, decoder, conv, sink, NULL);  g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), parser);static voidon_pad_added (GstElement *element,              GstPad     *pad,              gpointer    data){  GstPad *sinkpad;  GstElement *decoder = (GstElement *) data;  /* We can now link this pad with the sink pad */  g_print ("Dynamic pad created, linking demuxer/decoder\n");  sinkpad = gst_element_get_static_pad (decoder, "sink");  gst_pad_link (pad, sinkpad);  gst_object_unref (sinkpad);}

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

Ну и, наконец, переводим состояние конвейера в проигрывание:

gst_element_set_state (pipeline, GST_STATE_PLAYING);

И запускаем event-loop:

g_main_loop_run (loop);

После окончания этой процедуры все нужно почистить:

gst_element_set_state (pipeline, GST_STATE_NULL);  gst_object_unref (GST_OBJECT (pipeline));  g_source_remove (bus_watch_id);  g_main_loop_unref (loop);

4) Выбираем энкодеры и декодеры. Фоллбэки

Стоит еще рассказать о полезных, но не особо упомянутых вещах в документации о том, как можно легко организовать фоллбэк декодеров или энкодеров.

Поможет нам в этом функция gst_element_factory_find, которая проверяет, есть ли у нас кодек в factory элементов:

if(gst_element_factory_find("omxh264dec"))decoder  = gst_element_factory_make ("omxh264dec",     "h264-decoder");elsedecoder  = gst_element_factory_make ("avdec_h264",     "h264-decoder");

В данном примере мы приоритезировали выбор аппаратного декорера OMX на платформе RDK, и в случае его отсутствия будем выбирать программную реализацию.

Другой крайне полезной, но еще более редко используемой функцией является проверка того, что же мы на самом деле инициализировали в GstElement (какой кодек):

gst_plugin_feature_get_name(gst_element_get_factory(encoder))

Можно проделать это таким незамысловатым способом и вернуть название инициализированного кодека.

5) Цветовые модели видео

Не стоит оставлять без внимания и цветовые модели, раз уж мы заговорили о кодировании видео с камер. И тут чаще подразумевается YUV, нежели RGB.

Камеры просто обожают цветовую модель YUYV. Но это то, с чем любит работать GStreamer, для него более привычна модель I420. На выходе, если речь не идет о выводе в gl-фрейм, у нас также будут выходить I420-кадры. Будьте готовы подставить необходимые фильтры и выполнить преобразования. Некоторые энкодеры умеют работать и с другими цветовыми моделями, но чаще это исключения из правил.

Еще стоит заметить что у GStreamerа есть свой модуль получения видеопотока с камеры, и его можно использовать для построения конвейера, но об этом расскажем как-нибудь в другой раз.

Разбираемся с буферами и берем данные на лету

1) Буфер ввода

Пришло время разобраться с потоками данных. До этого момента мы просто кодировали то, что есть в файле, через filesrc и выводили все в тот же filesink или на экран.

Теперь будем работать с буферами и входами и выходами appsrc / appsink. Почему-то этому вопросу почти не уделиливнимания в официальной документации.

Как же организовать постоянный поток данных в созданных конвейерах, а точнее подать буфер на выход и получить кодированный или декодированный буфер выхода? Допустим мы получили картинку с камеры, и нам нужно ее закодировать. Мы уже определились с тем, что нам потребуется фрейм в I420. Допустим он у нас есть, что дальше? Как пропустить картинку через весь поток конвейера?

Вначале установим обработчик события need-data, который будет запускаться при необходимости подачи данных в конвейер и начнем подавать входной буфер:

g_signal_connect (source, "need-data", G_CALLBACK (encoder_cb_need_data), NULL);

Сам обработчик имеет следующий вид:

encoder_cb_need_data (GstElement *appsrc,          guint       unused_size,          gpointer    user_data){  GstBuffer *buffer;  GstFlowReturn ret;  GstMapInfo map;   int size;   uint8_t* image;  // get image  buffer = gst_buffer_new_allocate (NULL, size, NULL);  gst_buffer_map (buffer, &map, GST_MAP_WRITE);    memcpy((guchar *)map.data, image,  gst_buffer_get_size( buffer ) );  gst_buffer_unmap(buffer, &map);  g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);  gst_buffer_unref(buffer);}

image это, условно говоря, псевдокод буфера картинки в I420.

Далее мы создаем через gst_buffer_new_allocate буфер необходимого размера, который будет соответствовать размеру буфера картинки.

При помощи gst_buffer_map устанавливаем буфер в режим записи и, используя memcpy, копируем нашу картинку в созданный буфер.

И, наконец, сигнализируем GStreamу о том, что буфер готов.

Ремарка: очень важно после записи использовать gst_buffer_unmap, а также очищать буфер после использования при помощи gst_buffer_unref. Иначе будет утечка памяти. В скудном количестве доступных примеров никто особо насчет вопроса освобождения памяти не заморачивался, а он, понятное дело, важный.

Теперь, когда мы закончили с обработчиком, нужно проделать еще одну вещь: настроить caps на поступление ожидаемого формата.

Делается это перед установкой обработчика сигнала need-data:

g_object_set (G_OBJECT (source),        "stream-type", 0,        "format", GST_FORMAT_TIME, NULL);g_object_set (G_OBJECT (source), "caps",gst_caps_new_simple ("video/x-raw","format", G_TYPE_STRING, "I420","width", G_TYPE_INT, 640,"height", G_TYPE_INT, 480,"framerate", GST_TYPE_FRACTION, 30, 1,NULL), NULL);

Как и все параметры GstElement, установка параметров осуществляется через g_object_set.

В данном случае мы задали тип потока, и его caps формат данных. Указав, что на выход appsrc будет поступать данные I420 c разрешением 640x480 и частотой 30 кадров в секунду.

Частота в нашем случае, да в целом, не играет роли. На практике мы не замечали, чтобы GStreamer как-то ограничивал вызовы need-data по частоте.

Готово, теперь наши кадры поступают в энкодер.

2) Буфер вывода

А теперь разберемся, как получить кодированный поток на выходе.

Подключаем обработчик к sink pad:

GstPad *pad = gst_element_get_static_pad (sink, "sink");  gst_pad_add_probe  (pad, GST_PAD_PROBE_TYPE_BUFFER, encoder_cb_have_data, NULL, NULL);  gst_object_unref (pad);

Похожим образом мы подключились к другому событию sink pad GST_PAD_PROBE_TYPE_BUFFER, которое будет вызываться по мере поступления буфера данных в sink pad.

static GstPadProbeReturnencoder_cb_have_data (GstPad * pad,                        GstPadProbeInfo * info,                        gpointer user_data) {  GstBuffer *buf = gst_pad_probe_info_get_buffer (info);  GstMemory *bufMem = gst_buffer_get_memory(buf, 0);  GstMapInfo bufInfo;  gst_memory_map(bufMem, &bufInfo, GST_MAP_READ);  // bufInfo.data, bufInfo.size  gst_memory_unmap(bufMem, &bufInfo);  return GST_PAD_PROBE_OK;}

Колбэк имеет похожую структуру. Теперь нужно достучаться до памяти буфера. Вначале получаем GstBuffer, затем указатель его памяти, используя gst_buffer_get_memory по индексу 0 (как правило задействован только он). И, наконец, используя gst_memory_map, получаем адрес буфера данных bufInfo.data и его размер bufInfo.size.

Фактически мы добились цели получили буфер с кодированными данными и его размер.

Итак, мы рассмотрели ключевые и самые интересные компоненты из приложения для Smart TV аналога Zoom для ТВ-приставок: архитектуру, модули кодирования / декодирования через GStreamer, буферы ввода / вывода и используемые цветовые преобразования.

Для операторов цифрового ТВ такая программная платформа может стать новым абонентским сервисом. Для нас инженеров новым интересным embedded-проектом для реализации на разных приставках на базе RDK, Linux и Android. А для всех остальных возможностью приятно проводить время за совместным просмотром фильмов и спортивных матчей, занятий спортом и посиделок с близкими в период карантина или удаленной работы.

Эту идею с сервисом видеоконференций по Smart TV можно развивать и дальше, как с точки зрения инженерных решений, так и по сценариям их использования. Так что делитесь мыслями в комментариях.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru