0

正如我在上一篇文章中所描述的,我正在开发一个 Android 移动应用程序,该应用程序面向无人机摄像头视图的实时增强可视化(特别是我正在开发带有相关 SDK 的 DJI Phantom 3 Professional),使用 Wikiitude 框架AR部分。感谢Alex 的回复,我结合dji 的 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 时不是null,在 codec.releaseOutputBuffer(outIndex, true) 指令之后,MediaCodec 在其上渲染帧并正确显示视频流,但我需要将视频流传递给 Wikitude 插件,因此我必须将表面设置为 null)。

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

4

1 回答 1

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=bdc690e9c0e2516c00a6d3733a77a87a25d9b6e关于如何解释一种常见的专有颜色格式。

于 2017-02-10T11:33:01.453 回答