Самый быстрый способ сделать OpenCV обработки и записи видео с камеры на Android?

Я видел вопрос записи видео с камеры параллельно с обработкой OpenCV на Android о похожей проблеме, но он не ответил. Я вижу две возможности:

  1. записывать видео с камеры, используя стандартный инструмент Android MediaRecorder и одновременно обрабатывать массив byte[] с OpenCV в previewCallback.

  2. Записывайте видео с помощью MediaCodec, как в проекте Gragika, https://github.com/google/grafika. Во время записи используйте glReadPixels из текстуры и вставьте ее в OpenCV Mat для обработки.

Что может быть лучше или, может быть, существует другой подход?

1 ответ

Я разработал это.

Для первого пути вы упомянули:

  1. Заблокируйте камеру перед подготовкой MediaRecorder.

  2. Заблокировать камеру вызова reconnect() сразу после mediaRecorder's start() метод.

Тем не менее, начиная с уровня API 14, камера может автоматически разблокироваться после вызова start() так что на самом деле вам не нужно reconnect(),

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

Но из моих экспериментов кадры из обратного вызова предварительного просмотра и кадры, записанные MediaRecorder, являются асинхронными. Так что сложно гарантировать кадровую синхронизацию, если вам нужно.

Для второго способа: у вас есть полный контроль над кадрами.

Благодаря проекту Фаддена мне удалось записать, выполняя обработку изображений, используя MediaCodec для кодирования видеокадров из обратного вызова предварительного просмотра и передачи данных предварительного просмотра на собственный слой через JNI для обработки изображений с OpenCV.

Следует отметить, что для эффективности в реальном времени вы должны выполнить обработку в другом потоке и обеспечить синхронизацию с потоком кодирования.

Другие вопросы по тегам