Как буферизовать и задерживать видео в течение нескольких секунд перед предварительным просмотром с помощью camera2 api - PullRequest
0 голосов
/ 04 января 2019

У меня есть рабочий код для предварительного просмотра видео в простой textureView.Теперь я хочу буферизовать несколько секунд видео (сотни кадров), прежде чем показывать их в textureView.

Я не хочу никакого преобразования, я просто хочу взять кадры YUV_422_888 с камеры, поместить их в большой буфер и через некоторое время (скажем, 10 с) начать показывать их в том же FPS, что и они.записано, например, 30 FPS.Я хочу делать это постоянно.

Я могу найти несколько примеров и идей использования ImageReader с RenderScript или OpenGL для манипулирования фреймами, с большим количеством кода для преобразования между различными форматами.У кого-нибудь есть предложение, как сделать это простым способом, без загрузки кода преобразования ?!

1 Ответ

0 голосов
/ 04 января 2019

Сотни кадров занимают много памяти.При разрешении 720p каждый кадр YUV занимает ~ 1,3 МБ;в 1080p они занимают 3 МБ каждый.

Таким образом, 10 секунд буферизации израсходуют 390 МБ при 720p, 900 МБ при 1080p.Это может вызвать проблемы у вас на устройствах с меньшим объемом памяти.

Вы можете использовать пару ImageReader и ImageWriter, скорее всего, хотя выбор правильного формата сложен.YUV_420_888 может работать, но технически TextureView не гарантирует их принятия (но будет на многих, возможно, на всех устройствах).Поэтому, если YV12 доступен, это может быть лучше.

Затем создайте ImageReader и ImageWriter с этим форматом;для ImageWriter, дайте ему поверхность из TextureView.Для ImageReader передайте его Surface на устройство камеры.

Затем, когда новое изображение станет доступным из ImageReader, получите его и скопируйте его содержимое (со всех 3-х плоскостей) в круговой буфер.Как только ваш буфер заполнится, начните копировать кадры из него в ImageWriter.

Теоретически вы можете буферизовать кадры в самом ImageReader без копирования, но он имеет максимум около 64 кадров, которые он может поставить в очередь внутриего очередь.Этого далеко не хватит на 10 секунд.

...