我正在寻找一种有效的方法来实现类似循环缓冲区的对象,以连续从网络摄像头进行记录,但仅保留固定的时间。即连续监控视频流,但任一时间仅将最后 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
函数的示例。
希望有帮助。
关于ffmpeg - 为 v4l2 实现循环缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677098/