我在C上用ffmpeg从rtsp得到视频流,我直接把它写到文件中。我需要创建10秒的缓冲区,在那里我可以保存来自rtsp sream的最后10秒视频。在某个时刻,我需要开始将rtsp中的所有视频记录到文件中(包括之前的10秒缓冲区)。有人能告诉我怎么做吗?
发布于 2018-06-29 20:16:11
为自己创建一个足以容纳20秒数据的循环缓冲区,然后将流数据覆盖( push )到其中(不断覆盖太旧的数据)。
当您感兴趣的事件发生时,只需将之前的完整10秒和感兴趣的10秒pop给您选择的FILE*编写器。
编辑: Dilon是对的,如果你想同时进行I/O,就像他所指出的那样增加必要的复杂性。
如果只是简单地想要在10秒后没有额外数据的情况下请求数据,只需在感兴趣的事件发生时停止您的编写器进入循环缓冲区,您就完成了:)
发布于 2018-06-30 06:13:43
Gunther有一个很好的方法,这将解决您的问题,但如果您临时写入数据的速度比读取数据的速度快得多,则可能会覆盖数据(可能读取由于某种原因而停滞?),或者延迟到等待数据读取。
为了解决这个问题,我建议设置一些合理大小的缓冲区,然后创建一个链表来包含指向这些缓冲区的指针。一旦一个缓冲区被填满,将其从当前LL移至full LL,并开始缓冲到下一个可用缓冲区。从full LL读取缓冲区时,将它们移回empty LL。如果你用完了full LL中的缓冲区--只要再malloc()一个就行了。
这样,您有一个队列的缓冲区要读,一个队列要写,如果存在可用性问题-只需添加更多的缓冲区。没有过早覆盖数据的风险。
https://stackoverflow.com/questions/45001309
复制相似问题