Skip to main content

视频解码功能实现教程

1. 概述

​ 使⽤Autel SDK对视频流进行解码,可以选择自定义AutelCodecView或SDK视频解码服务监听的两种方式来实现视频解码功能,本教程旨在帮助您基本了解Autel SDK 上述两种视频解码方式的实现。我们将实现通过自定义AutelCodecView直接显示飞行器相机实时传送的视频数据以及使用视频解码服务提供的数据监听接口获取的解码后的数据。

2. 具体实现

2.1 自定义AutelCodecView显示实时飞行器摄像头视频方式

2.1.1 自定义AutelCodecView引入

通过布局文件,在对应文件中添加以下代码,如下所示:

<com.autel.sdk.widget.AutelCodecView 

android:layout_width="match_parent"

android:layout_height="match_parent" />

或者 通过AutelCodecView实例化对象的方式

AutelCodecView autelCodeView = new AutelCodecView(CodecActivity.this);

2.1.2 AutelCodecView对应API接口说明

/**
* 开始解码
*
* @param texture 渲染对应的纹理
*
* @param surfaceWidht 纹理宽度
*
* @param surfaceHeight 纹理高度
*
* @param useOpenGL 是否启用openGL渲染
*/
void startDecode(SurfaceTexture texture,int surfaceWidth,int surfaceHeight,boolean useOpenGL);

/**
*
* 渲染暂停
*/
void pause();

/**
* 恢复渲染
*/
void resume();

/**
* 设置渲染帧回调监听
*
* @param listener渲染帧信息回调对象
*/
void setOnRenderFrameInfoListener(OnRenderFrameInfoListener listener);

/**
*
* 设置是否开启过度曝光以及过度曝光背景
*
* @param enbale 是否开启过度曝光
*
* @param resId 开启过度曝光时,对应加载的资源Id
*/
void setOverExposure(boolean enable,int resId);

/**
*
* 设置改变渲染的宽、高值
*
* @param surfaceWidht 宽度
*
* @param surfaceHeight 高度
*/
void surfaceSizeChanged(int surfaceWidth,int surfaceHeight);

/**
*
* 设置停止解码
*/
void stopCodec();

2.1.3 OnRenderFrameInfoListener抽象接口方法

/**
* 当前渲染帧的pts回调
* @param pts pts值回调
*/
void onRenderFrameTimestamp(long pts);

/**
* 当前渲染帧的宽、高值回调
* @param width回调当前视频的宽度值
* @param height 回调当前视频高度值
*/
void onRenderFrameSizeChanged(int width,int height);

2.2 通过AutelCodec接口实现视频码流监听

2.2.1 AutelCodec对象生成

通过BaseProducet类中getCodec方法直接获取对象

BaseProduct product;

...

AutelCodec codec = product.getCodec();

2.2.2 AutelCodec对应API

/**
* 设置解码监听回调
* @param listener 解码回调监听对象
* @param handler
*/
void setCodecListener(AutelCodecListener listener,Handler handler);

/**
* 设置取消解码
*/
void cancel();

2.2.3 AutelCodecListener监听接口

/**
* 视频流数据回调
* @param videoBuffer 视频流数据
* @param isIFrame 是否关键帧
* @param size 视频流大小
* @param pts 当前视频帧对应的pts
*/
void onFrameStream(byte[] videoBuffer,boolean isIFrame,int size,long pts);

/**
* 当前视频解码方式被取消回调
*/
void onCanceled();