Streaming Video With RaspberryPi
Contents
General
Caution: this is a Work in progress, things are being tested. The objective is to provide in the end one or more working solutions for everyone.
Video streaming is a problem
The RaspberryPi camera offers an interesting solution to this problem. It is a very well integrated module of the Pi with one huge advantage: h264 encoding can be performed directly by the CPU as the camera uses the Serial Camera Interface protocol.
So theorically, solving the video problem with the Pi is easy but there are many subtle problems.
Problems
Audio As we use video webstreaming mostly for conferences broadcasting, good audio quality is necessary.
Slides It would be interesting to include slides of conferences while filming.
File It is important to have a file at the end of the filming.
Web It is important to have a large viewer base, therefore a well supported format.
Raspicam basics
http://elinux.org/Rpi_Camera_Module
raspivid is the basic command line used to capture video in h264.
raspivid -t 3 -fps 25 -b 1000k -w 1920 -h 1080 -o /tmp/video.h264
A very simple tutorial : http://www.raspberrypi-spy.co.uk/2013/05/capturing-hd-video-with-the-pi-camera-module/
Solution
Solution 1 : OGG/VORBIS + Icecast
Basic idea use the PI to capture MP4, stream it locally to a laptop. Merge audio in the laptop with ffmpeg and push the resulting ogg/vorbis stream to an icecast server.
CON Mandatory local network between pi and laptop for socket,
PRO Icecast is simple, open, and handles authentification. The file is saved on the server. Vorbis is HTML5 compatible.
Sources
http://sirlagz.net/2013/01/07/how-to-stream-a-webcam-from-the-raspberry-pi-part-3/
POC
A. Compile FFMPEG on pi & server
B. Start capture in a screen
# [ -d /tmp/capture ] || mkdir /tmp/capture; rm -f /tmp/capture/* && cd /tmp/capture/ && \
raspivid -ih -h 320 -w 480 -t 0 -o - | /usr/local/bin/ffmpeg -f alsa -ac 1 -itsoffset 6.5 -i hw:1 -acodec aac -strict -2 -i -\
-vcodec copy -f segment -segment_list out.list -segment_list_flags +live -segment_time 3 -segment_time_delta 2 %4d.ts
C. Run rsync to server in a screen
while true; do rsync -a /tmp/capture user@server:/tmp/; sleep 1; done
D. Broadcast from server to icecast
This requires
- a PHP streamer for your incoming files : http://pastebin.com/3f5t9vDS
- the oggfwd command line tool
php /usr/local/bin/stream.php | ffmpeg -i - -f ogg - | oggfwd -p -n "Test" stream.server.com 8000 mySecretIceCastStreamingPassword /test
Solution 2 : FLVSTR + PHP Streamer
Basic idea the Octopuce company has a solution to convert live MP4 to F4V. With an USB audio card, we could mux the MP4 and AAC audio and have a standalone solution.
CON authentification is hard, F4V means Flash, requires an USB disk for local backup
PRO the pi can be autonomous
First, authentification. This problem is adressed by solving encryption as well: we use an SSL socket to communicate with the server.
Solution 3 : RTSP
Basic idea Use an RTSP stream with VLC and the V4L driver
CON Non commercial RTSP server are not the norm, requires VLC or Flash player, Quality with v4l is low
PRO Easy to work out
Sources
http://www.ics.com/blog/raspberry-pi-camera-module#.VJFhbyvF-b8
http://ffmpeg.gusari.org/viewtopic.php?f=16&t=1130
Solution 4 : HLS + RSYNC
Basic idea Use HLS segmentation and rsync
CON Not all web players can do HLS
PRO Almost out of the box, robust
Howto
1. Compile fresh ffmpeg on the pi
2. Run a capture : raspivid -t 0 -b 1000000 -w 1080 -h 720 -v -o - | ffmpeg -i - -f alsa -ac 1 -itsoffset 6.5 -i hw:1 -acodec aac -strict -2 -vcodec copy out.m3u8
3. Run a cron rsync to server (todo)
4. Connect a client (todo)
Sources
http://www.ffmpeg.org/ffmpeg-formats.html#hls
FFMPEG compilation
This installation is debian based. Some packages are included by default :
- ffmpeg : Provides a large number of the dependencies required at compilation tim
- yasm : modular assembler (good for compilation)
- pkg-config : info about installed libraries (good for compilation)
- screen : helpful for running compilation in background
For Raspberry
For the Raspberry, we only need the support of x264 and ALSA
sudo -s aptitude install screen yasl libx264-dev libasound2-dev ffmpeg cd /usr/src git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure --enable-gpl --enable-libx264 make make install
= For laptop or server
Your default debian might come with sufficent support but if you want total control, compiling is a good idea.
Remove packages and ffmpeg support if you don't need everything. Ex: For ogg, only libtheora-dev and --enable-libtheora should be necessary
sudo aptitude update && aptitude install screen pkg-config yasm ffmpeg libass-dev libavcodec-extra libfdk-aac-dev libmp3lame-dev libopus-dev libtheora-dev libvorbis-dev libvpx-dev libx264-dev cd /usr/src git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab make make install
References
http://techzany.com/2013/09/live-streaming-video-using-avconv-and-a-raspberry-pi/
https://trac.ffmpeg.org/wiki/StreamingGuide
Node
http://phoboslab.org/log/2013/09/html5-live-video-streaming-via-websockets
https://github.com/fluent-ffmpeg/node-fluent-ffmpeg
http://ffmpeg.org/ffmpeg-all.html#segment_002c-stream_005fsegment_002c-ssegment