LibrePlanet: Conference/2015/Streaming
Contents
Equipment Template — 3-Room Simultaneous Desktop + In-Room Streaming
Camera
- (3×) Elphel NC353L Camera + C/CS lens adapter ring in-place
- (3×) Tycon POE-INJ-LED-S Shielded POE Inserter with Power & Current LEDS
- (3×) Antec SNP90 Slim Notebook Power Adapter + "blue" tip
- (3×) 6' Belkin Premium Cat5e Networking Cable (flat/snagless)
- (3×) Universal lithium-ion power pack (generic) + charging cables (camera+router battery backup) [TODO: discontinued, find replacement item]
- (3×) One of the following lenses:
- Fujinon HF12.5SA-1 2/3" 12.5mm fixed focal lens (5 megapixel, c-mount)
- Fujinon DV3.4x3.8SA-1 3.8-13mm vari-focal lens (3 megapixel, c-mount)
- Computar E3Z4518CS-MPIR 5MP Full HD IR Varifocal Lens, 4.5-13.2mm (5 megapixel, c*s*-mount ) (boderline unsuitable for low-lighting conditions)
- C-mount <-> Canon EF/EF-S Adapter + manual or manual-option Canon lens of your choice (slight loss in pixel definition)
- (1×) Lens cloth + protective case
- (3×) Dolica Proline AX620B100 Tripod –or– (3×) SystemPro "The Clamper" Jr.
Laptop
- (6×) Lenovo x200, Libreboot'd + Open Video Reference Build
- Non-ancient layer of thermal paste under CPU heatsink, well-dusted exhaust fan
- 4GB of fast memory, matching modules
- >60GB hard drive, SSD preferred (8 hrs = ~50GB video file)
- Non-dead battery, no loose power jack connections or similar problems
- (3-6×) Kensington Combination Laptop Lock K64673US
- Note that the laptop HDD is easily removable and should be secured when streaming is inactive
- (3-6×) Lenovo 90W Ultraslim AC/DC Combo Adapter, Lenovo P/N 41R4493 (optional)
Audio
- (3×) Ifrogz EarPollution Plugz earbuds + single-use alcohol cleansing pads
- (3x) [TODO: Find model #] XLR->USB adapter (encoding station sound capture)
- (6x) 4' USB 2.0 A/B cable
- (3x) TRS (tip ring sleeve) <->"male XLR" adapters
- (3×) Dolica Proline AX620B100 Tripod (mic stand – unscrew ball head)
- (3x) Ultimate Support ULTI-BOOM-TB Telescopic Mic Boom
- (3x) [TODO: Research suitable devices for digital-audio XLR-out from podium laptops]
- (3×) 15' XLR cables for balanced-audio out from podium laptop
- (3x) [TODO: Add podium mic stand model numbers]
Some combination of the following:
- (3×) Behringer QXENYX1002 USB sound board [TODO: evaluate alternative boards]
- (6-9x) Audio Technica P735 Hypercardioid Dynamic Mic (high-end) –or– Audio-Technica MB-1K Handheld Cardioid Dynamic Vocal Microphone
- (3x) XLR<->XLR "male-to-male" adapter
- (3x) XLR<->XLR "female-to-female" adapter
- (6×) 15' XLR cables, good condition
- (3x) Audio-Technica AT8202 Adjustable Inline Attenuator ("padders") (optional -- convert from line-level to mic-level)
- (3×) QSC GX3, GX5, GX7 power amplifier (if in-room sound amplification is provided at venue)
- (6×) QSC Audio I82H –or– QSC I-282H ISIS Surface Mount 2 Way Dual 8" Installation Loudspeaker
- (6x) 15' Speakon cables
- (3×) Dolica Proline AX620B100 Tripod (moderate-duty I82H speaker stand – unscrew ball head)
General
- (3×) 14' Belkin Premium Cat5e Networking Cable (flat/snagless cable, black) (front-of-room to encoding station)
- (3×) 5-Port Gigabit Ethernet Switch [TODO: find model number]
- (3×) 15' Heavy-guage extension cord, orange
- (3×) Power Sentry 5-Outlet Powersquid
- (3x) Equipment transport bins, clear plastic, snap-shut lid, ~20" x ~15"
- (3×) 9" LED-lighted 3-prong extenion cord (for tight spaces)
- (1×) Label maker
- (1×) Victorinox 54525 pocketknife, black
- (1×) Energizer Aluminum Alloy Waterproof Lithium LED Flashlight
- (1×) 30 yd. Gaffers Tape, black ("tape everything!")
- (1×) Cooper Lighting PQS2504IN1 250W Halogen 4-in-1 Worklight (w/ 150w halogen bulb) (makeshift high-intensity room light)
Software Used
Streaming Server
- IceCast2 2.4.1
Streaming Clients
The following software was compiled and installed via the 'Open Video Reference Build' project on Trisquel 7 GNU/Linux.
- GStreamer
- Jack Audio Server
- [TODO: add the rest]
Set up
Camera
- Unpack the gigabit switch
- Plug the switch into the mains
- Use an ethernet cable to plug the switch into the local network of the site.
- Unpack Elphel 353 camera and attach it to the tripod.
- Attach an ethernet cable into the RJ-45 connector on the camera
- Plug the other end of the cable into the PoE injector.
- Plug the PoE injector into the switch
- Plug the PoE injector into the mains
At this point you should have have the Elphel 353 camera attached to a tripod, powered on, with the network connection physically setup.
Our GStreamer Pipeline
In this example please replace the following with your own information:
- 192.168.48.2 - IP Address of camera
- live.example.org - IceCast2 server address
- examplepassword - IceCast2 password
- speaker_mountpoint - IceCast2 mountpoint and local sink filename for the speaker audio/video feed
- slides_mountpoint - IceCast2 mountpoint for the slides
Additional pipelines are listed in the GST Cookbook.
Audio/Video
gst-launch-1.0 -e rtspsrc location=rtsp://192.168.48.2:554 latency=100 ! queue max-size-bytes=100000000 max-size-time=0 ! rtpjpegdepay ! queue max-size-bytes=100000000 max-size-time=0 ! jpegdec max-errors=-1 ! queue max-size-bytes=100000000 max-size-time=0 ! videorate ! video/x-raw,framerate=14/1 ! queue max-size-bytes=100000000 max-size-time=0 ! videoscale ! video/x-raw, width=1296, height=560 ! queue max-size-bytes=100000000 max-size-time=0 ! tee name=halfres ! queue max-size-bytes=100000000 max-size-time=0 ! jpegenc idct-method=2 ! queue max-size-bytes=100000000 max-size-time=0 ! matroskamux name=mux jackaudiosrc connect=1 client-name="GStreamer Input" ! audio/x-raw,rate=48000,channels=1 ! queue max-size-bytes=100000000 max-size-time=0 ! tee name=jackaudio ! queue max-size-bytes=100000000 max-size-time=0 ! vorbisenc ! queue max-size-bytes=100000000 max-size-time=0 ! tee name=vorbisaudio ! queue max-size-bytes=100000000 max-size-time=0 ! mux. mux. ! queue max-size-bytes=100000000 max-size-time=0 ! filesink location=speaker_mountpoint`date +%s`.mkv sync=false halfres. ! queue max-size-bytes=100000000 max-size-time=0 ! videoscale ! video/x-raw,width=648, height=280 ! queue max-size-bytes=100000000 max-size-time=0 ! theoraenc bitrate=400 speed-level=1 ! queue max-size-bytes=100000000 max-size-time=0 ! oggmux name=livestream vorbisaudio. ! queue max-size-bytes=100000000 max-size-time=0 ! livestream. livestream. ! queue max-size-bytes=0 max-size-time=0 ! shout2send ip=live.example.org port=80 password=examplepassword mount=/speaker_mountpoint.ogv halfres. ! videoscale add-borders=true ! queue max-size-bytes=100000000 max-size-time=0 ! videoconvert ! queue max-size-bytes=100000000 max-size-time=0 ! xvimagesink sync=false jackaudio. ! queue max-size-bytes=100000000 max-size-time=0 jackaudio. ! queue max-size-bytes=100000000 max-size-time=0 ! audioconvert ! queue max-size-bytes=100000000 max-size-time=0 ! alsasink
Slides/Screencast
gst-launch-1.0 --eos-on-shutdown ximagesrc use_damage=false ! capsfilter caps=video/x-raw,framerate=4/1,width=1280,height=800 ! queue max-size-bytes=100000000 max-size-time=0 ! videoscale ! video/x-raw, width=1056, height=660 ! queue max-size-bytes=100000000 max-size-time=0 ! videoconvert ! queue max-size-bytes=100000000 max-size-time=0 ! theoraenc bitrate=400 keyframe-auto=false keyframe-force=12 keyframe-freq=12 speed-level=1 drop-frames=false ! queue max-size-bytes=100000000 max-size-time=0 ! oggmux ! queue max-size-bytes=100000000 max-size-time=0 ! shout2send ip=live.example.com port=80 password=examplepassword mount=/slides-mountpoint.ogv
Web Frontend
The live stream web client was written using MithrilJS. This interface depends on Icecast >= 2.4.0 for the JSON statistics API. Source code.
Additionally, a LibreJS-compatible fork of the KiwiIRC client was embedded onto the page. Source code.
Future work
- The in-room streaming X200's are operating at near-100% CPU utilization, limiting the final streaming framerate to 14FPS (18FPS preferred). Evaluate stream stability operating at 18FPS after building GCC from source; alternatively, port X201-series laptops to Libreboot.
- Provide Vorbis-only and/or Opus-only audio streams, CPU overhead permitting.
- Provide instructions for Icecast relays and bandwidth sharing.
- Evaluate Icecast stability under load with HTTPS and low-FPS Theora streams; bare metal hardware might be necessary.
- Integrate <video> element repositioning via jQuery Draggable
- Across-the-board security improvements; development of a Python + openFrameworks streaming app
- Consider 12-hr-delayed re-streaming for across-the-world viewer convenience
- File and bug reports for in-browser playback (esp. Mozilla Firefox-based browsers); watch for regressions and provide patches
- [TODO: list specific bugs here for tracking]