【问题标题】:how to retrieve NV21 data from DJI camera Phantom 3 Professional drone如何从 DJI 相机 Phantom 3 Professional 无人机中检索 NV21 数据
【发布时间】:2017-06-28 15:21:58
【问题描述】:

正如我在上一篇文章中所描述的,我正在开发一个 Android 移动应用程序,该应用程序面向无人机相机视图的实时增强可视化(特别是我正在开发具有相关 SDK 的 DJI Phantom 3 Professional),使用AR 部分的 Wikiitude 框架。感谢Alex's response,我结合dji's Video Stream Decoding实现了自己的Wikitude Input Plugin

我现在有一些问题。首先,《大疆的视频流解码》demo使用FFmpeg进行视频帧解析,使用MediaCodec进行硬件解码。因此,它有助于解析视频帧并解码来自 DJI Camera 的原始视频流数据并输出 YUV 数据。您建议我“从 dji sdk 获取原始视频数据并将其传递给 Wikitude SDK”:由于 Wikitude 输入插件需要 YUV 420 格式,为了提供自定义相机,我应该符合 NV21 标准把 MediaCodec 的 YUV 数据输出传给它吧?

关于这一点,我尝试从 MediaCodec 输出中检索字节缓冲区(这可以通过在 configure() 方法中将 Surface 参数设置为 null 来实现,这具有调用回调并将其传递给外部侦听器的效果) ,但是我在可视化中遇到了一些关于颜色的问题,因为编码的视频颜色不正确(蓝色和红色似乎颠倒了,相机移动时噪音太大)..(请注意,当我通过时Surface 不为空,在指令 codec.releaseOutputBuffer(outIndex, true) 之后,MediaCodec 会在其上渲染帧并正确显示视频流,但我需要将视频流传递给 Wikitude 插件,因此我必须将表面设置为 null)。

我尝试设置不同的 MediaFormat.KEY_COLOR_FORMAT 但它们都不能正常工作。我该如何解决这个问题?

【问题讨论】:

    标签: android android-mediacodec yuv wikitude dji-sdk


    【解决方案1】:

    当使用 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 举例说明如何解释一种常见的专有颜色格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多