为v4l2实现循环缓冲区

问题描述 投票:0回答:1

我正在寻找一种有效的方法来实现像对象这样的循环缓冲区,以便从网络摄像头连续录制但只持有固定的时间。即连续监视视频流,但任何时候只能将最后2秒保留在内存中。

ffmpeg v4l2
1个回答
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函数的例子。 希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.