Raspberry PI и цифровое телевидение dvb-t2

  • Автор

Raspberry и dvb-t2


Для просмотра передач цифрового телевидения на Raspberry pi нужно обзавестись тюнером, работающий по стандарту dvb-t2 и решить 3 задачи:

1. Убедиться, что Raspberry видит тюнер.
2. Убедиться, что тюнер видит телевышку.
3. Убедиться, что правильно настроены программы для приема, показа и записи телепередач.

Все это было реализовано на Raspberry Pi 3 под управлением Raspbian Stretch (Version:November 2018, Release date:2018-11-13, Kernel version:4.14)


А теперь подробнее. (Букв будет много, но результат того стоит ☺)


Задача 1. Убедиться, что Raspberry видит тюнер

Для приема передач использовался тюнер AstroMeta Digital TV Dongle, который можно найти и купить на aliexpress, введя в поиск строку «DVB-T2 DVB-C FM DAB USB tv stick». Внутренности этого тюнера можно посмотреть по ссылке https://www.ixbt.com/monitor/astrometa-digital-tv-dongle.shtml

 15441905755c0a7a6f42798.jpg

После подключения тюнера к USB разъему нужно выйти в терминал и выполнить команду
    $ lsusb | grep HanfTek
Если не экране появится строка, похожая на такую
    Bus 001 Device 007: ID 15f4:0131 HanfTek
значит Raspberry видит тюнер на аппаратном уровне. В противном случае надо разбираться с плохими контактами, сгоревшими портами и плохим электропитанием.

Если тюнер виден на аппаратном уровне, можно продолжить и ввести команду
    $ sudo dmesg -t | grep dvb

Появление таких строк в выводе программы потребует дополнительных действий.
    [ 31.201602] mn88473 4-0018: Direct firmware load for dvb-demod-mn88473-01.fw failed with error -2
    [ 31.201653] mn88473 4-0018: firmare file 'dvb-demod-mn88473-01.fw' not found
Это сообщение означает, что не найден файл dvb-demod-mn88473-01.fw, необходимый для работы тюнера. Файл нужно найти в интернете и положить его в папку /lib/firmware/

Сделать это можно, выполнив следующие команды:
    $ cd /lib/firmware/
    $ sudo wget http://palosaari.fi/linux/v4l-dvb/firmware/MN88473/01/latest/dvb-demod-mn88473-01.fw
или
    $ cd /lib/firmware/
    $ sudo wget https://github.com/OpenELEC/dvb-firmware/raw/master/firmware/dvb-demod-mn88473-01.fw

После этого нужно перегрузиться и убедиться в нормальной работе тюнера.
    $ sudo reboot
    $ sudo dmesg -t | grep dvb
Raspberry видит тюнер на программном уровне, если на экране будут такие строки:
    usb 1-1.3: Product: dvbt2
    usb 1-1.3: Manufacturer: astrometadvbt2
    usb 1-1.3: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm state
    usb 1-1.3: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
    usb 1-1.3: dvb_usb_v2: schedule remote query interval to 200 msecs
    input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input1
    rc rc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
    usb 1-1.3: dvb_usb_v2: 'Astrometa DVB-T2' successfully initialized and connected
    usbcore: registered new interface driver dvb_usb_rtl28xxu

Ввод команды
    $ ls /dev/dvb/
покажет номер адаптера «adapter0», соответствующего подключенному тюнеру, а команда
    $ ls /dev/dvb/ adapter0
покажет название интерфейсов, которые поддерживает этот адаптер 0
    demux0  dvr0  frontend0  frontend1  net0

Для дальнейших настроек установите два пакета
    $ apt-get install dvb-tools dtv-scan-tables

Можно посмотреть, что такое frontend0 и frontend1 у адаптера 0.

    $ dvb-fe-tool -a 0 -f 0
Вывод программы однозначно показывает, что frontend0 – это интерфейс для приема сигнала в формате DVB-T.

    $ dvb-fe-tool -a 0 -f 1
Глядя на вывод программы, убеждаемся, что frontend1 – это интерфейс для приема сигнала в формате DVB-T2 со всеми необходимыми возможностями и именно этот интерфейс будет использоваться для дальнейших настроек.

Замечу, что вместе с работающим тюнером у Raspberry pi появился инфракрасный датчик, который отлично работает под lirc, но это в данной публикации рассматриваться не будет.


Задача 2. Убедиться, что тюнер видит телевышку

На сайте http://карта.ртрс.рф надо найти точку, в которой будут расположены тюнер и Raspberry. Щелкнув мышкой по этой точке можно увидеть параметры ближайших телевышек, с которых в дальнейшем будет приниматься телетрансляция. Для моего случая параметры такие:

    Расстояние: 10,13 км
    Направление: 339
    Пакет телеканалов РТРС-1 - ТВК 30 (546 МГц)
    Пакет телеканалов РТРС-2 - ТВК 24 (498 МГц)

Расстояние и направление нужно для выбора антенны и ее ориентации при размещении.
Частоты потребуются и при выборе антенны, и при настройки тюнера.

У меня штатная антенна из комплекта тюнера не заработала при удаленности от вышки на 10 км и пришлось рассчитывать и делать антенну типа «Двойной квадрат Харченко». 

 15441906115c0a7a93e0480.jpg

Расчет делался по средней длине волны первого и второго мультиплекса. Кстати, третий мультиплекс на ТВК 34 (578 МГц) так же отлично принимается из-за широкополосности этой антенны.

    Скорость света = 299,792458 км/сек
    Средняя частота 1 и 2 мультиплексов = (546 + 498) / 2 = 522 Мгц
    Рабочая длина волны антенны = 299,792458 / 522 = 57,43 см
    Сторона квадрата антенны равна четверти длины волны, т.е. 57,43 / 4 = 14,36 см.

Взявши медный провод длиной 115 см и диаметром 2,5 мм я сделал фигуру, похожую на восьмерку из двух квадратов со стороной 144 мм, запаяв стык в талии восьмерки. Зазор в талии восьмерки оставил равным 10 мм, припаяв экран коаксиала к одной стороне, а центральную жилу - к другой стороне талии. Место пайки поместил в пластиковую крышку от молока и залил пластиком, сохраняя зазор в 10 мм. Длина коаксиала до тюнера примерно 80 см. Сам тюнер включил в метровый USB удлинитель, рассчитанный на скорости USB2. Антенну разместил вертикально (т.е. как восьмерку), т.к. поляризация в Москве горизонтальная. Для приема сигнала с вертикальной поляризацией антенну надо размещать как восьмерку, лежащую на боку. Ориентировал антенну по компасу плоскостью на телевышку (в моем случае на 399 градусов).

Антенна готова и можно приниматься за сканирование эфира.

Таблицы сканирования расположены в папке /usr/share/dvb/dvb-t/, но нужный мне город отсутствует. Там есть таблица ru-all, которая рассчитана на сканирование всех частот, но она не учитывает используемый в Москве Multiple PLP - режим передачи нескольких каналов физического уровня внутри одного транспортного потока (мультиплекса). 

Для Москвы реальные трансляции такие:

Мультиплекс 1 - 546 Mhz (plp 0, 1, 2)
Мультиплекс 2 - 498 Mhz (plp 0)
Мультиплекс 3 - 578 Mhz (plp 0)

И соответствующая таблица сканирования выглядит так:

[MULTIPLEX 1]
        FREQUENCY = 546000000
        MODULATION = QAM/256
        BANDWIDTH_HZ = 8000000
        INVERSION = AUTO
        CODE_RATE_HP = AUTO
        CODE_RATE_LP = AUTO
        GUARD_INTERVAL = AUTO
        TRANSMISSION_MODE = AUTO
        HIERARCHY = NONE
        STREAM_ID = 0
        DELIVERY_SYSTEM = DVBT2

[MULTIPLEX 1-1]
        FREQUENCY = 546000000
        MODULATION = QAM/256
        BANDWIDTH_HZ = 8000000
        INVERSION = AUTO
        CODE_RATE_HP = AUTO
        CODE_RATE_LP = AUTO
        GUARD_INTERVAL = AUTO
        TRANSMISSION_MODE = AUTO
        HIERARCHY = NONE
        STREAM_ID = 1
        DELIVERY_SYSTEM = DVBT2

[MULTIPLEX 1-2]
        FREQUENCY = 546000000
        MODULATION = QAM/256
        BANDWIDTH_HZ = 8000000
        INVERSION = AUTO
        CODE_RATE_HP = AUTO
        CODE_RATE_LP = AUTO
        GUARD_INTERVAL = AUTO
        TRANSMISSION_MODE = AUTO
        HIERARCHY = NONE
        STREAM_ID = 2
        DELIVERY_SYSTEM = DVBT2

[MULTIPLEX 2]
        FREQUENCY = 498000000
        MODULATION = QAM/256
        BANDWIDTH_HZ = 8000000
        INVERSION = AUTO
        CODE_RATE_HP = AUTO
        CODE_RATE_LP = AUTO
        GUARD_INTERVAL = AUTO
        TRANSMISSION_MODE = AUTO
        HIERARCHY = NONE
        STREAM_ID = 0
        DELIVERY_SYSTEM = DVBT2

[MULTIPLEX 3]
        FREQUENCY = 578000000
        MODULATION = QAM/AUTO
        BANDWIDTH_HZ = 8000000
        INVERSION = AUTO
        CODE_RATE_HP = AUTO
        CODE_RATE_LP = AUTO
        GUARD_INTERVAL = AUTO
        TRANSMISSION_MODE = AUTO
        HIERARCHY = NONE
        STREAM_ID = 0
        DELIVERY_SYSTEM = DVBT2


Подготовить таблицу для своего города очень просто.
В квадратных скобках указывается произвольное название транспортного потока.
FREQUENCY = частота вещания потока в Гц
MODULATION = вид модуляции. Если не знаете точно, то ставьте QAM/AUTO 
STREAM_ID = это тот самый номер канала физического уровня внутри транспортного канала с заданной частотой.

Сохраните таблицу в папке /usr/share/dvb/dvb-t/ под именем «ru-<название города>».  (В моем случае /usr/share/dvb/dvb-t/ru-Moscow).
Далее нужно перейти в домашнюю папку и можно сканировать эфир программой dvbv5-scan, указав в параметрах номер адаптера, номер frontend и таблицу сканируемых частот.

В моем случае это делается так:
    $ cd ~
    $ dvbv5-scan -a 0 -f 1 /usr/share/dvb/dvb-t/ru-Moscow

В домашней папке появится файл dvb_channel.conf, который можно посмотреть командой «less dvb_channel.conf».
Если в нем есть названия каналов с частотами, модуляциями и т.д., по тюнер видит телевышку и можно настраивать программы для просмотра телепередач.
Уровень принимаемого сигнала для разных каналов можно посмотреть так (указав название канала после параметра -r):
    $ dvbv5-zap -a 0 -f 1  -c dvb_channel.conf -r '01 ПЕРВЫЙ КАНАЛ'

Если же сигнал не идет, то надо серьезно заняться подбором и настройкой антенны.


Задача 3. Убедиться, что правильно настроены программы для приема, показа и записи телепередач.

Для удобства просмотра нужно установить потоковый сервер и рекордер tvheadend.
    $ sudo apt-get install tvheadend

При установке будут запрашиваться пароли для входа в настройки.
Забытый пароль можно посмотреть в файле /var/lib/hts/.hts/tvheadend/superuser

Чтобы работать без пароля нужно сделать 3 шага:
* Остановить сервер (sudo service tvheadend stop).
* В файле /etc/init.d/tvheadend строку ARGS="-f" заменить на ARGS="-f --noacl".
* Запустить сервер (sudo service tvheadend start).

Все настройки делаются через web интерфейс по адресу http://127.0.0.1:9981 и многократно описаны в инет. Минимально необходимые инструкции приведены ниже.

Логика настроек tvheadend такая:
* Создать сеть внутреннего телевещания с частотами из таблицы сканируемых частот (напоминаю о /usr/share/dvb/dvb-t/ru-Moscow).
* Связать правильный интерфейс адаптера (напоминаю о adapter0 frontend1) с этой созданной сетью.
* подождать завершения сканирования и разрешить трансляцию всех найденных каналов.

Для создания сети на вкладке «Configuration» -> «DVB Input» ->  «Networks» нажать на зеленый плюс «Add»;
Из списка выбрать тип сети «DVB-T» (именно «DVB-T», а не dvb-t2);
В форме заполнить поля «Network:» (любое имя), «Pre-defined muxes:» (выбрать созданную ранее таблицу сканирования, например ru-Moscow), «Character set:» (выбрать AUTO) и нажать кнопку «Create»

Для связывания адаптера с созданной сетью на вкладке «Configuration» -> «DVB Input» -> «TV adapters» ткнуть мышкой в «Panasonic MN88473 #0 : DVB-T #1» (что соответствует adapter0 frontend1). В форме, открывшейся справа, в разделе «Basic Settings» в поле «Networks:» выбрать созданную сеть. Там же поставить галку в поле «Enabled» и нажать на кнопку «Save».

Для разрешения трансляции всех найденных каналов нужно перейти на вкладку «Configuration» -> «DVB Input» -> «Muxes», дождаться появления в колонке «Scan result» сообщения «OK» (либо «FAIL»). Далее на вкладке «Configuration» -> «DVB Input» -> «Services» в выпадающем списке «Mux Services» выбрать «Map all services» и нажать на кнопку «Save».

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

• Чтобы посмотреть телетрансляции не выходя из web интерфейса tvheadend надо перейти на самую левую вкладку верхнего уровня «Electronic Progran Guide» с загруженной программой передач и ткнуть в иконку телевизора около требуемого канала.

• Если хотите, чтобы у каждого канала показывался логотип, перейдите на вкладку «Configuration» -> «General» ->  «Base». В нижней части открывшейся таблицы в поле «Picon path:» введите «file:///var/lib/hts/picons» (без кавычек), а в поле «Prefer picons over channel name:» поставьте галочку. Все файлы с логотипами телеканалов (png размером 256х256) скопируйте в папку  /var/lib/hts/picons и смените владельца и группу для этих файлов на hts:hts. Далее на вкладке «Configuration» -> «Channel / EPG» -> «Channels» в каждое поле «User Icon» нужно ввести имя файла  (без кавычек) с логотипом канала в формате «picon://01.png», «picon://02.png» и т.д.

• Для просмотра на любом vlc плеере в сети нужен плейлист, который можно получить, набрав в браузере http://127.0.0.1:9981/playlist. Загрузится файл channels, который рекомендую переименовать в channels.m3u и использовать для просмотра в сети со всех компьютеров, планшетов и мобильных телефонов.

• Для iPad и iPhone есть программа TvhClient, которая позволяет смотреть вещание сервера tvheadend и при необходимости запускать запись на Raspberry Pi.

• Для Android-устройств так же есть программы-клиенты tvheadend, которые можно найти в Google Play, задав в строке поиска tvheadend.


Для удобного просмотра телепередач непосредственно на Raspberry pi я использую kodi с пакетом kodi-pvr-hts.

Установка и настройка kodi не сложна, но это уже совсем другая история.

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

Для написания комментариев необходимо зарегистрироваться