LibrePlanet: Conference/2019/Streaming

From LibrePlanet
Jump to: navigation, search

The 2019 speaker videos and streaming of the LibrePlanet conference were created using free software. This year, we used HUBAngl to stream speakers and audio to Icecast.

We've been using this system with minor tweaks since LibrePlanet 2017, when we blogged about it. More information on past years: 2017, 2016, 2015.

We used a gstreamer script to stream desktop streams:


export DISPLAY=":0"

while true; do


  # native x200 resolution not supported

  # mirrored mode
  if xdpyinfo|grep -i dimensions |grep 1280x720 -q; then
      XPARAMETERS="startx=0 starty=0 endx=1279 endy=719"
  # dual mode
  if xdpyinfo|grep -i dimensions |grep 2560x720 -q; then
      XPARAMETERS="startx=1280 starty=0 endx=2559 endy=719"

  sleep 1
  gst-launch-1.0 -e ximagesrc $XPARAMETERS use-damage=false show-pointer=false ! videoconvert !  videorate ! video/x-raw,framerate=$FRAMERATE/1 ! videoscale ! video/x-raw, width=1280, height=720 ! queue ! vp8enc target_bitrate=$BITRATE cpu-used=16 deadline=1 threads=2 keyframe-max-dist=$(expr $FRAMERATE \* 2) ! webmmux streamable=true ! shout2send port=80 mount=$MOUNT password=$PASSWORD sync=false

We used desktop shortcuts that ran the following scripts to change video resolution, and to set mirror / dual monitor modes:


export DISPLAY=":0.0"

if (xrandr | grep -q "VGA1 disconnected" ); then
  echo "$0: error: failed to detect 2nd monitor in xrandr output. Doing nothing."
  exit 1

if  ! ( xrandr | grep -q _LP); then
    # See for ways to adjust this.
    xrandr --newmode "1280x720_60.00_LP"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync
    xrandr --addmode LVDS1 "1280x720_60.00_LP"
    xrandr --addmode VGA1 "1280x720_60.00_LP"

if ( [ "1${1}1" = "1dual1" ]); then
    xrandr --output LVDS1 --mode 1280x720_60.00_LP --output VGA1 --mode 1280x720_60.00_LP --right-of LVDS1
    xrandr --output LVDS1 --mode 1280x720_60.00_LP --output VGA1 --same-as LVDS1

echo Changed the screen settings, now restarting gstreamer
pkill gst-launch-1.0

After the conference, we cut and combined the video from the slides laptop and the webcam pointed at the speaker using commands like these:

ffmpeg -i <input file name> -acodec copy -vcodec copy -ss <start point in seconds> -t <duration in seconds> <output file with same file extension>
ffmpeg -threads 0 -i libreplanet2019-room-123_2019-03-23_09-50-48.webm -i libreplanet2019-slides-123_2019-03-23_09-46-26.webm -filter_complex "[0]scale=iw/3:ih/3,fps=24 [pip];[1]fps=24[base];[base][pip]overlay=main_w- overlay_w-10:main_h-overlay_h-10" -g 192 -vcodec libvpx-vp9 -max_muxing_queue_size 9999 output.webm