Opened 11 years ago

Closed 11 years ago

#1788 closed defect (duplicate)

setting the output frame rate of image outputs

Reported by: burek Owned by:
Priority: normal Component: ffmpeg
Version: git-master Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: yes

Description

I'm not sure if this is a bug or not, since I was suggested that ffmpeg is not designed to be used in such way, but I can surely ask anyway :)

Summary of the bug:
Trying to extract 1 frame each 5 seconds of the video input to an image output, by setting the output frame rate to 1/5 produces the expected result but with the first 3 output frames failed (not correctly timed).

How to reproduce:

ffmpeg -f lavfi -i testsrc -t 60 -f image2 -r 1/5 img%02d.bmp
ffmpeg -f lavfi -i testsrc -t 60 -f image2 -r 1/5 img%02d.jpg
ffmpeg -f lavfi -i testsrc -t 60 -f image2 -r 1/5 img%02d.png

All of the commands above will produce first 3 output image frames wrong, but all the other frames will be correctly created, meaning that img01.*, img02.* and img03.* will be wrong and img04.*, img05.*, ... will be correct. The time difference between frames is correct only the starting time point is wrong, I guess due to those first 3 frames not being created properly.

Change History (2)

comment:1 by Cigaes, 11 years ago

Analyzed by developer: set
Component: undeterminedFFmpeg
Reproduced by developer: set
Status: newopen
Version: unspecifiedgit-master

This is related to the rounding heuristics for the video sync implementation in ffmpeg.c:

        // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
        if (delta < -1.1)
            nb_frames = 0;

In this code, delta is the difference between the current time on the stream and the time of the incoming frame. If no frame rate adjustment is necessary, it is always 1. Theoretically, the frame should be dropped as soon as it is less than 1, but as you can see, the current code gives it a little head start.

Replacing -1.1 by 1 fixes your problem but breaks a lot of FATE tests. I do not know that part of the code enough to determine whether changing it would be correct.

In the meantime, you can use the fps filter: -vf fps=fps=1/5 (or possibly -vf fps=fps=1/5:round=down with a patch I just sent).

comment:2 by Carl Eugen Hoyos, 11 years ago

Resolution: duplicate
Status: openclosed

Duplicate of ticket #1578.

Note: See TracTickets for help on using tickets.