Improvement to config handling
[streamdesktop.git] / streamdesktop
1 #!/bin/bash
2
3 set -e
4
5 if [ "$BASH_VERSION" = "" ];then
6   echo "This sctipt must be run with Bash, try 'bash $0'";
7   exit 1 
8 fi 
9
10 #    Copyright (C) 2020  Ruben Rodriguez <ruben@gnu.org>
11 #
12 #    This program is free software; you can redistribute it and/or modify
13 #    it under the terms of the GNU General Public License as published by
14 #    the Free Software Foundation; either version 2 of the License, or
15 #    (at your option) any later version.
16 #
17 #    This program is distributed in the hope that it will be useful,
18 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
19 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 #    GNU General Public License for more details.
21 #
22 #    You should have received a copy of the GNU General Public License
23 #    along with this program; if not, write to the Free Software
24 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
25
26 # A simple script to capture your desktop and microphone into a file and an icecast2 streaming server
27
28 # Streamer side dependencies: wmctrl gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-pulseaudio pulseaudio ffmpeg
29 # sudo apt-get install wmctrl gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-pulseaudio pulseaudio ffmpeg
30
31 # Server side dependencies: icecast2
32
33 . config
34 if ! [ -f config ]; then
35   echo Copy ./config.example into ./config, and edit it to set up your server, password, and other parameters
36   exit 1
37 fi
38
39 DATE=$(date +%Y-%m-%d-%H_%M_%S)
40 MOUNT=$1
41 [ "$MOUNT" = "" ] && MOUNT=recording
42
43 cat << EOF
44 Usage: $0 [title]
45 The title parameter will be used for the name of the mount, and the name of the file saved:
46   http://$SERVER/$MOUNT.webm
47   File saved locally to ./$MOUNT-${DATE}.webm
48   Log saved to $MOUNT-${DATE}.log
49
50 AUDIO INPUT: this script will record and stream the audio from the default input selection in Pulseaudio. Click on the volume icon in your desktop environment, go to settings, then input, and select the appropriate device and input level.
51
52 SCREEN SELECTION. Note: broadcasting a single window may crash if you minimize or resize the screen after the streaming starts! If you have issues with this, select 0 to broadcast the full screen, but remember to close or hide any privacy-sensitive windows." If the stream is just an empty black square, make sure your desktop is running X11, not Wayland or others. 
53
54 0: Capture FULL SCREEN
55 EOF
56
57 # Window selector
58 WINDOWLIST="$(wmctrl -l)"
59 i=1
60 echo "$WINDOWLIST" |while read line
61 do
62   echo -n "$i: "
63   name=$(echo $line| cut -d' ' -f 4-)
64   echo $name
65   i=$(expr $i + 1)
66 done
67
68 echo
69 echo "Select the window to capture, or press enter to capture the whole screen"
70 read -s -n1 SELECTION
71
72 XID=$(echo "$WINDOWLIST" | sed -n "${SELECTION}p" | sed 's/ .*//')
73
74 if [ "$SELECTION" = 0 ] || [ "$SELECTION" = "" ] ; then
75   XPARAM=""
76 else
77   XPARAM="xid=$XID"
78 fi
79
80
81 # The video needs to be processed after recording
82 trap ctrl_c INT
83 ctrl_c() {
84   echo
85   echo -n "Remuxing streamed video... "
86   mv $MOUNT-${DATE}.webm $MOUNT-${DATE}.webm.bak
87   ffmpeg -i $MOUNT-${DATE}.webm.bak -acodec copy -vcodec copy $MOUNT-${DATE}.webm >> $MOUNT-${DATE}.log 2>&1
88   echo done.
89   echo
90   echo Use $MOUNT-${DATE}.webm for publishing, you can delete $MOUNT-${DATE}.webm.bak
91   echo
92   echo "You can trim the beginning and end of the video with this command (replace the timestamps, HH:MM:SS):"
93   echo   ffmpeg -i $MOUNT-${DATE}.webm -acodec copy -vcodec copy -ss 00:19:27 -to 02:18:51 trimmed.webm
94 }
95
96
97 echo STARTING STREAM in 2 seconds. Press CTRL+C to end the session.
98 sleep 2
99 echo Streaming at http://$SERVER/recording.webm
100 echo
101
102 # GSTREAMER 1.0 pipeline for capture, save to file, and stream to icecast2
103 gst-launch-1.0 --eos-on-shutdown ximagesrc use-damage=false $XPARAM show-pointer=$SHOWPOINTER \
104 ! videorate ! video/x-raw,framerate=$FRAMERATE/1 \
105 ! videoscale ! video/x-raw, width=$WIDTH, height=$HEIGHT \
106 ! videoconvert ! queue !  vp8enc target_bitrate=$BITRATE cpu-used=0 deadline=1 threads=4 keyframe-max-dist=15 ! queue ! mux. \
107 pulsesrc ! vorbisenc  quality=$SOUNDQUALITY ! queue ! mux. \
108 webmmux streamable=true name=mux ! tee name=stream ! queue ! filesink location=$MOUNT-${DATE}.webm sync=false \
109 stream. ! queue max-size-time=0 max-size-bytes=135528448 max-size-buffers=0 ! shout2send ip=$SERVER port=$PORT mount=$MOUNT.webm password=$PASSWORD sync=false \
110 2>&1 | tee $MOUNT-${DATE}.log
111
112