循环记录C+中的directx输出+/C#

循环记录C+中的directx输出+/C#,c#,c++,windows,video-capture,C#,C++,Windows,Video Capture,我需要循环记录Desktop/DirectX输出,这样我总是有大约相等数量的视频数据,比如最后30秒,然后在需要时保存 到目前为止,我只发现了简单地录制到文件中,但我想录制到某种循环内存流中,仅在需要时生成可播放的视频文件 如果有人有这方面的专业知识,我将非常感谢。没错。您使用的循环缓冲区足够大,可以容纳30秒的帧数据。在捕获线程中,您只需直接复制到缓冲区中的下一帧。一旦你填满了缓冲区,你只需循环到开始,然后再次开始填充。下一个可用帧始终是最旧的帧 如果需要,可以维护头/尾索引。但是更容易的方法

我需要循环记录Desktop/DirectX输出,这样我总是有大约相等数量的视频数据,比如最后30秒,然后在需要时保存

到目前为止,我只发现了简单地录制到文件中,但我想录制到某种循环内存流中,仅在需要时生成可播放的视频文件


如果有人有这方面的专业知识,我将非常感谢。

没错。您使用的循环缓冲区足够大,可以容纳30秒的帧数据。在捕获线程中,您只需直接复制到缓冲区中的下一帧。一旦你填满了缓冲区,你只需循环到开始,然后再次开始填充。下一个可用帧始终是最旧的帧

如果需要,可以维护头/尾索引。但是更容易的方法是跟踪下一个可用索引和一个标志来说明缓冲区是否已满(如果缓冲区未满,则下一个可用索引也是可用的帧数)

将数据写入磁盘时,您需要停止捕获,或者确保写入速度足够快。I/O优化在这里很重要—在磁盘扇区大小的倍数块中使用无缓冲写入。在某些系统上,如果还将帧数据分配给扇区对齐的内存地址,则可以利用完全优化

如果I/O速度低于捕获速度,则需要保持大于30秒的缓冲区。你喜欢多大就多大。始终先开始写入最旧的帧。要查找最旧的帧,只需进行一点模运算即可:

firstFrameIdx = (bufSize + nextFrameIdx - numberOfSeconds * framesPerSecond) % bufSize

当然,您可以将缓冲区复制到新内存中,然后以您喜欢的速度将其写出来。

理论如此之多,我仍然不知道必须使用什么API/框架在内存中捕获和编码。正如我所说,我发现的一切要么是“截图”,要么是“将视频保存到硬盘”,嗯,你没有很好地解释自己。对我来说,这听起来像是您编写了代码来完成这项工作,并且想知道如何保留一个后台缓冲区,以便按需写出帧历史记录。你甚至还没说你在录什么。它是您自己的应用程序的输出,还是您试图捕获整个屏幕?正如我所说,记录到文件很容易,任何库都可以做到这一点。但是由于没有库记录直接进入缓冲区,我需要自己做,因此问题就来了。应该是整个屏幕。将未压缩的帧保存在内存中会变得太大,所以我需要将它们保存在循环缓冲区中,同时以某种方式压缩它们。。。