2017-02-10 19 views
0

Как я уже говорил в предыдущем посте, я работаю над мобильным приложением Android, ориентированным на визуализацию камеры заднего вида в реальном времени (в частности, я работаю на DJI Phantom 3 Professional с относительным SDK), используя структуру Wikitude для части AR. Благодаря Alex's response, я реализовал свой собственный Wikitude Input Plugin в сочетании с dji's Video Stream Decoding.как получить данные NV21 от камеры DJI Phantom 3 Professional drone

У меня есть некоторые проблемы сейчас. Прежде всего, демоверсия DJI Video Stream Decoding использует FFmpeg для разбора кадров видео и MediaCodec для аппаратного декодирования. Таким образом, он помогает анализировать видеокадры и декодировать данные необработанного видеопотока с камеры DJI и выводить данные YUV. Вы посоветовали мне «получить необработанные видеоданные из dji sdk и передать их в SDK Wikitude»: поскольку для входа в Plugitude Plugin нужен формат YUV 420, который соответствует стандарту NV21, чтобы обеспечить пользовательскую камеру, я должен передать ему вывод данных YUV MediaCodec, правильно?

Об этом пункте я попытался извлечь байтовые буферы из вывода MediaCodec (и это возможно, установив параметр Surface в null в метод configure(), который имеет эффект для вызова обратного вызова и передачи его внешнему прослушивателю), но у меня есть некоторые проблемы с цветами в визуализации, потому что цвет закодированного видео не подходит (синий и красный, кажется, меняются на противоположные, и при движении камеры слишком много шума). (обратите внимание, что когда я передайте Surface not null, после инструкции codec.releaseOutputBuffer (outIndex, true), MediaCodec отображает на ней кадры и показывает видеопоток должным образом, но мне нужно передать видеопоток в плагин Wikitude, и поэтому я должен установить поверхность на null).

Я попытался установить другой MediaFormat.KEY_COLOR_FORMAT, но ни один из них не работает должным образом. Как я могу решить этот вопрос?

ответ

0

При декодировании в байтовые буферы с MediaCodec вы не можете решить, какой формат цвета использует буфер; декодер решает, и вам приходится иметь дело с ним. Каждый декодер может использовать другой формат; некоторые из них могут быть стандартным форматом, например COLOR_FormatYUV420Planar (соответствует I420) или COLOR_FormatYUV420SemiPlanar (что соответствует NV12 - не NV21), в то время как другие могут использовать полностью проприетарные форматы.

См., Например, https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#401 для примера о форматах, которые поддерживает декодер, которые поддерживаются, и https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java#963 для ссылки, показывающей, что для декодеров нормально возвращать частные форматы.

Вы можете посмотреть, например, http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/omxil/qcom.c;h=301e9150ae66075ca264e83566504802ed57578c;hb=bdc690e9c0e2516c00a6d3733a77a87a25d9b6e3 для примера о том, как интерпретировать один общий фирменный цветной формат.

 Смежные вопросы

  • Нет связанных вопросов^_^