Присоединяйтесь!
Авторизация

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

07 December 2018 - Автор vkataev

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

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

Все это было реализовано на 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

После подключения тюнера к 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 км и пришлось рассчитывать и делать антенну типа «Двойной квадрат Харченко».

Расчет делался по средней длине волны первого и второго мультиплекса. Кстати, третий мультиплекс на ТВК 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"<br>
  • Запустить сервер (sudo service tvheadend start).<br>

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

Логика настроек tvheadend такая:

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

Для создания сети на вкладке «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» - «ChannelEPG» - «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 не сложна, но это уже совсем другая история.

07 December 2018
vkataev
автор статьи

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

  1. giorgijag

    13 February 2019 - Ответить

    I bought astrometa DVB-T2 usb tuner. On windows 10 everything working perfect.I want to use in Ubuntu, but seems there is some problem, but don't know what:Please help me figure out what is the problem.W_scan :~$ w_scan -ft -c GEw_scan -ft -c GE w_scan version 20170107 (compiled for DVB API 5.10)using settings for GEORGIACountry identifier GE not defined. Using defaults.scan type TERRESTRIAL, channellist 4output format vdr-2.0WARNING: could not guess your codepage. Falling back to 'UTF-8'output charset 'UTF-8', use -C <charset> to overrideInfo: using DVB adapter auto detection.main:4007: FATAL: *  NO USEABLE TERRESTRIAL CARD FOUND.  *Please check wether dvb driver is loaded andverify that no dvb application (i.e. vdr) is running.$ lsmod | grep dvbdvb_usb_rtl28xxu 40960 1dvb_usb_v2 40960 1 dvb_usb_rtl28xxudvb_core 126976 2 dvb_usb_v2,rtl2832rc_core 36864 5 lirc_dev,ir_lirc_codec,dvb_usb_v2,dvb_usb_rtl28xxu$ lsusbBus 002 Device 002: ID 8087:8000 Intel Corp. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 001 Device 002: ID 8087:8008 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 007: ID 15f4:0131 HanfTek  << this device Bus 003 Device 004: ID 1c4f:0003 SiGma Micro HID controllerBus 003 Device 003: ID 0bda:818b Realtek Semiconductor Corp. Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubsudo dmesg -t | grep dvb[sudo] password for ggg: usb 3-1: Product: dvbt2usb 3-1: Manufacturer: astrometadvbt2usb 3-1: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm stateusb 3-1: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxerdvbdev: DVB: registering new adapter (Astrometa DVB-T2)lirc lirc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0usb 3-1: dvb_usb_v2: schedule remote query interval to 200 msecsusb 3-1: dvb_usb_v2: 'Astrometa DVB-T2' successfully initialized and connectedusbcore: registered new interface driver dvb_usb_rtl28xxudvb_usb_v2: 'Astrometa DVB-T2:3-1' successfully deinitialized and disconnectedusb 3-1: Product: dvbt2usb 3-1: Manufacturer: astrometadvbt2usb 3-1: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm statedvb_usb_rtl28xxu: probe of 3-1:1.0 failed with error -110usb 3-1: Product: dvbt2usb 3-1: Manufacturer: astrometadvbt2usb 3-1: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm stateusb 3-1: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxerdvbdev: DVB: registering new adapter (Astrometa DVB-T2)lirc lirc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0usb 3-1: dvb_usb_v2: schedule remote query interval to 200 msecsusb 3-1: dvb_usb_v2: 'Astrometa DVB-T2' successfully initialized and connecteddvb_usb_v2: 'Astrometa DVB-T2:3-1' successfully deinitialized and disconnectedusb 3-7: Product: dvbt2usb 3-7: Manufacturer: astrometadvbt2usb 3-7: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm stateusb 3-7: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxerdvbdev: DVB: registering new adapter (Astrometa DVB-T2)lirc lirc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0usb 3-7: dvb_usb_v2: schedule remote query interval to 200 msecsusb 3-7: dvb_usb_v2: 'Astrometa DVB-T2' successfully initialized and connecteddvb-fe-tool -a 0 -f 0Device Realtek RTL2832 (DVB-T) (/dev/dvb/adapter0/frontend0) capabilities:CAN_FEC_1_2CAN_FEC_2_3CAN_FEC_3_4CAN_FEC_5_6CAN_FEC_7_8CAN_FEC_AUTOCAN_GUARD_INTERVAL_AUTOCAN_HIERARCHY_AUTOCAN_INVERSION_AUTOCAN_MUTE_TSCAN_QAM_16CAN_QAM_64CAN_QAM_AUTOCAN_QPSKCAN_RECOVERCAN_TRANSMISSION_MODE_AUTODVB API Version 5.10, Current v5 delivery system: DVBTSupported delivery system: [DVBT]dvb-fe-tool -a 0 -f 1WARNING device dvb0.frontend1 not found

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

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения