1

I'm building a little baby monitor using RaspberryPi ZeroW and UV4L and run into a little problem. I'm using WebRTC to cast video and audio to my browser from RPI camera (used facedetect demo, scrapped some unused js and it works like a charm). I was happy when I discovered, that 640x480@15fps video uses roughly 30% CPU. Well, my smile faded when I plugged in my newly bought, cheap usb sound card. 90% cpu load from only uv4l process. When I just disconnect the usb sound card, or change uv4l config to not stream sound, CPU goes back to 30%. And here is my question: It's meant to be only a baby monitor, so can I do anything (even greatly sacrificing audio quality) to take some of this load off cpu? Lower bitrate maybe? Or is there any option in uv4l to manage audio quality, that I missed in manual?

My uv4l config for reference:

# You can use this file to override the built-in defaults of the options in
# the following modules:
# - UV4L core
# - raspicam driver
# - Streaming Server module.
#
# To get a full list of the available options with their defaults and
# descriptions, please refer to the 'uv4l', 'uv4l-raspicam' and 'uv4l-server'
# manual pages, or alternatively type the following command:
#
# uv4l --driver raspicam --help --driver-help --server-help
#
# This file is parsed by uv4l through the 'uv4l_raspicam' system service script,
# if installed. If you are not using the service facility to load the raspicam
# driver, then to instruct uv4l to parse this file you must explicitly pass its
# path to the '--driver-config-file' driver option and/or to the '--config-file'
# options, for example (in one line):
#
# uv4l [...] --driver raspicam --config-file=/path/to/uv4l-raspicam.conf \
# --driver-config-file=/path/to/uv4l-raspicam.conf
#
# NOTE: multi argument options must be specified with one argument per line,
# e.g the command line option '--min-object-size 80 120', in this file becomes:
#   min-object-size = 80
#   min-object-size = 120
# another example:
#   server-option = --webrtc-stun-urls=stun:stun.l.google.com:19302
#   server-option = --webrtc-stun-urls=stun1.l.google.com:19302
#
# NOTE: to comment out an option override put a # at the beginning of the
# corresponding line. Remember that any commented out option that may appear
# on a standard installation of this file is *not* necessarily specified with
# its default built-in value.

##################################
# uv4l core options
##################################

driver = raspicam
# video_nr = 0
auto-video_nr = yes
# verbosity = 6
# log-color = false
# syslog-host = localhost
# syslog-port = 514
# frame-timeout = 5000
frame-buffers = 2
# zero_copy = yes
# drop-bad-frames = yes
# relaxed-ownership = yes
# extension-presence = no

##################################
# raspicam driver options
##################################

encoding = mjpeg
width = 1024
height = 768
framerate = 3
#custom-sensor-config = 2

### dual camera options:
# stereoscopic-mode = side_by_side
# camera-number = 1
# decimate = yes
# swap-eyes = yes

### still and/or video options:
# quality = 85
# stills-denoise = yes
video-denoise = no
# raw = no

### h264 options:
profile = baseline
# level = 4.2
bitrate = 1000000
# intra-refresh-mode = dummy
# intra-period = #arg
# inline-headers = yes
# sps-timing = no
# quantisation-parameter #arg

### video overlay options:
nopreview = no
fullscreen = no
# osd-layer = 2
# opacity = 255
### preview window <x, y, w, h>:
preview = 480
preview = 240
preview = 320
preview = 240

### post-processing options:
# text-overlay = yes
# text-filename = /usr/share/uv4l/raspicam/text.json
# object-detection = yes
# object-detection-mode = accurate_tracking
# min-object-size = 80
# min-object-size = 80
# main-classifier = /usr/share/uv4l/raspicam/lbpcascade_frontalface.xml
# secondary-classifier =/usr/share/uv4l/raspicam/lbpcascade_frontalface.xml

### image settings options:
# sharpness = 0
# contrast = 0
# brightness = 50
# saturation = 0
# iso = 400
# vstab = yes
# ev = 0
# exposure = auto
# flicker = off
# awb = auto
# imgfx = none
# metering = average
# rotation = 0
# hflip = no
# vflip = no
# shutter-speed = 0
# drc = off
# red-gain = 100
# blue-gain = 100
# text-annotation = HelloWorld!
# text-annotation-background = yes
### ROI <x, y, w, h> normalized to [0, 1]
# roi = 0
# roi = 0
# roi = 1
# roi = 1
### ISP blocks
# black-level-compensation = yes
# lens-shading = yes
# automatic-defective-pixel-correlation = yes
# white-balance-gain = yes
# crosstalk = yes
# gamma = yes
# sharpening = yes

### TC358743 HDMI to MIPI converter options:
# tc358743 = no
# tc358743-i2c-dev = /dev/i2c-1
# tc358743-init-command = /usr/share/uv4l/raspicam/tc358743_init.sh
# tc358743-no-signal-fallthrough = no
# tc358743-edid-file = #path
# record = no
# recording-dir = /usr/share/uv4l/recordings
# recording-bitrate = 800000

### advanced options:
# statistics = yes
# output-buffers = 3

### License Key associated to serial number (from --serial-number):
# license-key = #arg


#################################
# streaming server options
#################################

### path to a separate config file that will be parsed by the streaming server
### module directly when it's loaded,
### in which you are allowed to specify all the streaming server options
### listed below in the short form "option=value" instead of the longer
### "--server-option = --option=value" form that you must use
### in this configuration file.
#server-config-file = #path

server-option = --port=8048
# server-option = --bind-host-address=localhost
# server-option = --md5-passwords=no
# server-option = --user-password=what
# server-option = --admin-password=myp4ssw0rd
### To enable 'config' user authentication
# server-option = --config-password=myp4ssw0rd

### HTTPS options:
# server-option = --use-ssl=yes
# server-option = --ssl-private-key-file=/home/pi/selfsign.key
#server-option = --ssl-certificate-file=/home/pi/selfsign.crt

### WebRTC options:
server-option = --enable-webrtc=yes
server-option = --enable-webrtc-datachannels=no
# server-option = --webrtc-datachannel-label=uv4l
# server-option = --webrtc-datachannel-socket=/tmp/uv4l.socket
# server-option = --webrtc-old-sctp-syntax=true
server-option = --enable-webrtc-video=yes
server-option = --enable-webrtc-audio=yes
server-option = --webrtc-receive-video=no
# server-option = --webrtc-receive-datachannels=no
# server-option = --webrtc-received-datachannel-socket=/tmp/uv4l.socket
server-option = --webrtc-receive-audio=yes
# server-option = --webrtc-received-audio-volume=5.0
server-option = --webrtc-prerenderer-smoothing=no
# server-option = --webrtc-audio-layer=1
# server-option = --webrtc-recdevice-index=0
server-option = --webrtc-vad=yes
server-option = --webrtc-echo-cancellation=no
server-option = --webrtc-preferred-vcodec=0
server-option = --webrtc-enable-hw-codec=yes
# server-option = --webrtc-video-format=60
# server-option = --webrtc-hw-vcodec-minbitrate=800
# server-option = --webrtc-hw-vcodec-maxbitrate=4000
# server-option = --webrtc-hw-vcodec-startbitrate=1200
# server-option = --webrtc-hw-vcodec-intra-period=1800
# server-option = --webrtc-hw-vcodec-sps-pps-idr=yes
# server-option = --webrtc-suspend-below-min-bitrate=no
server-option = --webrtc-max-playout-delay=34
# server-option = --webrtc-cpu-overuse-detection=no
# server-option = --webrtc-combined-audiovideo-bwe=no
# server-option = --webrtc-stun-urls=stun:stun.l.google.com:19302
# server-option = --webrtc-stun-urls # use this for no urls
# server-option = --webrtc-ice-servers=[{"urls": "stun:stun1.example.net"}, {"urls": "turn:turn.example.org", "username": "user", "credential": "myPassword"}]
# server-option = --webrtc-stun-server=yes
# server-option = --webrtc-tcp-candidate-policy=1
# server-option = --webrtc-rtcp-mux-policy=0
# server-option = --webrtc-enable-dscp=no
# server-option = --webrtc-ignore-loopback=yes
# server-option = --webrtc-trickle-ice=yes
# server-option = --webrtc-stats-dir=/usr/share/uv4l/statistics/
### video rendering window positions and sizes on the display.
### for each window, default values can be optionally overridden, but if you
### do this you must specify one line for each of the four x, y, width, height
### window properties (in that order).
### If fullscreen is set the image is stretched to the maximum available display
### resolution from the specified size.
### window 1
# server-option = --webrtc-renderer-window=0
# server-option = --webrtc-renderer-window=0
# server-option = --webrtc-renderer-window=480
# server-option = --webrtc-renderer-window=352
# server-option = --webrtc-renderer-fullscreen=no
# server-option = --webrtc-renderer-rotation=180
# server-option = --webrtc-renderer-opacity=255
### window 2
# server-option = --webrtc-renderer2-window=480
# server-option = --webrtc-renderer2-window=0
# server-option = --webrtc-renderer2-window=320
# server-option = --webrtc-renderer2-window=240
### window 3
# server-option = --webrtc-renderer3-window=0
# server-option = --webrtc-renderer3-window=352
# server-option = --webrtc-renderer3-window=176
# server-option = --webrtc-renderer3-window=128
# if enabled, this overrides the size of the rendering windows:
# server-option = --webrtc-renderer-source-size=no

### XMPP options:
# server-option = --xmpp-server=lambada.jitsi.net
# server-option = --xmpp-port=5222
# server-option = --xmpp-muc-domain=meet.jit.si
# server-option = --xmpp-room=room
# server-option = --xmpp-room-password=room_password
# server-option = --xmpp-username=me
# server-option = --xmpp-password=mypassword
# server-option = --xmpp-reconnect=yes
# server-option = --xmpp-bosh-enable
# server-option = --xmpp-bosh-tls
# server-option = --xmpp-bosh-server
# server-option = --xmpp-bosh-port
# server-option = --xmpp-bosh-hostname
# server-option = --xmpp-bosh-path
# server-option = --xmpp-bridge-host=localhost
# server-option = --xmpp-bridge-port=7999

### Janus WebRTC Gateway options:
# server-option = --janus-gateway-url=https://janus.conf.meetecho.com
# server-option = --janus-gateway-root=/janus
# server-option = --janus-room=1234
# server-option = --janus-room-pin=#pin
# server-option = --janus-username=test
# server-option = --janus-token=#token
# server-option = --janus-proxy-host=#host
# server-option = --janus-proxy-port=80
# server-option = --janus-proxy-username=#user
# server-option = --janus-proxy-password=#password
# server-option = --janus-proxy-bypass=#regex
# server-option = --janus-force-hw-vcodec=no
# server-option = --janus-video-format=#code
# server-option = --janus-publish=yes
# server-option = --janus-subscribe=no
# server-option = --janus-reconnect=yes

### Fine-tuning options:
# server-option = --connection-timeout=15
# server-option = --enable-keepalive=yes
# server-option = --max-keepalive-requests=0
# server-option = --keepalive-timeout=7
# server-option = --max-queued-connections=8
# server-option = --max-streams=3
# server-option = --max-threads=5
# server-option = --thread-idle-time=10
# server-option = --chuncked-transfer-encoding=yes
# server-option = --acao=*

### Advanced options:
# server-option = --frame-timeout=5000
# server-option = --frame-buffers=2

### These options are specific to the HTTP/HTTPS Server
### serving custom Web pages only:
# server-option = --enable-www-server=yes
# server-option = --www-root-path=/usr/share/uv4l/www/
# server-option = --www-index-file=index.html
# server-option = --www-port=80
# server-option = --www-bind-host-address=#host
# server-option = --www-password=#password
# server-option = --www-use-ssl=no
# server-option = --www-ssl-private-key-file=#path
# server-option = --www-ssl-certificate-file=#path
# server-option = --www-connection-timeout=15
# server-option = --www-enable-keepalive=no
# server-option = --www-max-keepalive-requests=0
# server-option = --www-keepalive-timeout=7
# server-option = --www-max-queued-connections=8
# server-option = --www-max-threads=4
# server-option = --www-thread-idle-time=10
# server-option = --www-chuncked-transfer-encoding=no
# server-option = --www-set-etag-header=yes
# server-option = --www-webrtc-signaling-path=/webrtc
# server-option = --www-acao=*

### Other options:
# server-option = --editable-config-file=#path
# server-option = --enable-builtin-ui=yes
# server-option = --enable-control-panel=yes
# server-option = --enable-rest-api=yes

and asound.conf i created to get the audio going

pcm.!default {
    type plug
    slave {
        pcm "hw:1,0"
    }
}

ctl.!default {
    type hw
    card 1
}

Thank you in advance for any help

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.