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

本文关键字:directx 输出 循环 记录 C++ | 更新日期: 2023-09-27 18:21:30

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

到目前为止,我只发现简单地录制到一个文件,但我想录制到某种循环MemoryStream,只有在请求时才能生成可播放的视频文件。

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

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

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

如果您愿意,您可以维护头/尾索引。但是,只跟踪下一个可用索引和一个标志来判断缓冲区是否已满更容易(如果缓冲区未满,那么下一个有效索引也是可用的帧数)。

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

如果I/O比捕获速率慢,则需要保持大于30秒的缓冲区。你想怎么大就怎么大。始终先开始写入最旧的帧。要找到最古老的帧,只需一点模运算即可:

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

当然,您总是可以将缓冲区复制到新的内存中,然后随心所欲地慢写。