2016-07-05 13 views
2

Ich habe Probleme bei der Aufzeichnung meines Desktops bei 60FPS mit dem neuesten Windows-kompilierten FFmpeg mit NVENC-Codec. Metadaten sagt die Datei ist 60 fps, aber wenn ich es spiele, kann ich klar sehen, es ist nicht 60FPS.Desktop-Grabbing mit FFmpeg bei 60 fps mit NVENC-Codec

Die Befehlszeilen ich verwende, ist die folgende:

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 

ich eine Echtzeitpuffer versucht, mit, einen anderen Directshow-Gerät verwenden, um das Profil zu ändern oder eine Bitrate zu zwingen, aber das Video scheint immer zu sein 30 Bilder pro Sekunde.

Die Aufnahme des Bildschirms mit NVIDIA ShadowPlay funktioniert gut, so dass ich weiß, dass es auf meinem Rechner möglich ist.

FFprobe Mit Hilfe der Shadowplay der Ausgabedatei zu überprüfen, kann ich sehen:

Strom # 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)

Aber wenn ich zwinge meine Ausgabe habe die gleiche Bitrate und das gleiche Profil, das ich bekomme:

Strom # 0: 0 (und): Video: h264 (hoch) (avc1/0x31637661), yuv420p, 1920x1080 [SAR 1: 1 DAR 16: 9], 5519 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)

ich sehen kann tbr und tbn unterschiedlich sind, so dass ich weiß, dass mein Ausgaberahmen dupliziert.

Zum Testen hatten alle meine Aufnahmen this 60 frame rate test page im Hintergrund, und ich konnte deutlich die Unterschiede sehen.

Ich weiß, dass ShadowPlay wahrscheinlich viel mehr unter der Haube als FFmpeg mit dem gleichen Codec. Ich weiß, OBS kann das ganz leicht, aber ich möchte verstehen, was ich falsch mache. Vielleicht ist es eine FFmpeg-Beschränkung?

Voll Konsolausgabe

-v Spur Befehl:

[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) 
+0

@rogerdpack - können Sie helfen? – Mulvya

Antwort

0

Ihre Directshow-Filter verwendet GDI Angenommen, es ist sehr wahrscheinlich, kann der gesamte Desktop nicht mit 60 fps aufgenommen werden (Windows ist nicht sehr gut bei dem). FFmpeg verdoppelt wahrscheinlich einige Bilder und endet mit 60 fps. DXGI sollte eine bessere Leistung geben (https://msdn.microsoft.com/en-us/library/windows/desktop/hh404487(v=vs.85).aspx), aber ich weiß nicht, FFmpeg hat eingebaute Unterstützung dafür. Noch?

Verwandte Themen