我从C上获得了带有ffmpeg的rtsp的视频流。我正在将它直接写入文件。 我需要创建10秒缓冲区,我可以在rtsp sream中保存最后10秒的视频。在某一刻我需要开始记录从rtsp到文件的所有视频(包括之前的10秒缓冲区)。 任何人都可以告诉我,怎么做?
答案 0 :(得分:4)
var str = "Ana has apples! A lot.";
// Function
function indexsOf(str, sub) {
var arr = [],
i = 0,
n = 0;
do {
n = str.indexOf(" ");
if (n > -1) {
i += n;
arr.push(i);
str = str.slice(n + 1);
i++;
}
}
while (n > -1);
return arr;
}
var spaces = indexsOf(str, ' ')
// Output the whole array of results
console.log(spaces);
// You can also access the spaces position separately:
console.log('1st space:', spaces[0]);
console.log('2nd space:', spaces[1]);
自己是一个足以容纳20秒数据的循环缓冲区,并malloc
将流数据放入其中(不断覆盖太旧的数据)。
当您感兴趣的事件发生时,只需push
就可以在您选择的pop
作家之前10秒钟整整10秒钟内感兴趣。
编辑: Dilon是正确的,如果您要同时进行I / O,请按照他的指示添加必要的复杂性。
如果只是想在10秒后不要求任何数据,而在您感兴趣的事件发生时,将您的编写器停在循环缓冲区中,就可以了:)
答案 1 :(得分:1)
Gunther有一个很好的方法,并且可以解决您的问题,但是如果您暂时以比读取快得多的速度写入数据(可能是由于某种原因使读取停止),则可能会覆盖数据。用于数据读取。
要解决此问题,建议创建一些大小合适的缓冲区,然后创建一个链接列表以包含指向缓冲区的指针。一旦一个缓冲区已满,请将其从当前LL移至full
LL,然后开始缓冲到下一个可用缓冲区中。从full
LL读取缓冲区时,请将其移回empty
LL。如果full
个LL中的缓冲区用完了,请另外malloc()
个缓冲区。
这样,您有一个要读取的缓冲区队列,一个要写入的缓冲区,并且如果存在可用性问题,只需添加更多缓冲区。没有过早覆盖数据的风险。