LibrePlanet: Conference/2016/Streaming

From LibrePlanet
Jump to: navigation, search
(OpenBroadcaster 2 v4l)
(Adding category)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
+
[[Category:Conferences]]
 
== Keynote capture script ==
 
== Keynote capture script ==
  
Line 28: Line 28:
 
== OpenBroadcaster 2 v4l ==
 
== OpenBroadcaster 2 v4l ==
  
This instructions are for building OpenBroadcaster on Debian 8 stable, plus ffmpeg as a dependency.
+
This instructions are for building OpenBroadcaster on Debian '''testing''', plus ffmpeg as a dependency.
  
'''NOTE''' that for OBS to run it is necesary OpenGL 3.2. If using '''Intel graphics''', Debian ''testing'' is needed. This may be necessary for other graphic cards, but has not been confirmed. If so, follow the install instructions ''after'' upgrading to Debian testing.
+
'''NOTE''' that for OBS to run it is necessary OpenGL 3.2 which is not available in Debian 8 Stable. Follow the install instructions ''after'' upgrading to Debian testing.
  
 
=== Building/installing: ===
 
=== Building/installing: ===
Line 39: Line 39:
 
  libpulse-dev libxcomposite-dev libxinerama-dev libv4l-dev libudev-dev libfreetype6-dev \
 
  libpulse-dev libxcomposite-dev libxinerama-dev libv4l-dev libudev-dev libfreetype6-dev \
 
  libfontconfig-dev qtbase5-dev libqt5x11extras5-dev libx264-dev libxcb-xinerama0-dev \
 
  libfontconfig-dev qtbase5-dev libqt5x11extras5-dev libx264-dev libxcb-xinerama0-dev \
  libxcb-shm0-dev libjack-jackd2-dev libcurl4-openssl-dev zlib1g-dev yasm gstreamer-tools
+
  libxcb-shm0-dev libjack-jackd2-dev libcurl4-openssl-dev zlib1g-dev yasm gstreamer-tools pavucontrol
  
 
Download and build ffmpeg:
 
Download and build ffmpeg:
Line 78: Line 78:
 
* Stream Key: ''stream''
 
* Stream Key: ''stream''
  
Test streaming:
 
 
$ gst-launch-1.0 rtmpsrc location="rtmp://127.0.0.1/flvplayback/stream.flv live=1"  ! decodebin ! xvimagesink sync=false
 
  
 
Run streaming to v4l:
 
Run streaming to v4l:
Line 89: Line 86:
 
  video/x-raw,framerate=25/1 ! queue leaky=1 !  v4l2sink device=/dev/video1 sync=false \
 
  video/x-raw,framerate=25/1 ! queue leaky=1 !  v4l2sink device=/dev/video1 sync=false \
 
  decoded. ! audioconvert ! queue leaky=1 ! pulsesink device=alsa_output.1.analog-stereo sync=false
 
  decoded. ! audioconvert ! queue leaky=1 ! pulsesink device=alsa_output.1.analog-stereo sync=false
 +
 +
Start Jitsi Meet session on Chromium (recommended browser, others may work).
 +
 +
* Configure Chromium to use '''Dummy video device (0x0000)''' as the video source, and '''Loopback Analog Stereo''' as the audio source.
 +
* Launch pavucontrol and on the ''Recording'' tab, set Chromium to record from '''Monitor of Loopback Analog Stereo'''.
 +
 +
=== Caveats ===
 +
 +
* This setup introduces ~1s delay on video and audio.
 +
 +
=== Troubleshooting ===
 +
 +
Test streaming:
 +
 +
$ gst-launch-1.0 rtmpsrc location="rtmp://127.0.0.1/flvplayback/stream.flv live=1"  ! decodebin ! xvimagesink sync=false
  
 
Test v4l device:
 
Test v4l device:
  
 
  $ gst-launch-1.0 v4l2src device=/dev/video1 ! xvimagesink
 
  $ gst-launch-1.0 v4l2src device=/dev/video1 ! xvimagesink
 +
 +
== Speaker streaming feed ==
 +
 +
The streaming feed is processed by ABYSS front-end. ABYSS (ABYSS Broadcast Your Stream Successfully) is written in Python, in version 0.1 it consist of a main module used for generating the GUI via GTK3, a module for creating and handling the pipeline using GStreamer-1.0 plugins, and a config file to set inputs/ouputs and server parameters.
 +
 +
Here is the main pipeline (using the Elphel camera) as it could be used in a bash command-line:
 +
<pre>
 +
gst-launch-1.0 -e rtspsrc location=rtsp://192.168.48.2:554 ! queue ! rtpjpegdepay ! tee name=rawvideo ! queue ! jpegdec max-errors=-1 ! tee name=videodecoded ! queue ! xvimagesink sync=false ! \
 +
rawvideo. ! queue ! filesink location=[rawvideo_defaultname] \
 +
videodecoded. ! videoscale ! video/x-raw, width=640, height=360 ! vp8enc min_quantizer=1 max_quantizer=13 cpu-used=5 deadline=42000 threads=2 sharpness=7 ! queue ! webmmux name=mux2 \
 +
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! vorbisenc quality=0.3 ! tee name=rawaudio \
 +
rawaudio. ! queue ! oggmux ! tee name=streamaudio ! queue ! filesink location=[audio_defaultname] \
 +
streamaudio. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=testaudio.ogg password=[server_password] \
 +
rawaudio. ! queue ! mux2. \
 +
mux2. ! tee name=streamfull ! queue ! filesink location=[stream_defaultname] \
 +
streamfull. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=teststream.webm password=[server_password]
 +
</pre>
 +
 +
Here is the backup pipeline in case of Elphel failure, the input is based on USB webcam:
 +
<pre>
 +
gst-launch-1.0 -e v4l2src device=/dev/video[0-9]* ! video/x-raw, width=640, height=360 ! tee name=rawvideo ! queue ! xvimagesink sync=false ! \
 +
rawvideo. ! queue ! mkvmux ! filesink location=[rawvideo_defaultname] \
 +
rawvideo. ! vp8enc min_quantizer=1 max_quantizer=13 cpu-used=5 deadline=42000 threads=2 sharpness=7 ! queue ! webmmux name=mux2 \
 +
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! vorbisenc quality=0.3 ! tee name=rawaudio \
 +
rawaudio. ! queue ! oggmux ! tee name=streamaudio ! queue ! filesink location=[audio_defaultname] \
 +
streamaudio. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=testaudio.ogg password=[server_password] \
 +
rawaudio. ! queue ! mux2. \
 +
mux2. ! tee name=streamfull ! queue ! filesink location=[stream_defaultname] \
 +
streamfull. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=teststream.webm password=[server_password]
 +
</pre>
 +
 +
Here is the test pipeline to check the Elphel framing/focusing and audio inputs:
 +
<pre>
 +
gst-launch-1.0 -e rtspsrc location=rtsp://192.168.48.2:554 ! queue ! rtpjpegdepay ! jpegdec max-errors=-1 ! queue ! xvimagesink sync=false ! \
 +
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! pulsesink device=[output_source_name] sync=false
 +
</pre>
 +
 +
=== Setup ===
 +
 +
* Boot the computer
 +
* Fill out .abyss config file
 +
* Set a virtual interface (if not hard coded)
 +
  # ifcongif eth1:0 192.168.48.50
 +
'''NOTE''' Command-line use on a X200 laptop with an Elphel address of 192.168.48.2
 +
* Plug and power the Elphel camera
 +
* Plug the webcam
 +
* Plug the USB mixing desk
 +
* Launch ABYSS
 +
* Test the setup by clicking 'Set-up test' button
 +
* If everything ok, quit test mode by clicking the previous button
 +
* Start the streaming by clicking 'Stream' button
 +
 +
=== Caveats ===
 +
 +
* No automatic switch from main to backup pipeline if the Elphel camera is physically disconnected from its switch.
 +
Should be solved in next version of ABYSS.
 +
* If internet connection is lost during streaming, the pipeline doesn't fail, moreover the files are still recorded on the local disk.

Latest revision as of 12:57, 28 March 2016

Keynote capture script

#!/bin/bash

xid=$(xwininfo  -root -all|grep "Jitsi Meet" | sed -e 's/^ *//' | cut -d\  -f1)
[ 1${xid}1 != 11 ] && xidparameter="xid=$xid"

export GST_DEBUG=4
DATE=$(date +%Y-%m-%d-%H_%M_%S)
PASSWORD=xxx

# pactl list|grep alsa_output
device1="alsa_output.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo.monitor"
device2="alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo"

gst-launch-1.0 --gst-debug-level=$1 --eos-on-shutdown ximagesrc use-damage=false $xidparameter show-pointer=false !\
 videoconvert ! videorate ! video/x-raw,framerate=20/1 ! videoscale ! video/x-raw, width=1024, height=768 !  \
 vp8enc min_quantizer=1 max_quantizer=10 cpu-used=10 deadline=41000 threads=2 ! queue ! mux. \
 pulsesrc device=$device1 ! adder name=mix ! vorbisenc  quality=0.4 ! queue ! mux. \
 pulsesrc device=$device2 ! mix. \
 webmmux streamable=true name=mux ! queue ! tee name=s ! queue ! filesink location=keynote-${DATE}.webm \
 s. ! queue leaky=2 ! shout2send ip=live2.fsf.org port=80 mount=keynote.webm password=$PASSWORD sync=false 2>&1 |\
 tee keynote-${DATE}.log

OpenBroadcaster 2 v4l

This instructions are for building OpenBroadcaster on Debian testing, plus ffmpeg as a dependency.

NOTE that for OBS to run it is necessary OpenGL 3.2 which is not available in Debian 8 Stable. Follow the install instructions after upgrading to Debian testing.

Building/installing:

Install dependencies:

# apt-get install build-essential pkg-config cmake git checkinstall libx11-dev libgl1-mesa-dev \
libpulse-dev libxcomposite-dev libxinerama-dev libv4l-dev libudev-dev libfreetype6-dev \
libfontconfig-dev qtbase5-dev libqt5x11extras5-dev libx264-dev libxcb-xinerama0-dev \
libxcb-shm0-dev libjack-jackd2-dev libcurl4-openssl-dev zlib1g-dev yasm gstreamer-tools pavucontrol

Download and build ffmpeg:

$ git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ ./configure --enable-shared --prefix=/usr
$ make -j4

# checkinstall --pkgname=FFmpeg --fstrans=no --backup=no \
    --pkgversion="$(date +%Y%m%d)-git" --deldoc=yes

Download and build obs:

$ git clone https://github.com/jp9000/obs-studio.git
$ cd obs-studio
$ mkdir build && cd build
$ cmake -DUNIX_STRUCTURE=1 -DCMAKE_INSTALL_PREFIX=/usr ..
$ make -j4
# checkinstall --pkgname=obs-studio --fstrans=no --backup=no \
   --pkgversion="$(date +%Y%m%d)-git" --deldoc=yes

Install v4l loop:

# apt-get install v4l2loopback-dkms
# echo v4l2loopback >> /etc/modules
# modprobe v4l2loopback


Install local stream manager:

# apt-get install crtmpserver

Setup

Run obs, set streaming settings to:

  • URL: rtmp://127.0.0.1/flvplayback
  • Stream Key: stream


Run streaming to v4l:

# modprobe snd-aloop
# echo snd-aloop >> /etc/modules
$ gst-launch-1.0 rtmpsrc location="rtmp://127.0.0.1/flvplayback/stream.flv live=1" ! decodebin name=decoded ! videorate !\
video/x-raw,framerate=25/1 ! queue leaky=1 !  v4l2sink device=/dev/video1 sync=false \
decoded. ! audioconvert ! queue leaky=1 ! pulsesink device=alsa_output.1.analog-stereo sync=false

Start Jitsi Meet session on Chromium (recommended browser, others may work).

  • Configure Chromium to use Dummy video device (0x0000) as the video source, and Loopback Analog Stereo as the audio source.
  • Launch pavucontrol and on the Recording tab, set Chromium to record from Monitor of Loopback Analog Stereo.

Caveats

  • This setup introduces ~1s delay on video and audio.

Troubleshooting

Test streaming:

$ gst-launch-1.0 rtmpsrc location="rtmp://127.0.0.1/flvplayback/stream.flv live=1"  ! decodebin ! xvimagesink sync=false

Test v4l device:

$ gst-launch-1.0 v4l2src device=/dev/video1 ! xvimagesink

Speaker streaming feed

The streaming feed is processed by ABYSS front-end. ABYSS (ABYSS Broadcast Your Stream Successfully) is written in Python, in version 0.1 it consist of a main module used for generating the GUI via GTK3, a module for creating and handling the pipeline using GStreamer-1.0 plugins, and a config file to set inputs/ouputs and server parameters.

Here is the main pipeline (using the Elphel camera) as it could be used in a bash command-line:

gst-launch-1.0 -e rtspsrc location=rtsp://192.168.48.2:554 ! queue ! rtpjpegdepay ! tee name=rawvideo ! queue ! jpegdec max-errors=-1 ! tee name=videodecoded ! queue ! xvimagesink sync=false ! \
rawvideo. ! queue ! filesink location=[rawvideo_defaultname] \
videodecoded. ! videoscale ! video/x-raw, width=640, height=360 ! vp8enc min_quantizer=1 max_quantizer=13 cpu-used=5 deadline=42000 threads=2 sharpness=7 ! queue ! webmmux name=mux2 \
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! vorbisenc quality=0.3 ! tee name=rawaudio \
rawaudio. ! queue ! oggmux ! tee name=streamaudio ! queue ! filesink location=[audio_defaultname] \
streamaudio. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=testaudio.ogg password=[server_password] \
rawaudio. ! queue ! mux2. \
mux2. ! tee name=streamfull ! queue ! filesink location=[stream_defaultname] \
streamfull. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=teststream.webm password=[server_password]

Here is the backup pipeline in case of Elphel failure, the input is based on USB webcam:

gst-launch-1.0 -e v4l2src device=/dev/video[0-9]* ! video/x-raw, width=640, height=360 ! tee name=rawvideo ! queue ! xvimagesink sync=false ! \
rawvideo. ! queue ! mkvmux ! filesink location=[rawvideo_defaultname] \
rawvideo. ! vp8enc min_quantizer=1 max_quantizer=13 cpu-used=5 deadline=42000 threads=2 sharpness=7 ! queue ! webmmux name=mux2 \
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! vorbisenc quality=0.3 ! tee name=rawaudio \
rawaudio. ! queue ! oggmux ! tee name=streamaudio ! queue ! filesink location=[audio_defaultname] \
streamaudio. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=testaudio.ogg password=[server_password] \
rawaudio. ! queue ! mux2. \
mux2. ! tee name=streamfull ! queue ! filesink location=[stream_defaultname] \
streamfull. ! queue leaky=2! shout2send ip=server.domain.name port=80 mount=teststream.webm password=[server_password]

Here is the test pipeline to check the Elphel framing/focusing and audio inputs:

gst-launch-1.0 -e rtspsrc location=rtsp://192.168.48.2:554 ! queue ! rtpjpegdepay ! jpegdec max-errors=-1 ! queue ! xvimagesink sync=false ! \
pulsesrc device=[input_source_name]! level interval=200000000 ! queue ! pulsesink device=[output_source_name] sync=false

Setup

  • Boot the computer
  • Fill out .abyss config file
  • Set a virtual interface (if not hard coded)
 # ifcongif eth1:0 192.168.48.50

NOTE Command-line use on a X200 laptop with an Elphel address of 192.168.48.2

  • Plug and power the Elphel camera
  • Plug the webcam
  • Plug the USB mixing desk
  • Launch ABYSS
  • Test the setup by clicking 'Set-up test' button
  • If everything ok, quit test mode by clicking the previous button
  • Start the streaming by clicking 'Stream' button

Caveats

  • No automatic switch from main to backup pipeline if the Elphel camera is physically disconnected from its switch.

Should be solved in next version of ABYSS.

  • If internet connection is lost during streaming, the pipeline doesn't fail, moreover the files are still recorded on the local disk.