在C++/C#中记录directx输出的循环
Loop recording the directx output in C++/C#
我需要循环记录Desktop/DDirectX输出,这样我就总是有大约相等数量的视频数据,比如最后30秒,然后我可以在需要时保存这些数据。
到目前为止,我只发现简单地录制到一个文件,但我想录制到某种循环MemoryStream,只有在请求时才能生成可播放的视频文件。
如果有人在这方面有专业知识,我将非常感谢。
没错。您使用的环形缓冲区足够大,可以容纳30秒的帧数据。在捕获线程中,您只需直接复制到缓冲区中的下一帧。一旦你填满了缓冲区,你就可以循环到开始,然后再次开始填充。下一个可用帧总是最旧的。
如果您愿意,您可以维护头/尾索引。但是,只跟踪下一个可用索引和一个标志来判断缓冲区是否已满更容易(如果缓冲区未满,那么下一个有效索引也是可用的帧数)。
将数据写入磁盘时,您需要停止捕获,或者确保写入速度足够快。I/O优化在这里很重要——在磁盘扇区大小的倍数的块中使用无缓冲写入。在某些系统上,如果您还将帧数据分配到扇区对齐的内存地址,则可以充分利用优化。
如果I/O比捕获速率慢,则需要保持大于30秒的缓冲区。你想怎么大就怎么大。始终先开始写入最旧的帧。要找到最古老的帧,只需一点模运算即可:
firstFrameIdx = (bufSize + nextFrameIdx - numberOfSeconds * framesPerSecond) % bufSize
当然,您总是可以将缓冲区复制到新的内存中,然后随心所欲地慢写。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 使用DirectX获取显示设备输出类型
- DirectX屏幕捕获和输出为视频
- 在C++/C#中记录directx输出的循环
- DirectX 11 -计算着色器:写入输出资源