Вот уже 2-3 недели пытаюсь решить задачу, но ничего не выходит.
Прошу, по возможности, подключиться специалистам компетентным в данных вопросах, ну или людей кто уже решал подобное.
В общем необходимо реализовать циклический буфер видеопотока (FIFO), заданной величины, и иметь возможность выгрузить этот буфер в любой момент времени в файл.
К примеру частота кадров FPS=30, длина видео в буфере VideoDuration=60000 мс. = 60 с., итого получаем FPS * VideoDuration = 1800 кадров, необходимо хранить в буфере.
Понятно что размер одного кадра = высота*ширина*4 байта, скажем для H264 размер получается очень большим, и его необходимо сжать.
Так вот:
- Каким образом возможно организовать такой буфер?
- Какие алгоритмы сжатия, без потери качества, перед помещением в буфер использовать?
- Кокой метод (callback) использовать чтобы иметь возможность отлавливать каждый кадр FPS?
Для примера:
Код: Выделить всё
begin bufer size = 16 end
/------------------------^----------------------\
--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41 <- frame num.
--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
<== frame direction (time) ==
|
|
Event and action save ---> to File
+-- Stream video frames
|
| [Process Recording] ^
| |
+--> buffer(size) ------+
(push) (pop)
|
Event
|
|
+---> save buffer
in to file.
Но вот из последнего не одного, не другого я не делал. Так как же быть в данном случае неужели задача не решаема???
Upd: основная идея такого буфера в том, что он имеет определенный размер, и его содержимое (кадры) постоянно переписываются, и только по требованию (или событию) этот буфер выгружается в файл (скажем *.mp4), соответственно его VideoDuration фиксирован.
Заранее спасибо за любую оказанную помощь!