Video streaming benchmark with ffmpeg, ffserver, wowza...

I had a chance for deep research and test of video/audio streaming techniques. My testing stack is based on Wowza which worked good enough for simple solutions. I have decided to extend that model so there was a need to research much deeper for techniques and find out the cutting-edge technology of this days...

I started with as basic as possible tooling. Ffmpeg, ffserver, ffplay combined with NTP (Network Time Protocol) is actually a very powerful toolset. I decided to go with AWS using 2 regions. North Virginia (US) for server instance and Ireland (EU) for clients.

The workflow looks like follows:

So the test is basically about transatlantic streaming of video via ffmpeg/ffserver pipes which add the timestamps on the way. It helps for pretty accurate calculation of network latency which is introduced on each stage. Some of timestamp are introduced for calculating the computation offset and to compensate this delay in final result.

Sample and network latency estimation

The calculations (using last 5 digits XXX.XX)
T1 = 697.96
T2 = 698.86
T3 = 700.18


Point_To_Point_Time = T3-T2 - (T2-T1) = 420ms


The best result I could currently achieve was 200ms. This is pretty good achievement, considering transatlantic delay which is ~75ms and the cloud computation delay...

Streamer command

ffmpeg -i your-file.mp4 -tune zerolatency -filter:v "setpts=1.0*PTS" -f nut pipe:1 \\
| ffmpeg -re -i pipe:0 -vf "drawtext=expansion=normal:fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:reload=1:textfile=test.txt: x=50: y=50: fontcolor=white" -tune zerolatency -f nut pipe:1 \\
| ffmpeg -y -i pipe:0 -tune zerolatency http://ffserver-ip:7000/feed1.ffm

Player commands

ffmpeg -rtsp_transport tcp -i rtsp://ffserver-ip:8544/live.mp4  -tune zerolatency -vf "drawtext=expansion=normal:fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf:reload=1:textfile=test.txt: x=50: y=70: fontcolor=white" output.mp4

Server configuration you can find here

The Timestamp which is drawn on the each frame is read from file test.txt. This file is updated by external python process using script you can find here as well.

I deployed the infrastructure using Terraform but obviously this is not the important part. You can use any deployment tool or even do it manually.

Wowza approach (draft)

This is draft of upcoming test. Will elaborate in next blogpost...

Hope this is helpful for you. Good luck!


Related posts

VideoChat in Terminal

Absolutely awesome application for P2P Video Chat, written in C++. Check it out on Github This is easy to compile on OSX and to start video chat in less than minute. Please follow instructions of github readme. Have fun!

Extending Puppetmaster module with Passenger

If you manage large farm of servers then most probably you experienced performance problems time to time. To solve puppetmaster problems with handling many of concurrent SSL connections the best solution is switch from WEBrick to Apache2 as gateway for…