【问题标题】:Implement Circular Buffer for v4l2为 v4l2 实现循环缓冲区
【发布时间】:2018-02-08 03:33:06
【问题描述】:

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

【问题讨论】:

    标签: ffmpeg v4l2


    【解决方案1】:

    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函数的例子。
    希望对您有所帮助。

    【讨论】:

    • 这看起来很有希望。感谢您的答复。我的 C 很弱,所以我非常感谢您愿意提供的任何帮助。最终目标是为我们的 Cub Scout Packs Pinewood Derby 实施即时回放设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2012-04-02
    • 2012-11-17
    相关资源
    最近更新 更多