[FFmpeg-user] Recorded Frame Timestamps are Inconsistent! How to Fix it?

Hassan hassaniqbal931 at gmail.com
Sun Mar 21 19:31:01 EET 2021


So I have modified to recording resolution and applied the offset to
capture only the area of interest. It speeds up the capturing of timestamps
and I am getting a timestamp on each frame at an interval of (14ms to
18ms). Which is close to ideal 16.6msec for 60 FPS recording, yet not
accurate enough. Following is the command.

ffmpeg -f gdigrab -framerate 60 -offset_x 550 -offset_y 350 -video_size
640x480 -thread_queue_size 1024 -i desktop  -vf "settb=AVTB,
setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',
drawtext=fontfile=ArialBold.ttf:fontsize=30:fontcolor=white:text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}.%{n}:fontsize=30:r=60:x=(w-tw)/2:
y=h-(2*lh):box=1:boxborderw=20:boxcolor=black at 1.0:x=10:y=10'" -c:v
libx264rgb -crf 0 -preset ultrafast ./test_SD_1.mkv

@Marton: Could you please see the above command and let me know how to add
-copyts opinion? Also, when you mentioned the use of '%{pts\:localtime}'
variable expansion, it gives an error of Unterminated %{} near '{pts'. Can
you please help fix the above command?

@Mark: I have tried to modify the setts and setpts options. Below is the
command:
ffmpeg -f gdigrab -framerate 60 -offset_x 550 -offset_y 350 -video_size
640x480 -thread_queue_size 1024 -i desktop -vf "settb=expr=1/720000,
setpts=N*12000,fps=60,
drawtext=fontfile=ArialBold.ttf:fontsize=40:fontcolor=white:text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d}:box=1:boxborderw=20:boxcolor=black at 1.0:x=10:y=10'"
-c:v libx264rgb -crf 0 -preset ultrafast ./test_SD_1.mkv
However, the seconds never increment and the milliseconds loop in three
values 0,333,666. Have a set anything incorrect in the command?.


I have another challenge. I want to record at FPs higher than 60 FPS, i.e.,
120 FPS. For that, i set -framerate 120 and in -vf, I set r=120. However,
the recording that I get is just 60 FPS. Is it because my LCD has a refresh
rate of 60hz? Or FFmpeg is not concerned about LCD hardware? How can I
record at 120 FPS?

Another question is regarding the working of FFmpeg. Suppose, I am
capturing a video from a desktop that is playing at 60 FPS. My frame rate
for capturing is also set at 60 FPS. Is it likely that a frame of video
appears on LCD and the ffmpeg captures it at a delta of almost a full
frame, i.e., ~16. mec ? If so, then isn't recording a 60 FPS video with
-framerate 60 an incorrect choice?



On Mon, Mar 15, 2021 at 10:52 PM Mark Filipak (ffmpeg) <markfilipak at bog.us>
wrote:

> On 2021-03-15 13:43, Hassan wrote:
> > Hello,
> >
> > I am using ffmpeg on a Windows 10 machine and I want to record the
> desktop
> > at a high frame rate while appending accurate timestamps to each frame.
> > I am recording my desktop using the following command:
> >
> > ffmpeg -f gdigrab -framerate 60 -i desktop -vf "settb=AVTB,
> > setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',
> >
> drawtext=fontfile=ArialBold.ttf:fontsize=40:fontcolor=white:text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d}:box=1:boxborderw=20:boxcolor=black at 1.0
> :x=10:y=10'"
> > -c:v libx264rgb -crf 0 -preset ultrafast output.mkv
> >
> > The long text next to -vf flag is used to append timestamp (date and
> > current time in milliseconds) on the top left corner of the frame with
> > black background.
> >
> > The issue is that, ideally, when I am recording at 60 FPS, each
> subsequent
> > frame should have a timestamp with an increment of 16.66 msec. However,
> the
> > timestamp is not incremented as such. Instead, it stays the same on a lot
> > of frames and then changes.
> >
> > For example, when I break the video into frames, the frame titled
> > "img0428.png" has the timestamp 18:44:16.828 (hh:mm:ss.millisec)
> > [image: image.png].
> > Then until "next 40 frames, it says the same. On file "img0469.png", the
> > timestamp changes and becomes 18:44:17.510.
> > [image: image.png]
> > So, the timestamp changed after 41 frames and the time difference is 682
> > milliseconds. Ideally, each of the 40 frames between these two frames
> > should carry an incremental timestamp by a step size of 16.66 msec but
> this
> > is not happening.
>
> Hello Hassan,
>
> I don't know anything about 'gdigrab' but I have a lot of experience with
> frame rate manipulation.
>
> "I am recording at 60 FPS..."
> A little higher than 60 fps. Look:
>
> (468 - 428 + 1 frames)/(17510[+/-0.5...] - 16828[+/-0.5...] ms)(1000 ms/s)
> = 60.029 to 60.206 frames/s.
>
> "...with an increment of 16.66 msec."
> The 'gdigrab' timing resolution may not be +/-0.01 ms. For example, it may
> be +/-0.1 ms or even +/-1 ms.
>
> If you can tolerate setting fps to exactly 60 (you're saving video to
> disk, you're not streaming to
> the Internet), put this:
>
> settb=expr=1/720000,setpts=N*12000,fps=60,
>
> at the beginning of the filter chain. It will set frame rate to exactly
> 60fps and will also preserve
> excellent timing resolution (0.013[8..] ms) in any succeeding processing
> (without affecting the
> final encoder).
>
> Regards,
> Mark.
> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> ffmpeg-user-request at ffmpeg.org with subject "unsubscribe".



-- 
Regards
Hassan Iqbal


More information about the ffmpeg-user mailing list