Postřehy při zprovozňování streamování do multicastu (RTP) - VLC, ffmpeg
VLC umí hezky streamovat do RTP a vytvořit položku v “Síťových proudech (SAP)” při multicastovém streamu. Níže uvádím pár praktických zkušeností.
Příklad:
cvlc -vvv 'http://input.stream/live.ts' \
--sout '#rtp{dst=ff15::1337:dead:beef:deed,port=1234,mux=ts,ttl=8,sdp=sap://,name="NASA TV UHD (IPv6 test)"}' --sout-all --sout-keep
Pozor na toto:
- je vhodné určit interface pro multicast pomocí parametru
--miface ethX
- občas je nutné toto specifikovat i u klienta, např. pro správnou funkčnost přes IPv6
- na strukturování streamů do podsložek zapomeňte, nastavení “group” nefunguje (zřejmě bug)
- aby se stream objevil v “Síťových proudech (SAP)” ve VLC, je třeba přidat k rtp modulu možnost
sdp=sap://
- v mnoha materiálech na internetu je chyba,
sdp=sap
bez dvojtečky a lomítek nefunguje, protože jde o protokol!
- v mnoha materiálech na internetu je chyba,
- přes VLC lze i transkódovat, ale zdá se, že některá nastavení fungují minimálně pochybně (např. bitrate při použití x264). Pokud můžete, transkódujte pomocí binárky ffmpeg a výstup rourou (pipe) posílejte do VLC. Viz níže.
- Vhodným transportním formátem může být MPEG-TS či ASF. A pak jsou tu kontejnery zcela nevhodné, kupř. MP4, MOV, AVI.
Mé zkušenosti s ffmpegem:
Jak co nejefektivněji transkódovat 4K HEVC do 720p na starším (Westmere) CPU:
Zkoušel jsem transkódovat vysílání NASA UHD z DVB-T2 multiplexu 23 - streamovaný pomocí tvheadend - přes VLC do RTP a rozšířit přes multicast.
Co už teď vím a je dobré si pohlídat:
- vhodné nastavení počtu vláken (defaulty ffmpegu nepřinesou nejvyšší výkon)
- dekódování 4K HEVC 59.94fps videa vyžaduje větší výkon než následný encoding do 720p 29.97fps
- ideální počet pro encoding pomocí x264 v mém případě byl kolem 5-6 vláken, pro decoding z H.265 to bylo 16!
- je to silně individuální :) V nějaké chvíli přestane být paralelizace efektivní a nastoupí Amdahlův zákon.
- co nejrychlejší nastavení swscaleru (bilinear nemusí být dost rychlý a scalování tuším běží jen na jednom vlákně) - může být nutný
-sws_flags fast_bilinear
- pro streamování, kde nezáleží na latenci, pomocí libx264 použijte buď
-preset ultrafast
nebo-preset veryfast
- druhý je kvalitnější a ne zas o tolik náročnější (když si vezmu, jak moc náročné je dekódování) - kde to jde, hlavně při dekódování, škálování a převodu barevných prostorů, použijte HW zpracování (
-hwaccel
a pod.). (U mě to nešlo. :)) - Raspberry Pi 4B není v současnosti vhodné použít jako 4K HEVC HW dekodér pro další zpracování. Umí však takový stream přehrát, přes VLC.
Jaký kód nyní používám:
ffmpeg -threads 16 -i 'http://tvheadend:9981/stream/service/xyz' \
-filter:v fps=30000/1001,scale=1280:720 -sws_flags fast_bilinear \
-threads 5 -c:v libx264 -c:a copy -preset veryfast -crf 17 -f mpegts - \
| cvlc --miface eth21 \
--sout '#rtp{dst=225.6.77.58,port=1234,mux=ts,ttl=8,sdp=sap://,name="NASA TV (H264 720p test)"}' --sout-all --sout-keep -