add some links on webrtc signaling
[toast/stream2beamer.git] / stream2beamer.md
1 # Stream Desktop/Video/Webcam to Kodi/Beamer/other PCs
2 Gregor and I had a closer look at the following projects:
3
4 # Laplace
5 Simple WebRTC implementation in GO: https://github.com/adamyordan/laplace.git
6 Simple to compile and just works.
7 WebRTC actually uses SRTP (Secure Real-time Transport Protocol). 
8
9 IPv6+IPv4, and no TLS:
10
11     ./laplace -addr "[::]:8080" -tls=false
12
13 ## WebRTC signaling
14
15 * https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling
16 * https://www.tutorialspoint.com/webrtc/webrtc_signaling.htm
17 * https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/
18 * https://github.com/topics/webrtc-signaling
19
20 # gstreamer
21 * Supports RTP
22 * Supports webcam capture via v4l (video for linux)
23 * Supports screen capture via xmanager/ximagesrc
24 * Interesting URLs:
25   * WebRTC in one direction only: https://stackoverflow.com/questions/57430215/how-to-use-webrtcbin-create-offer-only-receive-video
26   * gstreamer to VLC via RTP: https://stackoverflow.com/questions/13154983/gstreamer-rtp-stream-to-vlc
27   * https://github.com/intel/gstreamer-media-SDK/issues/138
28   * https://developer.ridgerun.com/wiki/index.php?title=GstWebRTC_Pipelines
29   * https://developer.ridgerun.com/wiki/index.php?title=GstWebRTC_-_H264-Opus_Examples#Receive_Pipeline
30
31 ## WebRTC
32 gstreamer has a WebRTC implementation.
33 The examples at https://github.com/centricular/gstwebrtc-demos.git work once
34
35     export OPENSSL_CONF=''
36
37 has been set (see https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/811)
38
39 ## gstreamer examples
40     gst-launch-1.0 -v playbin uri=file:///home/philipp/tmp/GerisGame.mp4
41     
42     # send
43     gst-launch-1.0 ximagesrc ! videoconvert ! videoscale ! video/x-raw,width=800,height=600 ! vp8enc ! rtpvp8pay ! udpsink host=239.255.12.42 port=5004
44     # receive
45     gst-launch-1.0 udpsrc address=239.255.12.42 port=5004 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)VP8-DRAFT-IETF-01, payload=(int)96, ssrc=(uint)2990747501, clock-base=(uint)275641083, seqnum-base=(uint)34810" ! rtpvp8depay ! vp8dec ! autovideosink
46     
47     # send
48     gst-launch-1.0 -v ximagesrc ! videoconvert ! videoscale ! video/x-raw,format=I420,width=800,height=600,framerate=25/1 ! jpegenc ! rtpjpegpay ! udpsink host=239.255.12.42 port=5004
49     # receive
50     gst-launch-1.0 udpsrc address=239.255.12.42 port=5004 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink
51
52
53 * https://stackoverflow.com/questions/33747500/using-gstreamer-to-capture-screen-and-show-it-in-a-window/33822024#33822024
54 * http://www.einarsundgren.se/gstreamer-basic-real-time-streaming-tutorial/
55 * https://gist.github.com/tetkuz/0c038321d05586841897
56 * https://gist.github.com/esrever10/7d39fe2d4163c5b2d7006495c3c911bb
57 * https://gist.github.com/nebgnahz/26a60cd28f671a8b7f522e80e75a9aa5
58 * https://salsa.debian.org/debconf-video-team/ansible/-/blob/master/roles/voctomix/templates/videoteam-stream.j2
59 * https://github.com/xfxf/video-scripts/blob/master/michael/youtube-live.sh
60   (and others in the same repo)
61     
62 ## websockets
63
64 connecting to websockets (plus gstreamer and v4l2sink)
65
66 https://michael.stapelberg.ch/posts/2020-06-06-iphone-camera-linux-v4l2loopback/
67
68         # send
69         laplace / chromium
70
71         # receive
72         websocat --insecure "wss://localhost:8080/ws_connect?id=cranky_kind_chipmunk"
73
74 ## more v4l2loopback/v4l2sink
75
76         # send
77         gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video42
78
79         # receive
80         cvlc v4l2:///dev/video42
81
82 # VLC
83 Note that you have to close VLC and open it again for new streaming as VLC leaves the connections
84 open (I spent hours figuring out why http based streaming doesn't work - `netstat -4 --ip` is nice
85 for debugging in that respect).
86
87 ## RTP
88 ### Source
89 The address has to be the address where the video should be streamed **to**. In the following
90 examples, a multicast address is used. It is either the IP address of the device receiving the video (unicast address) or a multicast address 
91 like 239.255.12.42 (multicast addresses are between 224.0.0.0 and 239.255.255.255, some of
92 them being reserved, 239.0.0.0 to 239.255.255.255 are Organization-Local Scope so they are
93 good candidates, see
94 https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml).
95
96     cvlc -vv --sout '#transcode{vcodec=h264,acodec=mpga,channels=2,vb=800,ab=128}:rtp{mux=ts,dst=239.255.12.42,sdp=sap,name="Geris Game"}' GerisGame.mp4
97     cvlc -vv --sout '#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{dst=239.255.12.42,port=5004,mux=ts,sap,name=Geris Game}' :no-sout-all :sout-keep GerisGame.mp4
98     cvlc -vv --sout '#transcode{vcodec=h264,acodec=mpga,channels=2}:rtp{mux=ts,dst=239.255.12.42,sdp=sap,name="Videokamera"}' v4l2:///dev/video0 # long latency
99     cvlc -vv --sout '#transcode{vcodec=h264,acodec=mpga,channels=2}:rtp{mux=ts,dst=239.255.12.42,sdp=sap,name="Desktop"}' screen:// # not convincing
100
101 ### Player
102     cvlc rtp://239.255.12.42
103
104
105 ## RTSP
106 For VLC, RTSP means RTSP combined with RTP.
107
108 ### Source
109 We assume that the video source computer has the external IP 192.168.1.54.
110 Instead of rtsp://192.168.1.54:8554/ we could also use rtsp://192.168.1.54:8554/mystream.sdp
111
112     cvlc -vv --sout '#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://:8554/}' :no-sout-all :sout-keep GerisGame.mp4
113     cvlc -vv --sout '#rtp{dst=239.255.12.42,port=1234,sdp=rtsp://192.168.1.54:8554/}' :no-sout-all :sout-keep GerisGame.mp4
114
115
116 ### Player
117 The address needs to be the address of the source. Note the backslash at the end.
118
119     vlc rtsp://192.168.1.54:8554/
120
121
122 ## VLC Remarks
123 * Latency: The following options are said to reduce latency:
124
125       --network-caching=150 --clock-jitter=0 --clock-synchro=0
126
127 * Duplicating a stream is nice for debugging:
128
129       cvlc -vv --sout '#duplicate{dst=display,dst="transcode{vcodec=h264,acodec=mpga,channels=2,vb=800,ab=128}:rtp{mux=ts,dst=239.255.12.42,sdp=sap,name=Geris Game}"}' GerisGame.mp4
130       cvlc rtp://239.255.12.42
131
132
133 ## HTTP
134 The address at the source side has to be the external one of the local computer.
135
136 ### Source (server)
137     cvlc -vv --sout '#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:standard{access=http,mux=ogg,dst=0.0.0.0:8080}' GerisGame.mp4
138
139 ### Player (client)
140
141     vlc http://192.168.1.54:8080
142
143
144 # Kodi
145 The player built into code knows at least the following streaming protocols: http, rtsp.
146
147 https://kodi.wiki/index.php?title=Internet_video_and_audio_streams