Внедрить круговой буфер для v4l2

99
10

Я ищу эффективный способ реализации циклического буфера, такого как объект, для непрерывной записи с веб-камеры, но только фиксированного количества времени. т.е. непрерывный мониторинг видеопотока, но только сохранение последних 2 секунд в памяти в любой момент времени.

спросил(а) 2021-01-25T17:55:46+03:00 4 месяца, 4 недели назад
1
Решение
63

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, то есть 60 nb_packets максимум nb_packets должен составлять 120 кадров. Если вы попытаетесь реализовать это, вы можете легко добавить packet_queue_discardpkt для удаления лишних кадров (самый старый), если он> 2 секунды (т.е. 120 кадров). Я могу привести пример этой функции packet_queue_discardpkt.
Надеюсь, это поможет.

ответил(а) 2021-01-25T17:55:46+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема