3+km HD FPV system using commodity hardware


Over the last couple of months I have been working on a project that might be of interest to you: https://befinitiv.wordpress.com/wifibroadcast-analog-like-transmission-of-live-video-data/

Basically it is a digital transmission of video data that mimics the (advantageous) properties of an analog link. Although I use cheap WIFI dongles this is not one of the many "I took a raspberry and transmitted my video over WIFI"-projects.

The difference is that I use the cards in injection mode. This allows to send and receive arbitrary WIFI packets. What advantages does this give?

- No association: A receiver always receives data as long as he is in range

- Unidirectional data flow: Normal WIFI uses acknowledgement frames and thus requires a two-way communication channel. Using my project gives the possibility to have an asymmetrical link (->different antenna types for RX and TX)

- Error tolerant: Normal WIFI throws away erroneous frames although they could have contained usable data. My project uses every data it gets.

For FPV usage this means:

- No stalling image feeds as with the other WIFI FPV projects

- No risk of disassociation (which equals to blindness)

- Graceful degradation of camera image instead of stalling (or worse: disassociation) when you are getting out of range

The project is still beta but already usable. On the TX and RX side you can use any linux machine you like. I use on both sides Raspberrys which works just fine. I also ported the whole stack to Android. If I have bystanders I just give them my tablet for joining the FPV fun :)

Using this system I was able to archive a range of 3km without any antenna tracking stuff. At that distance there was still enough power for some more km. But my line of sight was limited to 3km...

In the end, what does it cost? Not much. You just need:

2x Raspberry A+

2x 8€ wifi dongles

1x Raspberry camera

1x Some kind of cheap display

Happy to hear your thoughts/rebuild reports :)

See you,


You need to be a member of diydrones to add comments!

Join diydrones

Email me when people reply –


      • Developer


        Yes, I used estopwatch.net and then used a camera to take a picture of the original and the FPV screen.  I started taking just 3 pictures for each test but for the last 5 rows or so I took 5 pictures per test.  Sometimes the camera catches one or the other screen just as it's updating and the numbers can't be read.


        By the way Jaime Machuca tells me he's managed to get it working on an odroid using a webcam.  I'm attempting to reproduce with an RPi + webcam.  He says this worked and I'll verify very soon:

        gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=1000 device=/dev/video0 name=src auto-start=true src.vidsrc ! queue ! video/x-h264,width=800,height=448,framerate=30/1 ! h264parse ! fdsink | ./tx -r 2 -f 1024 wlan0

  • Did you get it to work on Linux ?

    I always have the same error on the receiver side :

    DLT_IEEE802_11_RADIO Encap
    Setting pipeline to PAUSED ...
    Pipeline is PREROLLING ...
    /GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:src: caps = video/x-h264, width=(int)1280, height=(int)720, parsed=(boolean)true, stream-format=(string)avc, alignment=(string)au, codec_data=(buffer)01640028ffe1000e27640028ac2b402802dd00f1226a01000528ee025cb0
    ERROR: from element /GstPipeline:pipeline0/GstFdSrc:fdsrc0: Internal data flow error.
    Additional debug info:
    gstbasesrc.c(2865): gst_base_src_loop (): /GstPipeline:pipeline0/GstFdSrc:fdsrc0:
    streaming task paused, reason not-negotiated (-4)
    ERROR: pipeline doesn't want to preroll.
    Setting pipeline to NULL ...
    /GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:src: caps = NULL
    Freeing pipeline ...

    Any idea ?

    • Could you please post the command line?

      • Here it is :

        /usr/bin/sudo /sbin/ifconfig wlan0 down
        /usr/bin/sudo /sbin/iw dev wlan0 set monitor otherbss fcsfail
        /usr/bin/sudo /sbin/ifconfig wlan0 up
        /usr/bin/sudo /sbin/iw reg set BO
        /usr/bin/sudo /sbin/iwconfig wlan0 rate 18M fixed
        /usr/bin/sudo /sbin/iwconfig wlan0 channel 149

        sudo ./rx -b 1 wlan0 | gst-launch-1.0 -v fdsrc ! h264parse ! avdec_h264 ! xvimagesink sync=false

        • Looks like the error is happening right at the start of the pipeline, perhaps try rx -b 8?  Make sure you have the latest version of rx compiled?

        • FYI: I get noticably lower latency with:

          gst-launch-0.10 -v fdsrc ! h264parse ! ffdec_h264 ! xvimagesink sync=false

  • Is it possible to use a smartphone camera module which has built in OIS instead of Pi camera in order to get steadier videos?

    • RPi can already do video stabilization. Use -vs parameter in raspivid.

      • But it is not physical stabilization.

        • The RPi currently supports only one sensor model. Look it up and see if you can find a sensor module with OIS.

This reply was deleted.