正如我在上一篇文章中所描述的那样,我正在开发一款Android移动应用程序,该应用程序面向无人机摄像机视图的实时增强可视化(特别是我在DJI Phantom上工作) 3专业版与相关SDK),使用Wikitude框架为AR部分。感谢Alex's response,我将自己的Wikitude Input Plugin与dji's Video Stream Decoding结合使用。
我现在有些问题。首先," DJI的视频流解码" demo使用FFmpeg进行视频帧解析,使用MediaCodec进行硬件解码。因此,它有助于解析视频帧并解码来自DJI Camera的原始视频流数据并输出YUV数据。您建议我从dji sdk获取原始视频数据并将其传递给Wikitude SDK":因为Wikitude输入插件需要YUV 420格式,安排符合NV21标准,以便提供自定义相机,我应该传递给MediaCodec的YUV数据输出,对吧?
关于这一点,我尝试从MediaCodec输出中检索字节缓冲区(这可以通过将Surface参数设置为null到configure()方法来实现,这可以调用回调并将其传递给外部侦听器) ,但是我在可视化方面遇到了一些关于颜色的问题,因为编码的视频颜色不正确(蓝色和红色似乎相反,相机移动时噪点太大)..(请注意,当我传递一个Surface not null,在指令codec.releaseOutputBuffer(outIndex,true)之后,MediaCodec渲染帧并正确显示视频流,但我需要将视频流传递给Wikitude Plugin,所以我必须将surface设置为null)
我尝试设置不同的MediaFormat.KEY_COLOR_FORMAT但它们都没有正常工作。我该如何解决这一点?
答案 0 :(得分: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有关如何解释一种常见专有颜色格式的示例。