[FFmpeg-user] Flush & Latency Issue with Fragmented MP4 Creation

Gal Bar Mashiah galbarm at gmail.com
Tue Jun 16 15:16:35 CEST 2015


Hello,
I'm creating a fragmented mp4 for html5 streaming, using the following
command:
-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1
-movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet -

1. "-i rtsp://172.20.28.52:554/h264" because the source is h264 in rtp
packets stream from an ip camera.
For the sake of testing, the camera is set with GOP of 1 (i.e. all frames
are key frames)
2. "-vcodec copy" because I don't need transcoding, only remuxing to mp4.
3. "-movflags empty_moov+default_base_moof+frag_keyframe" to create a
fragmented mp4 according to the media source extensions spec.
4. "-" at the end in order to output the mp4 to stdout. I'm grabbing the
ouput and sending it to the webclient through web sockets.

Everything is working well, expect for a latency issue which I'm trying to
solve.
If I'm logging every time a data is coming in from stdout, with the
timestamp of arrival, I get this output:
16/06/2015 15:40:45.239 got data size = 24
16/06/2015 15:40:45.240 got data size = 7197
16/06/2015 15:40:45.241 got data size = 32768
16/06/2015 15:40:45.241 got data size = 4941
16/06/2015 15:40:45.241 got data size = 12606
16/06/2015 15:40:45.241 got data size = 6345
16/06/2015 15:40:45.241 got data size = 6339
16/06/2015 15:40:45.242 got data size = 6336
16/06/2015 15:40:45.242 got data size = 6361
16/06/2015 15:40:45.242 got data size = 6337
16/06/2015 15:40:45.242 got data size = 6331
16/06/2015 15:40:45.242 got data size = 6359
16/06/2015 15:40:45.243 got data size = 6346
16/06/2015 15:40:45.243 got data size = 6336
16/06/2015 15:40:45.243 got data size = 6338
16/06/2015 15:40:45.243 got data size = 6357
16/06/2015 15:40:45.243 got data size = 6357
16/06/2015 15:40:45.243 got data size = 6322
16/06/2015 15:40:45.243 got data size = 6359
16/06/2015 15:40:45.244 got data size = 6349
16/06/2015 15:40:45.244 got data size = 6353
16/06/2015 15:40:45.244 got data size = 6382
16/06/2015 15:40:45.244 got data size = 6403
16/06/2015 15:40:45.304 got data size = 6393
16/06/2015 15:40:45.371 got data size = 6372
16/06/2015 15:40:45.437 got data size = 6345
16/06/2015 15:40:45.504 got data size = 6352
16/06/2015 15:40:45.571 got data size = 6340
16/06/2015 15:40:45.637 got data size = 6331
16/06/2015 15:40:45.704 got data size = 6326
16/06/2015 15:40:45.771 got data size = 6360
16/06/2015 15:40:45.838 got data size = 6294
16/06/2015 15:40:45.904 got data size = 6328
16/06/2015 15:40:45.971 got data size = 6326
16/06/2015 15:40:46.038 got data size = 6326
16/06/2015 15:40:46.105 got data size = 6340
16/06/2015 15:40:46.171 got data size = 6341
16/06/2015 15:40:46.238 got data size = 6332

As you can see, the first 23 lines (which contain data of about 1.5 secs of
video) are arriving almost instantly, and then the delay between each 2
consecutive lines is ~70ms which makes sense because the video is 15 frames
per sec.
This behavior introduces a latency of about 1.5 sec.

It looks like a flushing issue because I don't see any reason why would
ffmpeg need to hold the first 23 frames in memory, especially since each
frame is a fragment of it's own inside the mp4.
I couldn't however, find any method that would cause ffmpeg to flush this
data faster.

Has anyone got a suggestion?


More information about the ffmpeg-user mailing list