2

I wanted to check what the lowest FPS is that the human eye cannot notice as flicker.

I created a white jpg and a black JPG. I started with 25 fps which means that I have 24 jpg of white and 1 of black.

Than I used this command:

ffmpeg -r 25 -i %d.jpg -vcodec mpeg4 test.avi

The movie was 3 seconds long (I had 75 jpg in total). I could easily see the black picture.

Then I moved to 100 fps, and I was still able to see it – but not 3 times as before (here I had 300 JPG, 3 of them were black). When I moved to 200 fps, I wasn't able to see the black JPG flicker (I 600 JPGs).

Is there any lower limit for FPS where humans cannot perceive a difference between two frames?

The codec I used for sure showed these images… or there is a way of compression where the black frame wouldn't be shown in the movie? If so, which codec should I use?

LawrenceC
  • 73,030
  • 15
  • 129
  • 214
USer22999299
  • 131
  • 1
  • 4
  • Note to close voters: this question does involve ffmpeg, thus computer software. The answer also states how it technically is not possible, relating to the hardware. – slhck Apr 26 '14 at 12:12

1 Answers1

7

What you want is basically impossible with the hardware you have. You can create a video with 600 frames per second without issues, but no consumer monitor can play that back. Typical computer monitors have refresh rates from 60 to 100 Hz, the best being 3D-capable monitors that can display up to 120 Hz.

So what happens is that you see an interpolation of the actual video, where only some of the frames are shown.

Note that humans already perceive individual images as motion with frame rates around 10 to 15 Hz. This might not be as pronounced with high-contrast black and white images though, but going up to 60 Hz or more is unnecessary. As soon as the duration of an individual frame is below 13 milliseconds (which roughly equals to 60 Hz), it will not be recognizable as such – and this should answer your question.

To be precise, you might not want to ask when the human eye perceives the image, but the human visual system as a complex apparatus. The eye might as well be able to pick up the image, but the brain doesn't have to handle it because it's way beyond the threshold of what is useful to process for it.

If you want research material on that subject, I recommend you to read something along these papers:

  • Potter, Mary C., et al. "Detecting meaning in RSVP at 13 ms per picture." Attention, Perception, & Psychophysics (2013): 1-10.

  • Watson, Andrew B. "Temporal sensitivity." Handbook of perception and human performance 1 (1986): 6-1.

  • Thompson, Peter, and Leland S. Stone. "Contrast affects flicker and speed perception differently." Vision research 37.10 (1997): 1255-1260.

slhck
  • 223,558
  • 70
  • 607
  • 592
  • So basically if i creating a video with 60 hz == 30 fps , the human eye should now recognize it? witch codec i should use for that? – USer22999299 Apr 26 '14 at 12:07
  • 60 Hz means 60 frames per second. That roughly equals to 16ms per frame, so you *should* in theory be able to see it. The codec does not matter as much, but if you want to be sure, use an I-frame only codec like MJPEG (`-vcodec mjpeg`). – slhck Apr 26 '14 at 12:11
  • how can i make sure that this one is progressive and not interlace ? in interlace 2 fields are 1 frame.. – USer22999299 Apr 26 '14 at 16:09
  • It will be progressive, since you don't have any interlaced source. You're just taking single pictures. – slhck Apr 26 '14 at 17:07
  • Thanks a lot , you were right , used mjpeg at -r 60, and i could not noticed the injected frame. Is there some how to do post processing to the video to make sure that the specific frame is different? (just to check my self) – USer22999299 Apr 27 '14 at 05:17
  • Any decent video editing program will let you do that. Depends on what OS you run, but VirtualDub would work on Windows. – slhck Apr 27 '14 at 07:29
  • while using the command of ffmpeg -r 60 -i %d.jpg -vcodec mjpeg test.avi is had a problem to open the file in virtualdub. there is any other program that support this codec? that i can see the injected frame? – USer22999299 May 02 '14 at 05:48
  • Every decent video player should be able to view this, e.g. VLC. Or you could encode losslessly with x264: `ffmpeg … -vcodec libx264 -crf 0 output.avi` – slhck May 02 '14 at 06:04
  • yeah i can view the video with BS player . The problem is that i want to make sure that this "injected" frame is exist in the output video. is there any software that can decode it or view it frame by frame ? BTW , where i can see which codec i can use that will for sure keep the injected frame in the movie and wont compress them? – USer22999299 May 03 '14 at 05:48
  • `ffplay` can do that, or VirtualDub, or MPEG-Streamclip, etc. And every codec will normally keep every frame as-is, unless you specify a different framerate during conversion or change from progressive to interlaced encoding. – slhck May 03 '14 at 06:18
  • so , here is the problem i'm heading into: the output video is 60 FPS , when i open it in Virtual dub i can see that every 60-th frames i got on that is different. I made the movie from 120 jpeg which means that i need to get 2 sec out put video. It is seams like its 2 sec video , that's what it show in every player but when i play it it play it for much longer time than 2 sec (lower speed than 60 fps). dose the player chose the decoder via the file extension like avi? how can i force the player to show 60 fps video? – USer22999299 May 03 '14 at 14:10
  • Then possibly your player cannot handle the 60 frames per second, your hardware is too slow, or similar. Which brings me back to the first point in my answer—without dedicated hardware or software it could be impossible to test. – slhck May 04 '14 at 07:40