Body: <p>I'm having trouble recording my desktop at 60FPS using the latest Windows compiled FFmpeg with NVENC codec. Metadata says the file is 60 fps but when I play it, I can see clearly see it is <strong>not</strong> 60FPS.</p>
  
  <p>The command-line I use is the following:</p>
  
  <pre><code>ffmpeg -y -rtbufsize 2000M -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -c:v h264_nvenc -preset:v fast -pix_fmt nv12 out.mp4
  </code></pre>
  
  <p>I tried using a real time buffer, using another DirectShow device, changing the profile or forcing a bitrate, but the video always seems to be at 30fps.</p>
  
  <p>Recording the screen using NVIDIA's ShadowPlay works well, so I know it's feasible on my machine.</p>
  
  <p>Using FFprobe to check the ShadowPlay's output file I can see:</p>
  
  <blockquote>
    <p>Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv,
    smpte170m/smpte170m/bt470m), 1920x1080 [SAR 1:1 DAR 16:9], 4573 kb/s,
    59.38 fps, 240 tbr, 60k tbn, 120 tbc (default)</p>
  </blockquote>
  
  <p>But If I force my output to have the same bitrate and profile I get:</p>
  
  <blockquote>
    <p>Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
    1920x1080 [SAR 1:1 DAR 16:9], 5519 kb/s, 60 fps, 60 tbr, 15360 tbn,
    120 tbc (default)</p>
  </blockquote>
  
  <p>I can see <code>tbr</code> and <code>tbn</code> are different, so I know my output is duplicating frames.</p>
  
  <p>For testing, all of my recordings had <a href="http://www.testufo.com/#test=framerates" rel="nofollow">this 60 frame rate test page</a> on the background, and I could clearly see the differences.</p>
  
  <p>I know ShadowPlay probably does a lot more under the hood than FFmpeg using the same codec. I know OBS can do it quite easily but I want to understand what I am doing wrong. Maybe it's some FFmpeg limitation ?</p>
  
  <h1>Full console output</h1>
  
  <p>Using -v trace command:</p>
  
  <pre><code>[gdigrab @ 0000000002572cc0] Capturing whole desktop as 1920x1080x32 at (0,0)
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -&gt; (1842,741)
  [gdigrab @ 0000000002572cc0] Probe buffer size limit of 5000000 bytes reached
  [gdigrab @ 0000000002572cc0] Stream #0: not enough frames to estimate rate; consider increasing probesize
  [gdigrab @ 0000000002572cc0] stream 0: start_time: 1467123648.275 duration: -9223372036854.775
  [gdigrab @ 0000000002572cc0] format: start_time: 1467123648.275 duration: -9223372036854.775 bitrate=3981337 kb/s
  Input #0, gdigrab, from 'desktop':
    Duration: N/A, start: 1467123648.275484, bitrate: 3981337 kb/s
      Stream #0:0, 1, 1/1000000: Video: bmp, 1 reference frame, bgra, 1920x1080 (0x0), 0/1, 3981337 kb/s, 60 fps, 1000k tbr, 1000k tbn, 1000k tbc
  Successfully opened the file.
  Parsing a group of options: output file out.mp4.
  Applying option c:v (codec name) with argument h264_nvenc.
  Applying option pix_fmt (set pixel format) with argument nv12.
  Successfully parsed a group of options.
  Opening an output file: out.mp4.
  [file @ 0000000000e3a7c0] Setting default whitelist 'file,crypto'
  Successfully opened the file.
  detected 8 logical cores
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'video_size' to value '1920x1080'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'pix_fmt' to value '30'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'time_base' to value '1/1000000'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'pixel_aspect' to value '0/1'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'sws_param' to value 'flags=2'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'frame_rate' to value '60/1'
  [graph 0 input from stream 0:0 @ 000000000257ec00] w:1920 h:1080 pixfmt:bgra tb:1/1000000 fr:60/1 sar:0/1 sws_param:flags=2
  [format @ 000000000257ffc0] compat: called with args=[nv12]
  [format @ 000000000257ffc0] Setting 'pix_fmts' to value 'nv12'
  [auto-inserted scaler 0 @ 00000000025802c0] Setting 'flags' to value 'bicubic'
  [auto-inserted scaler 0 @ 00000000025802c0] w:iw h:ih flags:'bicubic' interl:0
  [format @ 000000000257ffc0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
  [AVFilterGraph @ 0000000000e373c0] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed
  [auto-inserted scaler 0 @ 00000000025802c0] w:1920 h:1080 fmt:bgra sar:0/1 -&gt; w:1920 h:1080 fmt:nv12 sar:0/1 flags:0x4
  [h264_nvenc @ 0000000000e3ca20] Nvenc initialized successfully
  [h264_nvenc @ 0000000000e3ca20] 1 CUDA capable devices found
  [h264_nvenc @ 0000000000e3ca20] [ GPU #0 - &lt; GeForce GTX 670 &gt; has Compute SM 3.0 ]
  [h264_nvenc @ 0000000000e3ca20] supports NVENC
  [mp4 @ 0000000000e3b580] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
  Output #0, mp4, to 'out.mp4':
    Metadata:
      encoder         : Lavf57.40.101
      Stream #0:0, 0, 1/15360: Video: h264 (h264_nvenc) (Main), 1 reference frame ([33][0][0][0] / 0x0021), nv12, 1920x1080, 0/1, q=-1--1, 2000 kb/s, 60 fps, 15360 tbn, 60 tbc
      Metadata:
        encoder         : Lavc57.47.100 h264_nvenc
      Side data:
        cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: -1
  Stream mapping:
    Stream #0:0 -&gt; #0:0 (bmp (native) -&gt; h264 (h264_nvenc))
  Press [q] to stop, [?] for help
  cur_dts is invalid (this is harmless if it occurs once at the start per stream)
  Clipping frame in rate conversion by 0.000008
  cur_dts is invalid (this is harmless if it occurs once at the start per stream)
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -&gt; (1842,741)
  *** 35 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -&gt; (1842,741)
  *** 7 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,649) -&gt; (1850,649)
  *** 1 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1858,535) -&gt; (1858,535)
  *** 3 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1859,454) -&gt; (1859,454)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1865,384) -&gt; (1865,384)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1846,348) -&gt; (1846,348)
  *** 3 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1770,347) -&gt; (1770,347)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1545,388) -&gt; (1545,388)
  *** 4 dup!
  frame=   69 fps=0.0 q=35.0 size=     184kB time=00:00:00.63 bitrate=2384.0kbits/[gdigrab @ 0000000002572cc0] Cursor pos (1523,389) -&gt; (1519,378)
  </code></pre>
  
Comments.ContentLicense: CC BY-SA 3.0
Comments.CreationDate: 2016-06-28T14:19:32.313Z
Comments.Text: `tbr` is the codec frame rate, and it looks to be correct. Shadowplay, has in fact, a lower effective rate as it seems to have dropped some frames. `tbn` is the timescale and doesn't have anything to do with framerate, other than setting an *upper* bound on how many frames can be shown per second, and 15k is plenty for 60 frames. Were there other errors such as queue_size or framesync warnings? Show the full console output.
Comments.UserDisplayName: Gyan
Comments.ContentLicense: CC BY-SA 3.0
Comments.CreationDate: 2016-06-28T14:24:49.133Z
Comments.Text: @Mulvya Added the full console output.
Comments.UserDisplayName: Akatosh
Tags: <ffmpeg><windows><nvenc>
Title: Desktop grabbing with FFmpeg at 60 fps using NVENC codec
UserDisplayName: Akatosh
ThreadText: # Desktop grabbing with FFmpeg at 60 fps using NVENC codec
  
  (Asked by: username_0 on 2016-06-28)
  
  I'm having trouble recording my desktop at 60FPS using the latest Windows compiled FFmpeg with NVENC codec. Metadata says the file is 60 fps but when I play it, I can see clearly see it is **not** 60FPS.
  
  The command-line I use is the following:
  
  ```
  ffmpeg -y -rtbufsize 2000M -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 1920x1080 -i desktop -c:v h264_nvenc -preset:v fast -pix_fmt nv12 out.mp4
  
  ```
  
  I tried using a real time buffer, using another DirectShow device, changing the profile or forcing a bitrate, but the video always seems to be at 30fps.
  
  Recording the screen using NVIDIA's ShadowPlay works well, so I know it's feasible on my machine.
  
  Using FFprobe to check the ShadowPlay's output file I can see:
  
  > Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv,
  > smpte170m/smpte170m/bt470m), 1920x1080 [SAR 1:1 DAR 16:9], 4573 kb/s,
  > 59.38 fps, 240 tbr, 60k tbn, 120 tbc (default)
  
  But If I force my output to have the same bitrate and profile I get:
  
  > Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,
  > 1920x1080 [SAR 1:1 DAR 16:9], 5519 kb/s, 60 fps, 60 tbr, 15360 tbn,
  > 120 tbc (default)
  
  I can see `tbr` and `tbn` are different, so I know my output is duplicating frames.
  
  For testing, all of my recordings had [this 60 frame rate test page](http://www.testufo.com/#test=framerates) on the background, and I could clearly see the differences.
  
  I know ShadowPlay probably does a lot more under the hood than FFmpeg using the same codec. I know OBS can do it quite easily but I want to understand what I am doing wrong. Maybe it's some FFmpeg limitation ?
  
  # Full console output
  
  Using -v trace command:
  
  ```
  [gdigrab @ 0000000002572cc0] Capturing whole desktop as 1920x1080x32 at (0,0)
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -> (1842,741)
  [gdigrab @ 0000000002572cc0] Probe buffer size limit of 5000000 bytes reached
  [gdigrab @ 0000000002572cc0] Stream #0: not enough frames to estimate rate; consider increasing probesize
  [gdigrab @ 0000000002572cc0] stream 0: start_time: 1467123648.275 duration: -9223372036854.775
  [gdigrab @ 0000000002572cc0] format: start_time: 1467123648.275 duration: -9223372036854.775 bitrate=3981337 kb/s
  Input #0, gdigrab, from 'desktop':
    Duration: N/A, start: 1467123648.275484, bitrate: 3981337 kb/s
      Stream #0:0, 1, 1/1000000: Video: bmp, 1 reference frame, bgra, 1920x1080 (0x0), 0/1, 3981337 kb/s, 60 fps, 1000k tbr, 1000k tbn, 1000k tbc
  Successfully opened the file.
  Parsing a group of options: output file out.mp4.
  Applying option c:v (codec name) with argument h264_nvenc.
  Applying option pix_fmt (set pixel format) with argument nv12.
  Successfully parsed a group of options.
  Opening an output file: out.mp4.
  [file @ 0000000000e3a7c0] Setting default whitelist 'file,crypto'
  Successfully opened the file.
  detected 8 logical cores
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'video_size' to value '1920x1080'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'pix_fmt' to value '30'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'time_base' to value '1/1000000'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'pixel_aspect' to value '0/1'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'sws_param' to value 'flags=2'
  [graph 0 input from stream 0:0 @ 000000000257ec00] Setting 'frame_rate' to value '60/1'
  [graph 0 input from stream 0:0 @ 000000000257ec00] w:1920 h:1080 pixfmt:bgra tb:1/1000000 fr:60/1 sar:0/1 sws_param:flags=2
  [format @ 000000000257ffc0] compat: called with args=[nv12]
  [format @ 000000000257ffc0] Setting 'pix_fmts' to value 'nv12'
  [auto-inserted scaler 0 @ 00000000025802c0] Setting 'flags' to value 'bicubic'
  [auto-inserted scaler 0 @ 00000000025802c0] w:iw h:ih flags:'bicubic' interl:0
  [format @ 000000000257ffc0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'Parsed_null_0' and the filter 'format'
  [AVFilterGraph @ 0000000000e373c0] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed
  [auto-inserted scaler 0 @ 00000000025802c0] w:1920 h:1080 fmt:bgra sar:0/1 -> w:1920 h:1080 fmt:nv12 sar:0/1 flags:0x4
  [h264_nvenc @ 0000000000e3ca20] Nvenc initialized successfully
  [h264_nvenc @ 0000000000e3ca20] 1 CUDA capable devices found
  [h264_nvenc @ 0000000000e3ca20] [ GPU #0 - < GeForce GTX 670 > has Compute SM 3.0 ]
  [h264_nvenc @ 0000000000e3ca20] supports NVENC
  [mp4 @ 0000000000e3b580] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
  Output #0, mp4, to 'out.mp4':
    Metadata:
      encoder         : Lavf57.40.101
      Stream #0:0, 0, 1/15360: Video: h264 (h264_nvenc) (Main), 1 reference frame ([33][0][0][0] / 0x0021), nv12, 1920x1080, 0/1, q=-1--1, 2000 kb/s, 60 fps, 15360 tbn, 60 tbc
      Metadata:
        encoder         : Lavc57.47.100 h264_nvenc
      Side data:
        cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: -1
  Stream mapping:
    Stream #0:0 -> #0:0 (bmp (native) -> h264 (h264_nvenc))
  Press [q] to stop, [?] for help
  cur_dts is invalid (this is harmless if it occurs once at the start per stream)
  Clipping frame in rate conversion by 0.000008
  cur_dts is invalid (this is harmless if it occurs once at the start per stream)
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -> (1842,741)
  *** 35 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,750) -> (1842,741)
  *** 7 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1850,649) -> (1850,649)
  *** 1 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1858,535) -> (1858,535)
  *** 3 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1859,454) -> (1859,454)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1865,384) -> (1865,384)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1846,348) -> (1846,348)
  *** 3 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1770,347) -> (1770,347)
  *** 2 dup!
  [gdigrab @ 0000000002572cc0] Cursor pos (1545,388) -> (1545,388)
  *** 4 dup!
  frame=   69 fps=0.0 q=35.0 size=     184kB time=00:00:00.63 bitrate=2384.0kbits/[gdigrab @ 0000000002572cc0] Cursor pos (1523,389) -> (1519,378)
  
  ```
  
  **Tags:** ffmpeg, windows, nvenc
  
  > **Comments:**
  > **username_1**: `tbr` is the codec frame rate, and it looks to be correct. Shadowplay, has in fact, a lower effective rate as it seems to have dropped some frames. `tbn` is the timescale and doesn't have anything to do with framerate, other than setting an *upper* bound on how many frames can be shown per second, and 15k is plenty for 60 frames. Were there other errors such as queue_size or framesync warnings? Show the full console output.  
  > **username_0**: @Mulvya Added the full console output.  
  
  ---
  
  ## 0 answers
  
  