Multicast Video: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(Unifi Multicast Enhancement)
 
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Lektüre ==
* https://en.wikipedia.org/wiki/Multicast
* https://en.wikipedia.org/wiki/Multicast_address
* https://ffmpeg.org/ffmpeg-protocols.html#udp
* https://obsproject.com/forum/resources/obs-studio-send-an-udp-stream-to-a-second-pc-using-obs.455/
== Streamen ==
== Streamen ==


Zeile 18: Zeile 25:
: Weitere Optionen gibt es in de ffmpeg Dokumentation: https://ffmpeg.org/ffmpeg-protocols.html#udp
: Weitere Optionen gibt es in de ffmpeg Dokumentation: https://ffmpeg.org/ffmpeg-protocols.html#udp


==== Multicast Stream direkt an Youtube streamen ====
==== Multicast Stream direkt an Youtube weiterleiten ====


Wenn im Netzwerk schon (z.B. von OBS) ein passender Stream eingespeist wird, kann dieser mit folgendem Befehl an Youtube geschickt werden:
Wenn im Netzwerk schon (z.B. von OBS, Webcam, SatIP) ein passender Stream eingespeist wird, kann dieser mit folgendem Befehl an Youtube geschickt werden:
  ffmpeg -i 'udp://[ff02::666]:4242' -vcodec copy -acodec copy -f flv "rtmp://a.rtmp.youtube.com/live2/$STREAM_KEY"
  ffmpeg -i 'udp://[ff02::666]:4242' -vcodec copy -acodec copy -f flv "rtmp://a.rtmp.youtube.com/live2/$STREAM_KEY"
==== FEC: Forward Error Correction (Experimentell) ====
Man kann dem Stream mit zusätzliche Redundanz ausstatten, um Packetloss entgegen zu wirken. Scheinbar gibt es aber wenige Clients, die das gerade nutzen können.
* https://ffmpeg.org/ffmpeg-protocols.html#prompeg
* https://github.com/kirintwn/prompeg-decoder
ffmpeg -re -i $INPUT -vcodec copy -acodec copy -f rtp_mpegts -fec prompeg=l=8:d=4 'rtp://[ff02::2323]:4242?pkt_size=1440'


=== OBS ===
=== OBS ===
Zeile 38: Zeile 54:
* Das '''Container Format''' muss wieder sinnvoll sein. Also wie oben eignet sich in der Regel <code>mpegts</code>.
* Das '''Container Format''' muss wieder sinnvoll sein. Also wie oben eignet sich in der Regel <code>mpegts</code>.
* Es kann scheinbar bisher '''nicht''' der Streamencoder als Quelle benutzt werden -> '''Das Video wird 2 mal encoded!'''
* Es kann scheinbar bisher '''nicht''' der Streamencoder als Quelle benutzt werden -> '''Das Video wird 2 mal encoded!'''
* Unter Umständen '''keine Hardwarebeschleunigung'''. Auch wenn diese im Streamprofil funktioniert.
* Unter Umständen '''keine Hardwarebeschleunigung''', auch wenn diese im Streamprofil funktioniert.


Der Vorschlag stammt von dieser Seite:
Der Vorschlag stammt von dieser Seite:
Zeile 44: Zeile 60:


[[File:Obs_multicast_recording_output.png]]
[[File:Obs_multicast_recording_output.png]]
==== OBS: Variante Recording für kleine Latenz ====
Um möglichst kleine Latenz zu erreichen kann man noch die Audiospur entfernen und die passenden Encodereinstellungen (vor allem <code>tune=zerolatency</code>) setzen.
[[File:Obs_low_latency.png]]
Ohne Audiospur kann beim Abspielen mit
ffplay -probesize 32 -analyzeduration 0 -sync ext 'udp://[ff02::1337]:1337'
mpv --profile=low-latency --untimed 'udp://[ff02::1337]:1337'
auf wenige hundert Millisekunden reduziert werden.


== Abspielen ==
== Abspielen ==
Zeile 52: Zeile 82:


  mpv 'udp://224.0.0.15:9999'
  mpv 'udp://224.0.0.15:9999'
mpv 'rtp://[ff02::2323]:4242'


=== VLC ===
=== VLC ===
Zeile 60: Zeile 92:
Interface muss angegeben werden!
Interface muss angegeben werden!
  vlc 'udp://@224.0.0.15:9999'
  vlc 'udp://@224.0.0.15:9999'
rtp 'rtp://@[ff02::2323%eth0]:4242'


Geht natürlich auch in der GUI:
Geht natürlich auch in der GUI:


[[File:Vlc_udp_ipv6_multicast.png]]
[[File:Vlc_udp_ipv6_multicast.png]]
== Unifi Accesspoint ==
=== Multicast Enhancement ===
Bei Tests mit eingeschaltetem "Multicast Enhancement" war der Multicastdurchsatz nahuzu unbrauchbar. Bei Problemen mit Unifi Accesspoints am besten diese Option einmal prüfen und ggf. abstellen:
[[File:Unifi_multicast_enhancement.png]]

Aktuelle Version vom 25. September 2022, 12:10 Uhr

Lektüre

Streamen

ffmpeg

ffmpeg -re -i $INPUT -vcodec copy -acodec copy -f mpegts 'udp://[ff02::1234]:5678?pkt_size=1440'
-re
Aus der Manpage: "Read input at native frame rate."
Nur nötig, falls man eine Datei abspielen möchte.
-i $INPUT
Eine Datei, oder ein anderer Stream.
-vcodec copy -acodec copy
Video und Audio direkt kopieren. Man kann hier natürlich auch andere Encoder verwenden.
-f mpegts
Für das Streamen muss ein geeignetes Containerformat benutzt werden. mpegts bietet sich da an, weil es so gut wie alles unterstützt.
'udp://[ff02::1234]:5678?pkt_size=1440'
Das ist die Zieladresse, an die gestreamt werden soll. Hier geht es an die IPv6 Multicastgruppe 1234 auf port 5678. Prinzipiell ist hier viel möglich. Es können hier Unicast- und Multicastaddressen angegeben werden.
pkt_size=1440 ist ein wichtiger Zusatz, um die Paketgröße zu beschränken, damit die Pakete nicht fragmentiert werden. Bitte im eigenen Netz mit tcpdump überprüfen.
Weitere Optionen gibt es in de ffmpeg Dokumentation: https://ffmpeg.org/ffmpeg-protocols.html#udp

Multicast Stream direkt an Youtube weiterleiten

Wenn im Netzwerk schon (z.B. von OBS, Webcam, SatIP) ein passender Stream eingespeist wird, kann dieser mit folgendem Befehl an Youtube geschickt werden:

ffmpeg -i 'udp://[ff02::666]:4242' -vcodec copy -acodec copy -f flv "rtmp://a.rtmp.youtube.com/live2/$STREAM_KEY"

FEC: Forward Error Correction (Experimentell)

Man kann dem Stream mit zusätzliche Redundanz ausstatten, um Packetloss entgegen zu wirken. Scheinbar gibt es aber wenige Clients, die das gerade nutzen können.

ffmpeg -re -i $INPUT -vcodec copy -acodec copy -f rtp_mpegts -fec prompeg=l=8:d=4 'rtp://[ff02::2323]:4242?pkt_size=1440'

OBS

OBS: Variante Custom-Stream-Service

In OBS kann mit dem selben URL Format wie in ffmpeg (siehe oben) gearbeitet werden. Einfach im Stream Menu auf Custom Service stellen und als server ein Multicastendpunkt angeben. Auch hier funkionieren die erweiterten Optionen von ffmpeg.

Hier ein Screenshot mit udp://[ff02::1337]:1337?pkt_size=512 (verwendet bitte eine andere Paketgröße) als Endpunkt:

Beispiel Server: udp://[ff02::1337]:1337?pkt_size=512

OBS: Variante Recording mit Custom Output (FFMPEG)

Statt in eine Datei zu schreiben, kann man auch im Recording Menu an ffmpeg übergeben und an eine URL Streamen. Dies kann Sinnvoll sein, wenn man einerseits an eine Streamingplattform streamen will und im lokalen Netz einen anderen Stream verteilen möchte. Dabei ist aber folgendes zu beachten:

  • Das Container Format muss wieder sinnvoll sein. Also wie oben eignet sich in der Regel mpegts.
  • Es kann scheinbar bisher nicht der Streamencoder als Quelle benutzt werden -> Das Video wird 2 mal encoded!
  • Unter Umständen keine Hardwarebeschleunigung, auch wenn diese im Streamprofil funktioniert.

Der Vorschlag stammt von dieser Seite: https://obsproject.com/forum/resources/obs-studio-send-an-udp-stream-to-a-second-pc-using-obs.455/

OBS: Variante Recording für kleine Latenz

Um möglichst kleine Latenz zu erreichen kann man noch die Audiospur entfernen und die passenden Encodereinstellungen (vor allem tune=zerolatency) setzen.

Ohne Audiospur kann beim Abspielen mit

ffplay -probesize 32 -analyzeduration 0 -sync ext 'udp://[ff02::1337]:1337' 
mpv --profile=low-latency --untimed 'udp://[ff02::1337]:1337'

auf wenige hundert Millisekunden reduziert werden.

Abspielen

mpv

mpv 'udp://[ff02::1337]:1337'
mpv 'udp://224.0.0.15:9999'
mpv 'rtp://[ff02::2323]:4242'

VLC

VLC hat eine etwas andere Syntax. Hier muss immer das @ dabei stehen!

vlc 'udp://@[ff02::1337%eth0]:1337'

Interface muss angegeben werden!

vlc 'udp://@224.0.0.15:9999'
rtp 'rtp://@[ff02::2323%eth0]:4242'

Geht natürlich auch in der GUI:

Unifi Accesspoint

Multicast Enhancement

Bei Tests mit eingeschaltetem "Multicast Enhancement" war der Multicastdurchsatz nahuzu unbrauchbar. Bei Problemen mit Unifi Accesspoints am besten diese Option einmal prüfen und ggf. abstellen: