LibrePlanet: Conference/2015/Streaming

From LibrePlanet
Jump to: navigation, search
(Laptop: +memtest86+)
(Audio: add audio adapter)
Line 34: Line 34:
 
===Audio===
 
===Audio===
 
*(3×) Ifrogz EarPollution Plugz earbuds + single-use alcohol cleansing pads
 
*(3×) Ifrogz EarPollution Plugz earbuds + single-use alcohol cleansing pads
*(3x) ['''TODO''': Find model #] XLR->USB adapter (encoding station sound capture)  
+
*(3x) Shure X2u XLR-to-USB Signal Adapter (encoding station sound capture, 'Volume' control is headphones-only)
 
*(6x) 4' USB 2.0 A/B cable
 
*(6x) 4' USB 2.0 A/B cable
 
*(3x) TRS (tip ''ring'' sleeve) <->"male XLR" adapters
 
*(3x) TRS (tip ''ring'' sleeve) <->"male XLR" adapters

Revision as of 15:00, 14 April 2015

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. Memtest86+ testing recommended.
>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) Shure X2u XLR-to-USB Signal Adapter (encoding station sound capture, 'Volume' control is headphones-only)
  • (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.


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]