[FFmpeg-user] Ultra-low latency streaming

Federico Salvioli raveningrocks at hotmail.com
Mon Feb 8 14:58:31 CET 2016


Dear all,

     First of all, I would like to thank you all the developers as even if I
am no expert in FFmpeg I have been using it for numerous applications and
your tool is really awesome! Thanks guys.

 

Some time ago I have been asked to setup a streaming server with the lowest
amount of latency possible from a Firewire camera to another computer. The
video feedback is used for teleoperation so the stream has soft real-time
requirements. I have crawled the internet for a while and I saw various
posts on this topic but sometimes maybe too old to be useful or sometimes a
bit generic. I collected and reviewed the following:

 

http://fomori.org/blog/?p=1213-This guy has an interesting article, I will
have a trial to reproduce some of his results.

https://trac.ffmpeg.org/wiki/StreamingGuide

http://ffmpeg.gusari.org/viewtopic.php?f=11
<http://ffmpeg.gusari.org/viewtopic.php?f=11&t=2002> &t=2002

and some others.

 

I ended up setting up a system which looks like the following.

 

  ------------  firewire -----------------------  pipe  -----------  .ffm
------------   rtsp    --------------------

| Camera  |   ==>    |  frame grabber |   => | ffmpeg | => | ffserver |   =>
| ffmpeg/ffplay |

  ------------                 -----------------------
------------         ------------               --------------------

 

I was unable to use the libdc1394 format to capture the feed from the camera
so I used a previously written program to grab the frames and then pipe the
raw yuv420p frames to ffmpeg.

With this setup I managed to obtain around 3 seconds of latency. It is
acceptable as the teleoperation happens not at a very low level but I would
like to reach sub-second latencies. The priority should be given to latency
and after to bandwidth as normally the streams travels on wifi LAN.

 

FFmpeg is launched with this command:

 

ffmpeg -hide_banner -f rawvideo -pixel_format gray -video_size 1280x960
-framerate 5 -i - -an http://localhost:8080/stream.ffm

 

and FFserver:

 

<Feed stream.ffm>

      File /tmp/stream.ffm

      FileMaxSize 200K

      ACL allow 192.168.0.0 192.168.255.255

</Feed>

 

<Stream XB3-240.h264>

      Feed stream.ffm

      Format rtp

      

      VideoCodec libx264

      PixelFormat yuv420p

      VideoFrameRate 4

      VideoSize 320x240

      

      AVOptionVideo crf 23

      AVOptionVideo profile baseline

 

      #VideoIntraOnly

      VideoGopSize 8

      

      NoAudio

      AVOptionAudio flags +global_header

</Stream>

 


 

A few questions:

-          I was unable to find out how to measure latency in every stage of
the stream, is there a clever method to do it different from quick and dirty
solutions as shown in the first link <http://fomori.org/blog/?p=1213> ? 

-          May you be able to suggest how to reduce latency as much as
possible at OS and ffmpeg/ffserver and network level.

-          I would like to stick to H264 but other option may be evaluated
in case they may bring much better results.

 

Thanks in advance for any help,

 

Best regards,

Federico Salvioli.

 

 

 



More information about the ffmpeg-user mailing list