我正在寻找一种有效的方法来实现像对象这样的循环缓冲区,以便从网络摄像头连续录制但只持有固定的时间。即连续监视视频流,但任何时候只能将最后2秒保留在内存中。
ffplay
可执行文件有一些你可以使用的队列实现,请检查ffplay.c
。
你将导入这个结构PacketQueue
和这些功能:
static int packet_queue_put_private (PacketQueue *q, AVPacket *pkt)
static int packet_queue_put (PacketQueue *q, AVPacket *pkt)
static int packet_queue_put_nullpacket (PacketQueue *q, int stream_index)
static int packet_queue_init (PacketQueue *q)
static void packet_queue_flush (PacketQueue *q)
static void packet_queue_destroy (PacketQueue *q)
static void packet_queue_abort (PacketQueue *q)
static void packet_queue_start (PacketQueue *q)
static int packet_queue_get (PacketQueue *q, AVPacket *pkt, int block, int *serial)
这个实现非常快。 PacketQueue.nb_packets
将为您提供当前队列中的视频帧数。 2秒的帧数意味着VideoFps * 2
,即60fps视频,nb_packets
最大值应为120帧。如果尝试实现这一点,您可以轻松添加packet_queue_discardpkt
以删除多余的帧(最旧的帧),如果它> 2秒(即120帧)。我可以举一个关于这个packet_queue_discardpkt
函数的例子。
希望有所帮助。