Страницы

четверг, 4 октября 2018 г.

DVB-T2 в HLS с помощью VLC

Чтобы было легко масштабировать DVB-T2 можно использовать HLS или MPEG-DASH. При использовании каких-либо промежуточных связок, например, dvblast + ffmpeg возникают лаги, возможно связанные с самой Raspberry Pi, либо я не умёю тюнить IGMPv2, UDP и сеть на ней. Таким образом, необходимо сразу из DVB-T2 получать HLS/MPEG-DASH. Нагуглить что-то готовое и легковесное я не смог. GStreamer слишком запутан и сложен. В качестве эксперимента сделал это на VLC.


$ cat adapter0.vlm
new adapter0 broadcast enabled
setup adapter0 input "dvb-t2://"
setup adapter0 option dvb-adapter=0
setup adapter0 option dvb-frequency=754000000
setup adapter0 option dvb-modulation=256QAM
setup adapter0 option dvb-plp-id=0
setup adapter0 option dvb-bandwidth=8
setup adapter0 option programs=1010,1030,1040,1050,1060,1080,1090,1100
setup adapter0 option ts-es-id-pid
setup adapter0 option no-sout-all
setup adapter0 option sout-standard-access=livehttp
setup adapter0 option sout-standard-mux=ts
setup adapter0 option sout-ts-use-key-frames
setup adapter0 option sout-livehttp-seglen=4
setup adapter0 option sout-livehttp-numsegs=4
setup adapter0 option sout-livehttp-delsegs
setup adapter0 output '#duplicate{dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_01/stream.m3u8,index-url=https://tv.localix.ru/channel_01/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_01/stream-########.ts},select="es=1011-1012",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_03/stream.m3u8,index-url=https://tv.localix.ru/channel_03/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_03/stream-########.ts},select="es=1031-1032",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_04/stream.m3u8,index-url=https://tv.localix.ru/channel_04/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_04/stream-########.ts},select="es=1041-1042",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_05/stream.m3u8,index-url=https://tv.localix.ru/channel_05/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_05/stream-########.ts},select="es=1051-1052",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_06/stream.m3u8,index-url=https://tv.localix.ru/channel_06/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_06/stream-########.ts},select="es=1061-1062",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_08/stream.m3u8,index-url=https://tv.localix.ru/channel_08/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_08/stream-########.ts},select="es=1081-1082",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_09/stream.m3u8,index-url=https://tv.localix.ru/channel_09/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_09/stream-########.ts},select="es=1091-1092",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_10/stream.m3u8,index-url=https://tv.localix.ru/channel_10/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_10/stream-########.ts},select="es=1101-1102"}'
control adapter0 play

$ cat adapter1.vlm
new adapter1 broadcast enabled
setup adapter1 input "dvb-t2://"
setup adapter1 option dvb-adapter=1
setup adapter1 option dvb-frequency=778000000
setup adapter1 option dvb-modulation=256QAM
setup adapter1 option dvb-plp-id=0
setup adapter1 option dvb-bandwidth=8
setup adapter1 option programs=2010,2020,2030,2040,2050,2060,2070,2080,2090,2100
setup adapter1 option ts-es-id-pid
setup adapter1 option no-sout-all
setup adapter1 option sout-standard-access=livehttp
setup adapter1 option sout-standard-mux=ts
setup adapter1 option sout-ts-use-key-frames
setup adapter1 option sout-livehttp-seglen=4
setup adapter1 option sout-livehttp-numsegs=4
setup adapter1 option sout-livehttp-delsegs
setup adapter1 output '#duplicate{dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_11/stream.m3u8,index-url=https://tv.localix.ru/channel_11/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_11/stream-########.ts},select="es=2011-2012",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_12/stream.m3u8,index-url=https://tv.localix.ru/channel_12/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_12/stream-########.ts},select="es=2021-2022",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_13/stream.m3u8,index-url=https://tv.localix.ru/channel_13/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_13/stream-########.ts},select="es=2031-2032",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_14/stream.m3u8,index-url=https://tv.localix.ru/channel_14/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_14/stream-########.ts},select="es=2041-2042",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_15/stream.m3u8,index-url=https://tv.localix.ru/channel_15/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_15/stream-########.ts},select="es=2051-2052",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_16/stream.m3u8,index-url=https://tv.localix.ru/channel_16/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_16/stream-########.ts},select="es=2061-2062",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_17/stream.m3u8,index-url=https://tv.localix.ru/channel_17/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_17/stream-########.ts},select="es=2071-2072",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_18/stream.m3u8,index-url=https://tv.localix.ru/channel_18/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_18/stream-########.ts},select="es=2081-2082",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_19/stream.m3u8,index-url=https://tv.localix.ru/channel_19/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_19/stream-########.ts},select="es=2091-2092",dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_20/stream.m3u8,index-url=https://tv.localix.ru/channel_20/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_20/stream-########.ts},select="es=2101-2102"}'
control adapter1 play

$ cat adapter2.vlm
new adapter2 broadcast enabled
setup adapter2 input "dvb-t2://"
setup adapter2 option dvb-adapter=2
setup adapter2 option dvb-frequency=754000000
setup adapter2 option dvb-modulation=256QAM
setup adapter2 option dvb-plp-id=1
setup adapter2 option dvb-bandwidth=8
setup adapter2 option programs=1020
setup adapter2 option ts-es-id-pid
setup adapter2 option no-sout-all
setup adapter2 option sout-standard-access=livehttp
setup adapter2 option sout-standard-mux=ts
setup adapter2 option sout-ts-use-key-frames
setup adapter2 option sout-livehttp-seglen=4
setup adapter2 option sout-livehttp-numsegs=4
setup adapter2 option sout-livehttp-delsegs
setup adapter2 output '#duplicate{dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_02/stream.m3u8,index-url=https://tv.localix.ru/channel_02/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_02/stream-########.ts},select="es=1021-1022"}'
control adapter2 play

$ cat adapter3.vlm
new adapter3 broadcast enabled
setup adapter3 input "dvb-t2://"
setup adapter3 option dvb-adapter=3
setup adapter3 option dvb-frequency=754000000
setup adapter3 option dvb-modulation=256QAM
setup adapter3 option dvb-plp-id=2
setup adapter3 option dvb-bandwidth=8
setup adapter3 option programs=1070
setup adapter3 option ts-es-id-pid
setup adapter3 option no-sout-all
setup adapter3 option sout-standard-access=livehttp
setup adapter3 option sout-standard-mux=ts
setup adapter3 option sout-ts-use-key-frames
setup adapter3 option sout-livehttp-seglen=4
setup adapter3 option sout-livehttp-numsegs=4
setup adapter3 option sout-livehttp-delsegs
setup adapter3 output '#duplicate{dst=std{access=livehttp{seglen=4,delsegs=true,numsegs=4,index=/mnt/tmp/channel_07/stream.m3u8,index-url=https://tv.localix.ru/channel_07/stream-########.ts},mux=ts{use-key-frames},dst=/mnt/tmp/channel_07/stream-########.ts},select="es=1071-1072"}'
control adapter3 play
Можно также использовать systemd для запуска сервисов:
$ cat /etc/systemd/system/vlc@adapter0.service
[Unit]
Description=VLC HLS Service
After=network-online.target

[Service]
Type=simple
User=_mumudvb
TimeoutStartSec=0
TimeoutStopSec=30
Restart=always
RestartSec=10
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStartPre=-/bin/mkdir -p /mnt/tmp/channel_01 /mnt/tmp/channel_03 /mnt/tmp/channel_04 /mnt/tmp/channel_05 /mnt/tmp/channel_06 /mnt/tmp/channel_08 /mnt/tmp/channel_09 /mnt/tmp/channel_10
ExecStart=/usr/bin/vlc --intf dummy --vlm-conf /etc/vlm/adapter0.vlm

[Install]
WantedBy=multi-user.target
Работает. Но использует больше CPU, чем dvblast раза в 2, ещё использует очень много RAM. Если в транспондере 10 каналов, то около 160-200 мегабайт оперативной памяти улетает.
Буду искать альтернативу.