【5.8版本前的视频流解码】
MSDK V4的解码器的表现普遍被认为比DJI Pilot要差,且它有很多缺点:
- 经常发生卡顿、马赛克、丢包等现象。
- 在Surface上渲染画面和导出YUV数据无法同时进行。
- 无法通过后台获取视频流。
- 每次开机需要设置视频源,否则黑屏。
- getPrimaryVideoFeed获取到得是DJI格式的H.264数据,还得送到DJICodecManager里进行组帧,再从providedTranscodedVideoFeed中获取组帧后的标准H.264数据。
MSDK V5的图传代码和解码器被重构了,它的特点是:
- 对码流通道做出了自适应,码流通道(VideoChannelType)一共有三个,一般主相机会被设置为PRIMARY_STREAM_CHANNEL,FPV和PSDK相机使用另外两个通道。
PRIMARY_STREAM_CHANNEL 主码流。优先级最高的码流类型,当传输带宽不足时将首先保证主码流通道中的数据传输。 SECONDARY_STREAM_CHANNEL
副码流。码流传输优先级仅次于主码流通道。 EXTENDED_STREAM_CHANNEL
扩展码流通道。码流传输优先级最低,当带宽不足时,容易发生丢包现象。 - 使用非常简单,只需要识别到可用的码流源和码流通道后,把他们进行绑定后就可以使用了,调用顺序示意图可见下图:
- 当你使用SDK的解码器IVideoDecoder进行解码时,需要调用VideoDecoder的构造函数。VideoDecoder提供了7个构造函数,如果你有直播的需求,使用下面这个构造函数。
/** 注意:
* 1. 如果开发者通过构造函数自行设置解码器的宽(width)和高(height),需要保证设置的宽和高是16的倍数。
* 2. outputSurface建议使用SurfaceView。
* 3. 如果想既在outputSurface中渲染,又获取YUV数据,你需要创建两个VideoDecoder,他们的VideoChannelType一致,DecoderOutputMode分别设置SURFACE_MODE和YUV_MODE即可。
* 4. isForLiveStream决定LiveStreamManager是否会从VideoDecoder中获取视频流进行直播推流。
*/
public VideoDecoder(Context context, VideoChannelType channelType, DecoderOutputMode outputMode, Object outputSurface, int width, int height, boolean isForLiveStream) - 通过addYuvDataListener可以获取到YUV数据格式。
- 通过addStreamDataListener得到的数据为标准H.265数据。
- MSDK v5输出地是H.265码流。
- 拿到标准的H.265数据后你可以导入到AI识别的库或者自己开发推流直播功能。
- 允许同时获取两个相机的YUV数据,又同时渲染两个Surface。
- YUV数据可以被保存成JPEG格式,每次回调保存一次就成了截图。
【5.8版本的改动】
5.8版本对之前版本的视频流解码进行了重构,下面将介绍5.8版本该如何实现解码。
对于新版本视频流解码所使用的接口,开发者可以查看官网给出的迁移文档。文档介绍了新版接口的含义并和旧版接口进行了对比。迁移文档地址:https://developer.dji.com/doc/mobile-sdk-tutorial/cn/tutorials/video-stream/video-stream2.html
1.5.8版本在通过addReceiveStreamListener和addStreamDataListener设置监听拿到的视频流数据格式均为H264,且都均匀包含I帧。
2.addFrameListener可以传入需要获取的YUV格式,目前支持YUV420_888、YUV444_888、YUY2、NV21和RGBA_8888这五种格式。
3.putCameraStreamSurface可以传入scaleType去控制画面的显示效果,目前支持拉伸铺满、裁剪适应铺满和缩放使用三种模式。
4.putCameraStreamSurface支持SurfaceView、TextureView和MediaCodeC的surface,不支持GLSurfaceView的surface以及任何和OpenGL绑定的surface。
5.putCameraStreamSurface可用于更新接口参数。
评论
5 条评论
你好,我在StreamDataListener中获得H265视频流,对IVideoFrame.data用ffmpeg解码,提示不可用的视频数据,请问有什么好办法吗
FFMPEG的参数设置错误了吧,你得自己研究一下。可以解的。
你好,我在StreamDataListener中获得H265视频流,对IVideoFrame.data用ffmpeg解码,会花屏,有时使用FFMPEG解码失败并提示“moov atom not found”,请问如何处理呢,是IVideoFrame.data缺少IFrame吗?如何主动请求IFrame呢?
在M300上升级5.3.0之后,startChannel 一直失败,ErrorImp{errorType='VIDEO', errorCode='VIDEO_CHANNEL_IS_ALREADY_OPENED', innerCode='null', description='null', hint='null'},5.2.0是好好的
楼上的问题解决了吗?为啥StreamDataListener中获取到的VideoFrame.data不能解码?另外我们获取到的data中没有I帧数据 seqnumber也是-1 这个数据无法解析有关系吗?
请登录写评论。