Самый быстрый способ сделать OpenCV обработки и записи видео с камеры на Android?
Я видел вопрос записи видео с камеры параллельно с обработкой OpenCV на Android о похожей проблеме, но он не ответил. Я вижу две возможности:
записывать видео с камеры, используя стандартный инструмент Android MediaRecorder и одновременно обрабатывать массив byte[] с OpenCV в previewCallback.
Записывайте видео с помощью MediaCodec, как в проекте Gragika, https://github.com/google/grafika. Во время записи используйте glReadPixels из текстуры и вставьте ее в OpenCV Mat для обработки.
Что может быть лучше или, может быть, существует другой подход?
1 ответ
Я разработал это.
Для первого пути вы упомянули:
Заблокируйте камеру перед подготовкой MediaRecorder.
Заблокировать камеру вызова
reconnect()
сразу после mediaRecorder'sstart()
метод.
Тем не менее, начиная с уровня API 14, камера может автоматически разблокироваться после вызова start()
так что на самом деле вам не нужно reconnect()
,
- Установить предварительный просмотр обратного вызова. использование
setPreviewCallbackWithBuffer()
и установите более одного буфера обратного вызова, если вы хотите достичь более высокой частоты кадров.
Но из моих экспериментов кадры из обратного вызова предварительного просмотра и кадры, записанные MediaRecorder, являются асинхронными. Так что сложно гарантировать кадровую синхронизацию, если вам нужно.
Для второго способа: у вас есть полный контроль над кадрами.
Благодаря проекту Фаддена мне удалось записать, выполняя обработку изображений, используя MediaCodec для кодирования видеокадров из обратного вызова предварительного просмотра и передачи данных предварительного просмотра на собственный слой через JNI для обработки изображений с OpenCV.
Следует отметить, что для эффективности в реальном времени вы должны выполнить обработку в другом потоке и обеспечить синхронизацию с потоком кодирования.