Запись видео в кольцевой буфер на Android - PullRequest
10 голосов
/ 23 января 2012

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

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

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

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

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

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

Спасибо.

1 Ответ

8 голосов
/ 31 января 2012

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

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

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

...