Организация циклического буфера видеопотока

Ответить
zhogar
Сообщения: 1
Зарегистрирован: 28 апр 2016, 08:32

Организация циклического буфера видеопотока

Сообщение zhogar » 28 апр 2016, 09:07

Здравствуйте.

Вот уже 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.
p.s. Тут на другом форуме, добрый человек подсказал мне, что нужно использовать интерфейс Queue и его имплементации типа LinkedList, сжатие использовать в ByteArrayOutputStream. И еще было сказано, что с стандартным onPreviewFrame ничего не выйдет. Также было указано, что лучше работать с камерой на прямую (но будет более аппаратно зависимое приложение), или писать свой кодек.

Но вот из последнего не одного, не другого я не делал. Так как же быть в данном случае неужели задача не решаема???

Upd: основная идея такого буфера в том, что он имеет определенный размер, и его содержимое (кадры) постоянно переписываются, и только по требованию (или событию) этот буфер выгружается в файл (скажем *.mp4), соответственно его VideoDuration фиксирован.

Заранее спасибо за любую оказанную помощь!

Ответить