LibrePlanet: Conference/2015/Streaming
(update detailed equipment list + create 'Future work' subsection) |
|||
Line 1: | Line 1: | ||
− | = | + | ==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 Notbook 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. | |
− | * | ||
− | |||
− | |||
− | |||
− | |||
− | === | + | <br /> |
− | * | + | ===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 | ||
− | === | + | <br /> |
− | * | + | ===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) ['''TODO''': Add handheld Audio Technica mic model numbers] | ||
+ | *(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) | ||
+ | |||
+ | <br /> | ||
+ | ===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) | ||
+ | |||
+ | <br /> | ||
== Software Used == | == Software Used == | ||
+ | <br /> | ||
=== Streaming Server === | === Streaming Server === | ||
* IceCast2 2.4.1 | * IceCast2 2.4.1 | ||
+ | <br /> | ||
=== Streaming Clients === | === Streaming Clients === | ||
− | The following software was compiled and installed via the | + | The following software was compiled and installed via the [https://gitorious.org/openvideo_reference_build 'Open Video Reference Build'] project on [https://trisquel.info Trisquel 7 GNU/Linux]. |
− | * | + | * [http://gstreamer.freedesktop.org/ GStreamer] |
− | * | + | * [http://jackaudio.org/ Jack Audio Server] |
− | * | + | * ['''TODO''': add the rest] |
+ | <br /> | ||
== Set up == | == Set up == | ||
+ | <br /> | ||
=== Camera === | === Camera === | ||
Line 56: | Line 99: | ||
At this point you should have have the Elphel 353 camera attached to a tripod, powered on, with the network connection physically setup. | At this point you should have have the Elphel 353 camera attached to a tripod, powered on, with the network connection physically setup. | ||
+ | <br /> | ||
== Our GStreamer Pipeline == | == Our GStreamer Pipeline == | ||
Line 66: | Line 110: | ||
* slides_mountpoint - IceCast2 mountpoint for the slides | * slides_mountpoint - IceCast2 mountpoint for the slides | ||
+ | <br /> | ||
=== Audio/Video === | === Audio/Video === | ||
<code> | <code> | ||
− | 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= | + | 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.com 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 |
</code> | </code> | ||
+ | <br /> | ||
=== Slides/Screencast === | === Slides/Screencast === | ||
Line 77: | Line 123: | ||
</code> | </code> | ||
+ | <br /> | ||
== Web Frontend == | == Web Frontend == | ||
− | The [http://libreplanet.org/2015/live live stream web client] was written using [https://lhorie.github.io/mithril/ MithrilJS]. This interface depends on Icecast >= 2.4.0 for the JSON statistics API. | + | The [http://libreplanet.org/2015/live live stream web client] was written using [https://lhorie.github.io/mithril/ MithrilJS]. This interface depends on Icecast >= 2.4.0 for the JSON statistics API. [https://vcs.fsf.org/?p=libreplanet-static.git;a=blob;f=2015/assets/js/stream.js Source code.] |
+ | |||
+ | Additionally, a LibreJS-compatible fork of the [https://kiwiirc.com/ KiwiIRC] client was embedded onto the page. [https://vcs.fsf.org/?p=KiwiIRC.git Source code.] | ||
− | + | <br /> | |
+ | == 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 [http://www.libreboot.org/ Libreboot]. | ||
+ | *Provide [http://www.vorbis.com/ Vorbis-only] and/or [https://www.opus-codec.org/ 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 [https://jqueryui.com/draggable/ jQuery Draggable] | ||
+ | *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] |
Revision as of 20:03, 5 April 2015
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 Notbook 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
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) [TODO: Add handheld Audio Technica mic model numbers]
- (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)
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 repalce the following with your own information:
- 192.168.48.2 - IP Address of camera
- live.example.com - 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
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.com 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
- 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]