<span class="latin" style="width:19px;height:19px;">L</span><span class="latin" style="width:19px;height:19px;">i</span><span class="latin" style="width:19px;height:19px;">b</span><span class="latin" style="width:19px;height:19px;">r</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">P</span><span class="latin" style="width:19px;height:19px;">l</span><span class="latin" style="width:19px;height:19px;">a</span><span class="latin" style="width:19px;height:19px;">n</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">t</span><span class="latin" style="width:19px;height:19px;">:</span><span class="latin" style="width:19px;height:19px;">C</span><span class="latin" style="width:19px;height:19px;">o</span><span class="latin" style="width:19px;height:19px;">n</span><span class="latin" style="width:19px;height:19px;">f</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">r</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">n</span><span class="latin" style="width:19px;height:19px;">c</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">/</span><span class="latin" style="width:19px;height:19px;">2</span><span class="latin" style="width:19px;height:19px;">0</span><span class="latin" style="width:19px;height:19px;">1</span><span class="latin" style="width:19px;height:19px;">5</span><span class="latin" style="width:19px;height:19px;">/</span><span class="latin" style="width:19px;height:19px;">S</span><span class="latin" style="width:19px;height:19px;">t</span><span class="latin" style="width:19px;height:19px;">r</span></span><span class="tktr-gyo" style="height:640px;margin:0 0 180px 22px;font-size:19px;_width:19px;/width:19px;"><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">a</span><span class="latin" style="width:19px;height:19px;">m</span><span class="latin" style="width:19px;height:19px;">i</span><span class="latin" style="width:19px;height:19px;">n</span><span class="latin" style="width:19px;height:19px;">g</span><span class="latin" style="display:block;width:19px;height:19px;"> </span><span class="latin" style="width:19px;height:19px;">-</span><span class="latin" style="display:block;width:19px;height:19px;"> </span><span class="latin" style="width:19px;height:19px;">L</span><span class="latin" style="width:19px;height:19px;">i</span><span class="latin" style="width:19px;height:19px;">b</span><span class="latin" style="width:19px;height:19px;">r</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">P</span><span class="latin" style="width:19px;height:19px;">l</span><span class="latin" style="width:19px;height:19px;">a</span><span class="latin" style="width:19px;height:19px;">n</span><span class="latin" style="width:19px;height:19px;">e</span><span class="latin" style="width:19px;height:19px;">t</span>  

Navigation menu




LibrePlanet


About 
About LibrePlanet
Mission Statement
Founding documents
Support this Community
Code of Conduct
Anti-harassment policy
Teams 
Activists
Wiki Helpers
LibrePlanet Artists
FSF Community Team
Local & Student Teams
Conferences 
LibrePlanet Conference
Non-official
Get involved 
Participate
Discussion channels
Events
 


Login
 










LibrePlanet: Conference/2015/Streaming

 

From LibrePlanet

< LibrePlanet:Conference | 2015

Jump to: navigation, search  


Contents

  • 1.2 Laptop
  • 1.3 Audio
  • 1.4 General
  • 2 Software Used
  • 3 Set up
  • 4 Our GStreamer Pipeline
  • 5 Web Frontend
  • 6 Future work
  • Equipment Template — 3-Room Simultaneous Desktop + In-Room Streaming

    Camera




    Laptop

    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
    Note that the laptop HDD is easily removable and should be secured when streaming is inactive


    Audio

    One of the following:





    Some combination of the following:


    Semi-Portable, High-Power In-Room Projection

    To convert these tripods to moderate-duty speaker supports: extend center column several inches, tighten locking collar, widen each support leg to the 2nd position using leg angle adjustment locks, remove the entirety of the ball head assembly (grip firmly and unscrew counter-clockwise), secure mic stand adapter nuts w/ Allen key, then twist-in loudspeakers to the adapter nuts


    General


    Software Used

    Streaming Server

    Streaming Clients

    The following software was compiled and installed via the 'Open Video Reference Build' project on Trisquel 7 GNU/Linux:
    git clone git://code.openvideo.pro/openvideo-build.git


    Set up

    General

    At this point you should have have the Elphel 353 camera attached to a tripod, powered on, with the network connection physically setup.


    Connecting to the camera

    Additional parameters are needed with recently-released SSH clients as camera-supported crypto methods are being deprecated:
    ssh -c aes128-cbc -m hmac-sha1 root@192.168.0.9
    scp -c aes128-cbc -o MACs=hmac-sha1 root@192.168.0.9:/any/file .

    Use the above additional parameters if you receive the following error message when attempting to connect:
    debug1: expecting SSH2_MSG_KEXDH_REPLY
    Read from socket failed: Connection reset by peer

    The default password is the four-letter word 'pass'; 'root' is the only account. Connecting to the camera in this way is only necessary for persistent configuration changes. Note that the camera requires approximately 60 seconds to boot after power is supplied.

    Changing Imaging Defaults on the Elphel 353

    It's helpful to modify parameter defaults to set the preferred capture mode automatically upon each boot -- note that if the image format provided by the camera is mismatched to the GStreamer pipeline the pipeline will fail. An example that changes the window-of-interest to match our "extra-widescreen" pipelines, increases the default JPEG image quality, and disables camera autoexposure in favor of manual control is as follows:

    Start by obtaining a copy of the default parameter set:
    scp -c aes128-cbc -o MACs=hmac-sha1 root@192.168.0.9:/etc/autocampars.xml .

    Copy the following patch into a text editor and save as 'elphel-widescreen.patch' :

    --- autocampars.xml.original 2015-09-11 00:45:09.479139493 -0400
    +++ autocampars.xml 2015-09-11 01:13:09.405220797 -0400
    @@ -532,10 +532,10 @@
             <TRIG>"0"</TRIG>
             <EXPOS>"10000"</EXPOS>
             <VIRT_KEEP>"0"</VIRT_KEEP>
    -        <WOI_LEFT>"0"</WOI_LEFT>
    -        <WOI_TOP>"0"</WOI_TOP>
    -        <WOI_WIDTH>"10000"</WOI_WIDTH>
    -        <WOI_HEIGHT>"10000"</WOI_HEIGHT>
    +        <WOI_LEFT>"336"</WOI_LEFT>
    +        <WOI_TOP>"428"</WOI_TOP>
    +        <WOI_WIDTH>"2592"</WOI_WIDTH>
    +        <WOI_HEIGHT>"1120"</WOI_HEIGHT>
             <FLIPH>"0"</FLIPH>
             <FLIPV>"0"</FLIPV>
             <FPSFLAGS>"0"</FPSFLAGS>
    @@ -563,7 +563,7 @@
             <RSCALE_CTL>"0"</RSCALE_CTL>
             <GSCALE_CTL>"0"</GSCALE_CTL>
             <BSCALE_CTL>"0"</BSCALE_CTL>
    -        <QUALITY>"80"</QUALITY>
    +        <QUALITY>"90"</QUALITY>
             <PORTRAIT>"0"</PORTRAIT>
             <CORING_INDEX>"327685"</CORING_INDEX>
             <COLOR_SATURATION_BLUE>"200"</COLOR_SATURATION_BLUE>
    @@ -581,7 +581,7 @@
             <DGAINGB>"32768"</DGAINGB>
             <DGAINB>"32768"</DGAINB>
             <CORING_PAGE>"0"</CORING_PAGE>
    -        <AUTOEXP_ON>"1"</AUTOEXP_ON>
    +        <AUTOEXP_ON>"0"</AUTOEXP_ON>
             <HISTWND_RWIDTH>"32768"</HISTWND_RWIDTH>
             <HISTWND_RHEIGHT>"32768"</HISTWND_RHEIGHT>
             <HISTWND_RLEFT>"32768"</HISTWND_RLEFT>
    @@ -614,7 +614,7 @@
             <COMPMOD_DCSUB>"0"</COMPMOD_DCSUB>
             <SENSOR_REGS>""</SENSOR_REGS>
             <DAEMON_EN>"0"</DAEMON_EN>
    -        <DAEMON_EN_AUTOEXPOSURE>"1"</DAEMON_EN_AUTOEXPOSURE>
    +        <DAEMON_EN_AUTOEXPOSURE>"0"</DAEMON_EN_AUTOEXPOSURE>
             <DAEMON_EN_STREAMER>"1"</DAEMON_EN_STREAMER>
             <DAEMON_EN_CCAMFTP>"0"</DAEMON_EN_CCAMFTP>
             <DAEMON_EN_CAMOGM>"0"</DAEMON_EN_CAMOGM>
    

    Then apply the patch we just created to the local copy of the camera parameter set:
    patch autocampars.xml widescreen_patch.patch

    Finally, upload the patched file to the camera:
    ssh -c aes128-cbc -m hmac-sha1 root@192.168.0.9 'cat - > /etc/autocampars.xml; sync' < autocampars.xml

    Power-cycle the camera to check that the changes were properly applied.


    Image Quality: FPS & Color Balance

    Start by setting brightness ("white sun" icon) in the 'Camera GUI (camvc) Controls' to a high value (~90% of max) then slowly decrease the value until 18FPS is achieved, regardless of final streaming framerate. If the resulting image is too dark enlarge the lens aperture and ambient lighting; if the image remains too dark increase gain ("green sun" icon) and gamma ("black/white" marble with vertical divider). Alternatively, 16-17FPS (~4FPS in completely-dark rooms) is acceptable at the cost of noticeable motion blur.

    Then, slowly increase the black level ("black/white marble" with horizontal divider) until black objects start to transition into true black in the image. Click the gain icon ("green sun") once to change color control to manual, increase color saturation slightly ("red|green|blue" striped icon) then proceed to tweak the remaining color controls. Clicking on any slider from the bottom will provide coarse adjustment; clicking from the top will provide fine ajustment.

    After initial camera values have been set resize the GUI window to hide the in-browser preview image and monitor focus using the GStreamer live preview window.



    Understanding the Pyle PAD10MXU Mini-Mixer

    Detail view of a PAD10MXU attached to a Shure MX393/O - Omni-Directional Boundary Microphone

    The Pyle PAD10MXU ("mini-board") is a small form-factor audio capture/playback device useful for live-streaming applications. The mini-board has two capture channels as follows:

    Ch 1 has a dedicated gain control knob that provides +10dB signal/volume boost. A corresponding Peak red LED indicator lights if the gain and/or signal level is high enough to cause undesirable sound distortion; the indicator, which flickers in realtime according to level, is a warning light and should remain unlit during normal operation.
    Line 2/3 Level is a dedicated control knob that provides 0 - 10dB gain to Channel 2. The individual levels for each line, including USB playback, are not controlled individually but rather globally. For USB-audio-playback-only via the USB to Computer jack simply disconnect the RCA input jacks and depress the USB Assign to Line button.
    Monitor is a dedicated control knob that provides 0 - 10dB gain for the 1/4" headphone jack labelled Phones Monitor. It is provided simply for listening convenience and does not affect any other aspect of the mini-mixer.
    Master is a dedicated control knob that provides 0 - 10dB gain for Main Out and USB capture. Master has an associated Clip LED indicator which is akin to the Peak indicator with the exception that green coloration indicates "active sound in 80% of maximum range" (good) and red coloration when output is being actively clipped (bad).
    USB to Computer is a bi-directional USB Type B jack located on the back of the mini-mixer that either a) converts Master to digital samples suitable for capture by applications such as Audacity, and/or b) mixes digital samples received to Line 2/3 depending on the state of the USB Assign to Line button. The mini-mixer is powered directly by the host computer when the jack is used as USB to ComputerExt. DC In is the term used when the mixer is disconnected from a host computer and is powered via any USB power adapter or hub rated 500mA or higher.
    Phantom Power is a depressible button that provides 18V of XLR-delivered phantom power (17.3V actual) for microphones that require it for operation. It will have no effect on microphones that do not require it. The associated red LED indicator will slowly fade-to-unlit after the button has been disabled or if the mini-mixer has lost power.
    Power is a green LED that remains lit if the mini-mixer is powered.


    Quirks/Caveats

    Our GStreamer Pipeline

    In this example please replace the following with your own information:

    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

    [TODO: list specific bugs here for tracking]

    This page was a featured resource in May 2015.


    Retrieved from "https://libreplanet.org/wiki?title=LibrePlanet:Conference/2015/Streaming&oldid=41723" 

    Category: 
    Conferences



















    FSF
    The Free Software Foundation (FSF) is a nonprofit with a worldwide mission to promote computer user freedom.

    We defend the rights of all software users. (Read more)
     



    Campaigns


    High Priority Free Software Projects

    Free JavaScript

    Secure Boot vs Restricted Boot

    GNU Operating System

    Defective by Design

    See all campaigns
     



    Get Involved



    Contact
     




    Send your feedback on our translations and new translations of pages to campaigns@fsf.org.

    Copyright © 20132023 Free Software Foundation, Inc.  Privacy Policy, JavaScript license information