ffmpeg - 为 v4l2 实现循环缓冲区

标签 ffmpeg v4l2

我正在寻找一种有效的方法来实现类似循环缓冲区的对象,以连续从网络摄像头进行记录,但仅保留固定的时间。即连续监控视频流,但任一时间仅将最后 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/

相关文章:

c# - 如何从 JPEG 文件列表创建视频?

OpenCV 可以转换为复合输入吗?

ffmpeg - 以相同格式编码音频和视频然后合并

c++ - libav - 解码 H264 帧错误

ffmpeg - 如何下载 .m4s 文件的特定部分

c++ - 如何使用CImg库捕获和处理图像的每一帧?

opencv - Ubuntu Opencv Camera settings V4L2 error 不支持曝光控制

c++ - 使用 V4L2 API 选择输入 channel

html - .mp4 文件无法在浏览器中播放,是否使用了一些奇怪的编解码器?