【发布时间】:2018-02-08 03:33:06
【问题描述】:
我正在寻找一种有效的方法来实现像对象一样的循环缓冲区,以从网络摄像头连续记录,但只保留固定的时间。即持续监控视频流,但在任何时候仅将最后 2 秒保存在内存中。
【问题讨论】:
我正在寻找一种有效的方法来实现像对象一样的循环缓冲区,以从网络摄像头连续记录,但只保留固定的时间。即持续监控视频流,但在任何时候仅将最后 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函数的例子。
希望对您有所帮助。
【讨论】: