当我通过ffmpeg获得RTSP流时,如何创建缓冲区?

时间:2017-07-09 21:44:34

标签: c ffmpeg

我从C上获得了带有ffmpeg的rtsp的视频流。我正在将它直接写入文件。 我需要创建10秒缓冲区,我可以在rtsp sream中保存最后10秒的视频。在某一刻我需要开始记录从rtsp到文件的所有视频(包括之前的10秒缓冲区)。 任何人都可以告诉我,怎么做?

2 个答案:

答案 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()个缓冲区。

这样,您有一个要读取的缓冲区队列,一个要写入的缓冲区,并且如果存在可用性问题,只需添加更多缓冲区。没有过早覆盖数据的风险。