|
|
| (One intermediate revision by one other user not shown) |
| Line 1: |
Line 1: |
| − | You can browse a better looking version of this how-to at: http://luxigo.tiddlyspot.com/#%5B%5BElphel%20Camera%20Remote%20Audio%20HOW-TO%5D%5D
| + | Here is a simple gst-pipeline to record camera live stream and PC's default audio input to a Theora / Vorbis OGG file: |
| | | | |
| − | <pre>
| + | gst-launch-0.10 -e -m rtspsrc location=rtsp://192.168.0.9:554 latency=40 ! rtpjpegdepay ! queue \ |
| − | ----------------------------------------------------------------------------
| + | ! jpegdec ! queue ! theoraenc quality=60 name=venc pulsesrc ! audio/x-raw-int,rate=16000,channels=1,depth=16 \ |
| − | HOW TO ADD AUDIO TO YOUR ELPHEL CAMERA VIDEO STREAM USING GSTREAMER:
| + | ! audioconvert ! queue ! vorbisenc quality=0.9 name=aenc oggmux name=mux ! filesink location=test.ogg aenc. \ |
| − | ----------------------------------------------------------------------------
| + | ! mux. venc. ! mux. |
| − | | |
| − | In two words and three lines we have to:
| |
| − | | |
| − | - demultiplex (demux) the incoming ogg stream to read the mjpeg stream,
| |
| − | - grab the sound from an audio source,
| |
| − | - multiplex (mux) the mjpeg and the audio streams into an ogg container.
| |
| − | | |
| − | Paste the script below in a new file or download the full version here,
| |
| − | change the settings, save it as "soundmux.sh", and make it executable with:
| |
| − | | |
| − | chmod +x soundmux.sh
| |
| − | | |
| − | then run it with:
| |
| − | | |
| − | ElphelOgm | soundmux.sh
| |
| − | | |
| − | | |
| − | Simplified soundmux.sh: (download the full version here: http://luxigo.ath.cx/elphel/gstreamer/soundmux.sh)
| |
| − |
| |
| − | #!/bin/sh
| |
| − | | |
| − | # audio settings
| |
| − | AUDIO_DEVICE="hw:0,0"
| |
| − | AUDIO_BITRATE=48000
| |
| − | | |
| − | # output file name
| |
| − | OUTFILE="out.ogg"
| |
| − | | |
| − | DEBUG="-v -m"
| |
| − | | |
| − | gst-launch-0.10 $DEBUG \ | |
| − | \
| |
| − | oggmux name=mux \
| |
| − | ! filesink location="$OUTFILE" \
| |
| − | \
| |
| − | fdsrc fd=0 \
| |
| − | ! queue \
| |
| − | ! oggparse \
| |
| − | ! oggdemux \
| |
| − | ! ogmvideoparse \
| |
| − | ! mux. \
| |
| − | \
| |
| − | alsasrc \
| |
| − | device="$AUDIO_DEVICE" \
| |
| − | ! queue \
| |
| − | ! audioconvert \
| |
| − | ! vorbisenc bitrate=$AUDIO_BITRATE \
| |
| − | ! mux.
| |
| − | | |
| − | # Description of the gst-launch command above:
| |
| − | | |
| − | # - the muxed stream (the output from the oggmux element) will be
| |
| − | # stored in a file (filesink) | |
| − | | |
| − | # - The video comes from ElphelOgm through stdin (fdsrc fd=0).
| |
| − | # - The ogg stream is parsed for security (optional?) and demuxed.
| |
| − | # - The ogmvideo stream is also parsed for security (optional?).
| |
| − | # - The resulting mjpeg stream is sent to the ogg muxer through the
| |
| − | # "mux." element (defined with "oggmux name=mux").
| |
| − | # (This syntax could also be used for oggdemux but here there's only
| |
| − | # a single stream in the incoming ogg container so we dont need to
| |
| − | # complicate things here)
| |
| − | | |
| − | # - The sound comes from an alsa device through alsasrc,
| |
| − | # - The sound is converted in a suitable format then encoded in vorbis,
| |
| − | # before being muxed with the video stream.
| |
| − | | |
| − | ----------------------------------------------------------------------------
| |
| − | BROADCAST THE VIDEO MULTIPLEXED WITH AUDIO USING ICECAST 2
| |
| − | ----------------------------------------------------------------------------
| |
| − | In the same time you add audio, you can resize and transcode the video stream
| |
| − | in theora in order to broadcast the resulting stream on your icecast server
| |
| − | (if your machine can handle the frame size at the given framerate).
| |
| − | | |
| − | Paste the script below in a new file or download the full version here,
| |
| − | change the default settings if required, then save it as "oggmicecast.sh"
| |
| − | and make it executable with:
| |
| − | | |
| − | chmod +x oggmicecast.sh
| |
| − | | |
| − | Then run it with:
| |
| − | | |
| − | ElphelOgm | oggmicecast.sh
| |
| − | | |
| − | Finally you can use mplayer to watch the stream:
| |
| − | | |
| − | gmplayer http://icecast:8000/elphel.ogg.m3u
| |
| − | | |
| − | | |
| − | Simplified oggmicecast.sh: (download the full version here:http://luxigo.ath.cx/elphel/gstreamer/oggmicecast.sh)
| |
| − | | |
| − | #!/bin/sh
| |
| − | | |
| − | # video settings
| |
| − | VIDEO_QUALITY=51 # between 0 and 63 (51 is ~80%)
| |
| − | WIDTH=480 # 4/3: ... 512x384, 480x360, 353x264, ...
| |
| − | HEIGHT=360 # 16/9: ... 640x360, 512x288, 384x216, ...
| |
| − | | |
| − | # audio settings
| |
| − | AUDIO_BITRATE=48000 # ..., 32000, 48000, 64000, ...
| |
| − | AUDIO_DEVICE="hw:0,0" # ALSA notation
| |
| − | | |
| − | # icecast settings
| |
| − | ICECAST_SERVER=icecast
| |
| − | ICECAST_SERVER_PORT=8000
| |
| − | ICECAST_SERVER_PW="hackme"
| |
| − | ICECAST_STREAMNAME="Elphel Camera"
| |
| − | ICECAST_MOUNTPOINT="/elphel.ogg"
| |
| − | DEBUG="-v -m"
| |
| − | | |
| − | # starting gstreamer
| |
| − | | |
| − | gst-launch-0.10 $DEBUG \
| |
| − | \
| |
| − | oggmux name=mux \
| |
| − | ! queue \
| |
| − | ! shout2send \
| |
| − | ip=$ICECAST_SERVER \
| |
| − | port=$ICECAST_SERVER_PORT \
| |
| − | password="$ICECAST_SERVER_PW" \
| |
| − | streamname="$ICECAST_STREAMNAME" \
| |
| − | protocol=3 \
| |
| − | sync=true \
| |
| − | mount="$ICECAST_MOUNTPOINT" \
| |
| − | \ | |
| − | fdsrc fd=0 \
| |
| − | ! queue \
| |
| − | ! oggdemux \
| |
| − | ! ogmvideoparse \
| |
| − | ! jpegdec \
| |
| − | ! queue \
| |
| − | ! videoscale \
| |
| − | method=1 ! video/x-raw-yuv,width=$WIDTH height=$HEIGHT \
| |
| − | ! theoraenc quality=$VIDEO_QUALITY \
| |
| − | ! mux. \
| |
| − | \
| |
| − | alsasrc \
| |
| − | device="$AUDIO_DEVICE" \
| |
| − | ! audioconvert \
| |
| − | ! vorbisenc bitrate=$AUDIO_BITRATE \
| |
| − | ! mux.
| |
| − | | |
| − | ----------------------------------------------------------------------------
| |
| − | REMOTE MICROPHONE:
| |
| − | ----------------------------------------------------------------------------
| |
| − | The microphone can be located on another machine, far from the camera.
| |
| − | Replace the "alsasrc" paragraph in oggmicecast.sh on the server with:
| |
| − | | |
| − | tcpserversrc \
| |
| − | host=local_interface_ip \
| |
| − | port=9003 \
| |
| − | protocol=1 \
| |
| − | ! mux.
| |
| − | | |
| − | and run the script below (micsend.sh) on the client machine where you
| |
| − | plugged the microphone, giving the ip you set for the tcpserversrc host
| |
| − | on the other side as last argument:
| |
| − | | |
| − | micsend.sh <hostname>
| |
| − | | |
| − | | |
| − | Simplified micsend.sh: (download the full version here:http://luxigo.ath.cx/elphel/gstreamer/micsend.sh)
| |
| − | | |
| − | # audio settings
| |
| − | AUDIO_DEVICE="hw:0,0"
| |
| − | AUDIO_BITRATE=48000
| |
| − | | |
| − | # network settings
| |
| − | TCP_SERVER_PORT=9003
| |
| − | TCP_SERVER=host_running_oggmicecast
| |
| − | | |
| − | DEBUG="-v -m"
| |
| − | | |
| − | gst-launch-0.10 $DEBUG \
| |
| − | \ | |
| − | alsasrc \
| |
| − | device=$AUDIO_DEVICE \
| |
| − | ! audioconvert \
| |
| − | ! queue \
| |
| − | ! vorbisenc bitrate=$AUDIO_BITRATE \
| |
| − | ! tcpclientsink \
| |
| − | host=$TCP_SERVER \
| |
| − | port=$TCP_SERVER_PORT \
| |
| − | max-lateness=150000000 \
| |
| − | sync=true \
| |
| − | protocol=1
| |
| − | | |
| − | | |
| − | ----------------------------------------------------------------------------
| |
| − | GSTREAMER HINTS:
| |
| − | ----------------------------------------------------------------------------
| |
| − | - Use "!" pipe the output from the previous gstreamer element in the next one. | |
| − | | |
| − | - Try "gst-inspect-0.10" to list available gst-launch elements (commands)
| |
| − | and "gst-inspect-0.10 <command>" to display syntax details for a single
| |
| − | command.
| |
| − | | |
| − | - An empty line in the formatted gst-launch command line layout used in this
| |
| − | page denotes a distinct pipe.
| |
| − | | |
| − | ----------------------------------------------------------------------------
| |
| − | KNOWN PROBLEMS:
| |
| − | ----------------------------------------------------------------------------
| |
| − | Trying to use a different thread to recompress video (using gst-launch
| |
| − | brace syntax), we were not able to synchronize audio with video.
| |
| − | | |
| − | Using ElphelOgm-0.9.7 in unicast mode and gstreamer-0.10, we experienced
| |
| − | systematic crash in oggdemux (but i cant say for sure it never worked in
| |
| − | the past or if it is an ElphelOgm encapsulation problem or a gstreamer
| |
| − | oggdemux problem).
| |
| − | | |
| − | So actually we are using ElphelOgm 0.9.9 in multicast mode, but..
| |
| − | | |
| − | Using ElphelOgm in multicast mode, icecast server 2.3.1, and finally
| |
| − | vlc 0.8.6 to watch the stream from the icecast server, we experienced
| |
| − | image freeze in vlc after some time of playback, with all subsequent
| |
| − | frames dropped. It was not the case using ElphelOgm-0.9.7 in unicast mode.
| |
| − | (maybe vlc had problems decoding theora because the network was overloaded
| |
| − | by many other streams and some packets were lost)
| |
| − | | |
| − | However MPlayer1.0rc1-0ubuntu9 did play the same stream through the same
| |
| − | overloaded switch without any problem ;)
| |
| − | | |
| − | Maybe you must recompile your icecast server so that it supports theora:
| |
| − | Try "ldd /usr/bin/icecast" (/usr/bin/icecast2 in ubuntu) to see if yours
| |
| − | is compiled with theora support enabled.
| |
| − | | |
| − | ----------------------------------------------------------------------------
| |
| − | LINKS:
| |
| − | ----------------------------------------------------------------------------
| |
| − | http://gstreamer.freedesktop.org/ (see GSTREAMER HINTS)
| |
| − | http://www.icecast.org/
| |
| − | http://www.mplayerhq.hu/
| |
| − | http://www.videolan.org/ (see KNOWN PROBLEMS)
| |
| − | </pre>
| |