0

我需要循环记录 Desktop/DirectX 输出,以便我始终拥有大约均匀数量的视频数据,比如最后 30 秒,然后我可以在需要时保存。

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

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

4

1 回答 1

0

这是正确的。您使用一个足够大的循环缓冲区来保存 30 秒的帧数据。在您的捕获线程中,您只需直接复制到缓冲区中的下一帧。一旦你填充了缓冲区,你只需循环到开始并再次开始填充。下一个可用帧总是最旧的。

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

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

如果您的 I/O 比捕获速率慢,您将需要维护一个大于 30 秒的缓冲区。让它尽可能大。始终首先开始写入最旧的帧。要找到最旧的帧,只需进行一点模运算即可:

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

当然,您总是可以将缓冲区复制到新内存中,然后尽可能慢地写出来。

于 2013-07-08T03:32:48.443 回答