I did a bit of research around video streaming on the pi and there seem to be several methods used including using VLC or netcat or various other methods but they all seemed to be a little bit high latency and as we are going to be doing live video to a screen we want to keep that down so I went with Gstreamer.
The first page I came across seemed to be ideal : http://pi.gbaman.info/?p=150 and this got me up and going but I ran into issues with the sending and listening commands. http://blog.tkjelectronics.dk/2013/06/how-to-stream-video-and-audio-from-a-raspberry-pi-with-no-latency/ helped with sending but as the commands on both pages were for listening using a Mac I was out of luck. After a quick poke around mailing lists and google fu I have now got it up and running.
So after setting up the environment as described in either of the above I have been using the following commands. I am not a gstreamer scientist and there are probably much better ways of doing it but this seems to be working here.
Sending Pi (pivate-eye) note you will have to change the IP address
raspivid -t 999999 -w 1080 -h 720 -fps 25 -hf -b 2000000 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=10.42.0.112 port=5000
10.42.0.112 is the address of the sending pi.
On the listening pi (pi-tv) watch out for the ip address in it
gst-launch-1.0 -v tcpclientsrc host=10.42.0.112 port=5000 ! gdpdepay ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! autovideosink sync=false
I have done some quick tests as to the latency of the video link and how it changes with resolution. These are only very quick tests so may not be that accurate. The methodology was to put a stopwatch on screen, stream the screen via the webcam with both the onscreen clock and the video playback of the clock visible then to take a picture using a digital camera and then just subtract the differences between the clocks.
320 x 240 = 176 ms
640 x 480 = 137 ms
800 x 600 = 325 ms
As you can see this doesn’t quite look right but it was just a quick test just to get some ballpark figures. I have also not run multiple tests over time to see if there is drift in the lag so there is a lot more work required here. Oh and also there is a good chance that my gstreamer commands could be optimised and improved.
Also can I just say a big thanks to Odie_ on #raspberrypi on Freenode who correctly spotted I hadn’t checked my camera when I couldn’t get it working and suggested the latency methodology and generally kept prodding me until I got it working and documented on the net
I was asked by the nice folk at Red Spider Hire if I fancied going up in one of their fantastic machines to take some pictures at the village show. I was totally up for this until I realised it clashed with the date of a friends birthday party. Something needed to be done.
So I decided to replace myself with a couple of Raspberry Pi machines
Get the first Pi (pivite-eye) with the CSI Raspberry Pi camera to stream live video to the second Pi (pi-tv) where it will be displayed on a monitor or projector or something. Pi-TV and Pivate-eye will communicate over wifi provided by a MiFi wireless 3G access point. This will also allow Pi-TV to take screenshots and post them to twitter etc and any other sillyness.
- Getting it to work!
- Video resolution vs latency
- Video resolution vs bandwidth
- Automating the setup so it can be setup or reset without my intervention.
- Automating video snapshotting
- Automating twitter posting
Oh the bundle of joy this was….
To build 32 bit serves on a 64 bit machine you need to run the following
apt-get install libc6-i386 libc6-dev-i386 lib32gcc1 libstdc++6 libstdc++6-4.4-dev g++-multilib gcc-multilib
CC=”gcc-4.4 -m32″ CXX=’g++ -m32′ LDFLAGS=”-m32 -L/lib32 -L/usr/lib32 -Wl,-rpath,/lib32 -Wl,-rpath,/usr/lib32″ ./configure –v
ln -s /usr/local/lib/libxerces-c-3.1.so /usr/lib32/libxerces-c-3.1.so
Hope this helps someone
Oh install readelf so you can run
readelf -h /usr/lib32/libxerces-c-3.1.so
To check it has compiled as 32 bit
When trying to reinstall .NET 2 after a failed install/reinstall you may get this message.
error 25007. Error occurred while initializing fusion. Setup could not load fusion with LoadLibraryShim(). Error: 0×80131700
You will also go and do all sorts of stuff to get it working. What they don’t tell you is:
UNINSTALL .NET 4 TOO AND REBOOT BEFORE REINSTALLING….
I thought it would be nice for the village to have a website, so it has
Anyone wanting to help out is welcome, no web skills needed
tig rating: meh
What strange weather for the time of year….