Подтвердить что ты не робот

Запись видео в круговой буфер на Android

Я ищу лучший способ (если есть...), чтобы захватить непрерывное видео в круговой буфер на SD-карте, позволяя пользователю записывать события после того, как они произошли.

Стандартный API видеозаписи позволяет вам просто писать напрямую в файл, и когда вы достигаете предела (установленного пользователем или емкостью SD-карты), вы должны остановить и перезапустить запись. Это создает до 2 секундного окна, где запись не выполняется. Вот что делают уже существующие приложения, такие как DailyRoads Voyager. Чтобы свести к минимуму вероятность пропустить что-то важное, вы можете установить время разбивки на что-то долгое, например 10 минут, но если событие происходит ближе к концу этого промежутка времени, вы теряете пространство, сохраняя в начале 9 минут ничего.

Итак, теперь моя идея такова: у меня будет большой файл, который будет служить в качестве буфера. Я буду использовать некоторый код, который я нашел, чтобы захватить фреймы и сохранить их в файл сам, обертывая в конце. Когда пользователь хочет сохранить часть, я помечаю ее указателями на начало и конец в буфере. Запись может продолжаться по-прежнему, пропуская области, отмеченные для сохранения.

После остановки записи или, возможно, во время фонового потока (в зависимости от скорости телефона/карты) я скопирую отмеченную область в другой файл и удалю защиту перезаписи.

Основной вопрос, если вы не заботитесь о деталях выше: Я не могу найти способ конвертировать отдельные кадры в видеофайл в Android SDK. Является ли это возможным? Если нет, есть ли доступные библиотеки, возможно, в собственном коде, которые могут это сделать?

Мне действительно не нужен большой буфер несжатых фреймов, но экспортированные видео должны быть сжаты в дружественном для Android формате. Но если есть способ сжать буфер, я хотел бы услышать об этом.

Спасибо.

4b9b3361

Ответ 1

В Android MediaRecorder есть два способа указать вывод. Один - это имя файла, а другое - FileDescriptor.

Используя статический метод fromSocket of ParcelFileDescriptor, вы можете создать экземпляр ParcelFileDescriptor, указывающий на сокет. Затем вызовите getFileDescriptor, чтобы передать FileDescriptor в MediaRecorder.

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