大疆Mobile SDK初步开发
1. 从MSDK示例代码开始
-
配置代码运行环境
(1)下载Moblie SDK:DJI MSDK下载。
(2)准备Android开发环境,推荐使用Android Studio 2.1.1以上版本。官网下载网址:Download Android Studio或者 Android Studio -
从GitHub上下载Android demo project:Mobile-SDK-Android 。
-
在大疆官网创建APP KEY。在大疆官网的个人中心的应用一栏中可以生成APP KEY
-
在创建界面需要注意的是Package Name中需要填写的是实际代码程序中的包名,其余选项随意填写
- 创建完成后点击打开示例代码中的Manifests->AndroidManifests.xml文件,把App key粘贴到android:value后
- 连接手机,手机打开USB调试模式,如果Android Android未查询到手机可以在命令提示符中查询adb devices,没有显示连接设备则说明手机未安装adb 驱动
-
点击run运行程序。
-
手机连接无人机遥控器测试APP.
2. 进行视频流的接收
-
在大疆官网文档中详细的介绍了如何完成一个对无人机视频流进行解码:Android Video Stream Decoding Sample - DJI Mobile SDK Documentation.
-
1.初始化一个NativeHelper的实例对象,来监听来自无人机高空的视频数据。 2.将原始的H.264视频数据送入FFmpeg中解析。 3.将解析完成的视频数据从FFmpeg中取出,并将解析后的数据缓存到图像帧序列中 4.将MediaCodec作为一个解码器,然后对视频中的I帧进行捕获。 5.解码完成后,可为MediaCodec的输出数据配置一个TextureView或SurfaceView用来对视频画面进行预览,或者调用监听器对解码数据进行监听完成其他操作。 6.释放FFmpeg和MediaCodec资源。
-
通过上述流程我们能够知道要能够在设备上显示无人机相机画面大体上分为三步:接受无人机视频流、对视频流解码以及把解码后数据输出画面。那么为什么要把无人机传输过来的视频解码为YUV格式呢?
-
原因是在Android系统中,图像是以YUVImage的格式传递的,因此,在存储数据的时候我们就需要使用YUV图像格式。
-
我们可以下载官网给出的 sample project:Github Page ,在项目代码中大疆给出了两种进行解码的方式:利用大疆自己编写的DJIViedeoStreamDecoder解码器以及利用之前大疆就编写好的DJICodecManager解码器。在布局中分别在livestream_preview_ttv和livestream_preview_sf中显示画面。
-
在代码meida的DJIVideoStreamDecoder.java文件中我们可以看到初始化解码器MediaCodec的源代码:
-
/** * Initialize the hardware decoder. */ private void initCodec() { if (width == 0 || height == 0) { return; } if (codec != null) { releaseCodec(); } loge("initVideoDecoder----------------------------------------------------------"); loge("initVideoDecoder video width = " + width + " height = " + height); // create the media format MediaFormat format = MediaFormat.createVideoFormat(VIDEO_ENCODING_FORMAT, width, height); if (surface == null) { logd("initVideoDecoder: yuv output"); // The surface is null, which means that the yuv data is needed, so the color format should // be set to YUV420. format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); } else { logd("initVideoDecoder: display"); // The surface is set, so the color format should be set to format surface. format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); } try { // Create the codec instance. codec = MediaCodec.createDecoderByType(VIDEO_ENCODING_FORMAT); logd( "initVideoDecoder create: " + (codec == null)); // Configure the codec. What should be noted here is that the hardware decoder would not // output any yuv