add link re websockets and v4l2sink
[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 # gstreamer
14 * Supports RTP
15 * Supports webcam capture via v4l (video for linux)
16 * Supports screen capture via xmanager/ximagesrc
17 * Interesting URLs:
18   * WebRTC in one direction only: https://stackoverflow.com/questions/57430215/how-to-use-webrtcbin-create-offer-only-receive-video
19   * gstreamer to VLC via RTP: https://stackoverflow.com/questions/13154983/gstreamer-rtp-stream-to-vlc
20   * https://github.com/intel/gstreamer-media-SDK/issues/138
21   * https://developer.ridgerun.com/wiki/index.php?title=GstWebRTC_Pipelines
22   * https://developer.ridgerun.com/wiki/index.php?title=GstWebRTC_-_H264-Opus_Examples#Receive_Pipeline
23
24 ## WebRTC
25 gstreamer has a WebRTC implementation.
26 The examples at https://github.com/centricular/gstwebrtc-demos.git work once
27
28     export OPENSSL_CONF=''
29
30 has been set (see https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/811)
31
32 ## websockets
33
34 connecting to websockets (plus gstreamer and v4l2sink)
35
36 https://michael.stapelberg.ch/posts/2020-06-06-iphone-camera-linux-v4l2loopback/
37
38 ## gstreamer examples
39     gst-launch-1.0 -v playbin uri=file:///home/philipp/tmp/GerisGame.mp4
40     
41     # send
42     gst-launch-1.0 ximagesrc ! videoconvert ! videoscale ! video/x-raw,width=800,height=600 ! vp8enc ! rtpvp8pay ! udpsink host=239.255.12.42 port=5004
43     # receive
44     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
45     
46     # send
47     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
48     # receive
49     gst-launch-1.0 udpsrc address=239.255.12.42 port=5004 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink
50
51
52 * https://stackoverflow.com/questions/33747500/using-gstreamer-to-capture-screen-and-show-it-in-a-window/33822024#33822024
53 * http://www.einarsundgren.se/gstreamer-basic-real-time-streaming-tutorial/
54 * https://gist.github.com/tetkuz/0c038321d05586841897
55 * https://gist.github.com/esrever10/7d39fe2d4163c5b2d7006495c3c911bb
56 * https://gist.github.com/nebgnahz/26a60cd28f671a8b7f522e80e75a9aa5
57 * https://salsa.debian.org/debconf-video-team/ansible/-/blob/master/roles/voctomix/templates/videoteam-stream.j2
58 * https://github.com/xfxf/video-scripts/blob/master/michael/youtube-live.sh
59   (and others in the same repo)
60     
61 # VLC
62 Note that you have to close VLC and open it again for new streaming as VLC leaves the connections
63 open (I spent hours figuring out why http based streaming doesn't work - `netstat -4 --ip` is nice
64 for debugging in that respect).
65
66 ## RTP
67 ### Source
68 The address has to be the address where the video should be streamed **to**. In the following
69 examples, a multicast address is used. It is either the IP address of the device receiving the video (unicast address) or a multicast address 
70 like 239.255.12.42 (multicast addresses are between 224.0.0.0 and 239.255.255.255, some of
71 them being reserved, 239.0.0.0 to 239.255.255.255 are Organization-Local Scope so they are
72 good candidates, see
73 https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml).
74
75     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
76     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
77     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
78     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
79
80 ### Player
81     cvlc rtp://239.255.12.42
82
83
84 ## RTSP
85 For VLC, RTSP means RTSP combined with RTP.
86
87 ### Source
88 We assume that the video source computer has the external IP 192.168.1.54.
89 Instead of rtsp://192.168.1.54:8554/ we could also use rtsp://192.168.1.54:8554/mystream.sdp
90
91     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
92     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
93
94
95 ### Player
96 The address needs to be the address of the source. Note the backslash at the end.
97
98     vlc rtsp://192.168.1.54:8554/
99
100
101 ## VLC Remarks
102 * Latency: The following options are said to reduce latency:
103
104       --network-caching=150 --clock-jitter=0 --clock-synchro=0
105
106 * Duplicating a stream is nice for debugging:
107
108       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
109       cvlc rtp://239.255.12.42
110
111
112 ## HTTP
113 The address at the source side has to be the external one of the local computer.
114
115 ### Source (server)
116     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
117
118 ### Player (client)
119
120     vlc http://192.168.1.54:8080
121
122
123 # Kodi
124 The player built into code knows at least the following streaming protocols: http, rtsp.
125
126 https://kodi.wiki/index.php?title=Internet_video_and_audio_streams