我有麻烦记录我的桌面在60FPS使用最新的Windows编译FFmpeg与NVENC编解码器。元数据说文件是60fps,但当我播放它时,我可以清楚地看到它不是60fps。
我使用的命令行如下所示:
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
我尝试使用实时缓冲区,使用另一个DirectShow设备,更改配置文件或强制比特率,但视频似乎总是在30fps。
使用NVIDIA的ShadowPlay录制屏幕效果很好,所以我知道这在我的机器上是可行的。
使用FFprobe检查影子戏的输出文件,我可以看到:
流#0:0(und):视频:h264(高)(avc1/0x31637661),yuv420p(电视,smpte170m/smpte170m/bt470m),1920x1080[SAR 1:1 DAR 16:9],4573 kb/s,59.38 fps,240 tbr,60k tbn,120 tbc(默认)
但如果我强制我的输出具有相同的比特率和配置文件,我会得到:
流#0:0(und):视频:h264(高)(avc1/0x31637661),yuv420p,1920x1080[SAR 1:1 DAR 16:9],5519 kb/s,60 fps,60 tbr,15360 tbn,120 tbc(默认)
我可以看到tbr
和tbn
是不同的,所以我知道我的输出是复制帧。
为了测试,我所有的录音都在后台有这个60帧速率测试页面,我可以清楚地看到差异。
我知道ShadowPlay可能比使用相同编解码器的FFmpeg在幕后做得更多。我知道OBS可以很容易地做到这一点,但我想知道我做错了什么。也许这是一些FFmpeg限制?
使用-v trace命令:
[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)
假设你的DirectShow过滤器使用GDI,很可能整个桌面无法以60 fps的速度捕获(视窗系统不太擅长这一点)。FFmpeg可能会将一些图像翻倍,最终达到60 fps。DXGI应该提供更好的性能(https://msdn.microsoft.com/en-us/library/windows/desktop/hh404487(v=vs.85). aspx),但我不知道FFmpeg对此有内置支持。还没?
我的应用程序的一个核心功能是它有一个持续的通知和一个每分钟更新的倒计时--即使应用程序被Android操作系统关闭。 首先,我使用一个服务来运行计时器并更新通知,但这是一个内存/电池占用。因此,我转而使用来完成计时器和重复警报,每60秒左右唤醒一次以更新通知: 什么是一种好方法来确保正在进行的通知至少每60秒更新一次呢?除了回到使用一个服务(啊!加上操作系统有时会在内存很少的设备上直接杀死服务)之
在Windows上,我们观察到: 使用CLI,ffmpeg能够使用命令.以30 fps的速度提取帧 使用Xuggler,我们能够以30 fps的速度提取帧。 在代码中直接使用FFMPEG APIs,我们可以以30 fps的速度获得帧。 但是,当我们直接在Android上使用FFMPEG API时(请参见硬件细节),我们会得到以下结果: null 我们如何在Android上获得30个fps? And
我正在尝试提取几个视频上的所有帧。这些视频是在以可变帧速率保存输出的摄像机上拍摄的,因此,一些帧在时间上比其他帧更接近(根据mediainfo,每秒27到30帧) 这些帧将与一些元数据同步,因此我不仅需要提取它们,还需要保留视频每帧拍摄的[相对]时间信息。 我一直在使用ffmpeg来提取视频帧,当视频帧速率不再恒定时,挑战就来了。任何其他不同于ffmpeg的方法或程序都可以完成任务。
问题内容: 在哪里可以找到有关WDS的文档,特别是使用C#中的SQL查询来查询WDS?是否有任何资源列出可以从SystemIndex查询的列?另外,我希望查询返回“上下文”,即就像WDS客户端从找到搜索词的文档中的几行开始一样。尽管我相信3+的API是相同的,但我正在使用WDS 4.0。我检查了MSDN和其他站点,但是没有运气。 问题答案: 在MSDN论坛上发布并得到答案:可以搜索的列或属性:ht
我正在尝试编辑远程AmazonEC2Linux实例上的文件。我目前正在使用nano,但我非常想要一个图形文本编辑器。我有两个问题: 当我ssh时,我必须使用sudo来编辑这些服务器文件。 我只能用亚马逊给我的密钥登录。ndrew.pemec2-user@55.55.44.33 请帮忙!我不挑剔,只是任何图形文本编辑器,因为使用nano是一个巨大的痛苦。
如果我不控制代码每秒执行的次数,当我添加一行时,程序会发生变化,我必须再次调整常量。(谷歌翻译)我的代码失控了: