Skip to main content

相机功能实现教程

1.概述

使⽤Autel SDK 拍摄照⽚和视频,可以选择很多不同的参数设置,分辨率,帧率,曝光设置,图⽚设 置和⽂件类型,本教程旨在帮助您基本了解Autel SDK 相机相关接⼝的使⽤。 我们将实现三个基本相 机功能:拍照 和 视频录制 以及相机参数设置。 下⾯以Autel SDK demo为例讲解如何进⾏拍照、录像、参数设置功能开发。

2.Android Studio 配置⼯程

2.1 新建⼀个Android⼯程

2.2 导⼊aar包

将aar包复制到⼯程的libs⽬录下,并在build.gradle中添加以下代码,如图所示:

repositories {
flatDir {
dirs 'libs'
}
}
implementation(name: 'libqxwz_release_v1.1.0', ext: 'aar')

2.3 基础权限申请,在AndroidManifest.xml文件中添加以下元素

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

3.快速开始

3.1 相机接口类获取,以demo里面的CameraBaseFragment为例:

AutelBaseCamera baseCamera;
baseCamera = ((CameraActivity) getActivity()).getCurrentCamera();

获取到AutelBaseCamera,我们可以对相机进行一系列的设置。

3.2 相机接口类AutelBaseCamera以及方法介绍

 /**
* 设置相机模式回调监听
* @param var1
*/
void setMediaModeListener(CallbackWithOneParam<MediaMode> var1);

/**
* SD卡状态监听
* @param var1
*/
void setSDCardStateListener(CallbackWithOneParam<SDCardState> var1);

/**
* 设置相机动作监听
* @param var1
*/
void setMediaStateListener(CallbackWithTwoParams<MediaStatus, String> var1);

/**
* 设置相机动作完成的监听
* @param var1
*/
void setMediaStateWithIdListener(CallbackWithThreeParams<MediaStatus, String, String> var1);

/**
* 格式化SD卡
* @param var1
*/
void formatSDCard(CallbackWithNoParam var1);

/**
* 重置相机设置
* @param var1
*/
void resetDefaults(CallbackWithNoParam var1);

/**
* 获取相机工作状态
* @param var1
*/
void getWorkState(CallbackWithOneParam<WorkState> var1);

/**
* 获取SD卡的状态
* @param var1
*/
void getSDCardState(CallbackWithOneParam<SDCardState> var1);

/**
* 获取SD卡的内存
* @param var1
*/
void getSDCardFreeSpace(CallbackWithOneParam<Long> var1);

/**
* 获取相机型号
* @return
*/
CameraProduct getProduct();

/**
* 获取相机版本
* @param var1
*/
void getVersion(CallbackWithOneParam<String> var1);

/**
* 设置相机的工作模式
* @param var1 相机模式
* @param var2
*/
void setMediaMode(MediaMode var1, CallbackWithNoParam var2);

/**
* 获取相机的模式
* @param var1
*/
void getMediaMode(CallbackWithOneParam<MediaMode> var1);

/**
* 启动拍照
* @param var1
*/
void startTakePhoto(CallbackWithNoParam var1);

/**
* 启动录像
* @param var1
*/
void startRecordVideo(CallbackWithNoParam var1);

/**
* 停止录像
* @param var1
*/
void stopRecordVideo(CallbackWithNoParam var1);

/**
* 停止拍照
* @param var1
*/
void stopTakePhoto(CallbackWithNoParam var1);

/**
* 获取当前录像的时间
* @param var1
*/
void getCurrentRecordTime(CallbackWithOneParam<Integer> var1);

/**
* 获取状态信息
* @param var1
*/
void getStateInfo(CallbackWithOneParam<BaseStateInfo> var1);

/**
* 设置相机界面模式
* @param var1 相机界面模式
* @param var2
*/
void setCameraPattern(CameraPattern var1, CallbackWithNoParam var2);

/**
* 拍照是否锁定云台
* @param var1 是否锁定
* @param var2
*/
void lockGimbalWhenTakePhoto(AutelSwitchState var1, CallbackWithNoParam var2);

/**
* 设置GPS坐标系
* @param var1 坐标系 WGS84(0),CGCS2000(1),UNKNOWN(-1);
* @param var2
*/
void setGpsCoordinateType(int var1, CallbackWithNoParam var2);

/**
* 获取GPS坐标系
* @param var1
*/
void getGpsCoordinateType(CallbackWithOneParam<Integer> var1);

/**
* 获取SD卡信息
* @param var1
*/
void getSDCardInfo(CallbackWithOneParam<SdCardInternal> var1);

/**
* 获取机载闪存信息
* @param var1
*/
void getFlashCardInfo(CallbackWithOneParam<FlashCardInternal> var1);

/**
* 设置照片标定格式
* @param mode 0 pix4D,1 默认
* @param var2
*/
void setCalibrationFormat(int mode, CallbackWithNoParam var2);

/**
* 获取照片标定格式
* @param var1
*/
void getCalibrationFormat(CallbackWithOneParam<Integer> var1);

在相机拍照/录像前,我们可以使用AutelBaseCamera对相机进行一系列的参数设置,设置接口的回调函数分别为CallbackWithNoParam、CallbackWithOneParam:

public interface CallbackWithNoParam extends FailedCallback {
void onSuccess();
}
public interface CallbackWithOneParam<T> extends FailedCallback {
void onSuccess(T var1);
}
public interface FailedCallback {
/**
* Invokes this method when call back has failed.
* @param error the error object.
*/
void onFailure(AutelError error);
}

3.3 相机工作状态WorkState类介绍

WorkState {
//空闲状态
IDLE("idle", "Idle"),
//拍照
CAPTURE("capture", "TakingPhoto"),
//录像
RECORD("record", "Recording"),
//录像过程中拍照
RECORD_PHOTO_TAKING("record_taking", "Recording_taking"),
//未知状态
UNKNOWN("unknown", "unknown");
}

3.4 相机界面模式介绍CameraPattern

CameraPattern{
MANUAL_FLIGHT(0),//手动飞行
MISSION_FLIGHT(1),//任务飞行
INTELLIGENT_TRACKING(2),//智能跟踪(和手势识别,指点飞行)
DELAYED_PHOTOGRAPHY(3),//延时摄影
VISUAL_ORBIT(4),//环绕飞行
PANORAMA(5),//全景拍照
MISSION_RECORD(6),//任务录制
TRAFFIC_POLICE(7),//交警项目
SHORT_VIDEO(9),//短片模式
NIGHT(11), //夜景模式
UNKNOWN(-1)
}

通过此接口设置相机界面模式:

 mAutelBaseCamera.setCameraPattern(cameraPattern, new CallbackWithNoParam() {
@Override
public void onSuccess() {
logOut("setCameraPattern onSuccess");
}
@Override
public void onFailure(AutelError error) {
logOut("setCameraPattern fail " + error.getDescription());
}
});

3.5 相机模式设置,相机支持的模式

可以根据需求设置切换相机的模式,设置方法如下:

  protected MediaMode mediaMode = MediaMode.SINGLE;
AutelBaseCamera baseCamera = ((CameraActivity) getActivity()).getCurrentCamera();
baseCamera.setMediaMode(mediaMode, new CallbackWithNoParam() {
@Override
public void onFailure(AutelError error) {
logOut("setMediaMode description " + error.getDescription());
}

@Override
public void onSuccess() {
logOut("setMediaMode state onSuccess");
}
});

MediaMode参数说明:

//单拍
SINGLE("singal", "Single")
//录像
VIDEO("video", "Record")
//定时拍摄
TIMELAPSE("timelapse", "Timelapse")
//连拍
BURST("burst", "Burst")
//AEB
AEB("aeb", "AEB")
//HDR
HDR("hdr", "HDR")
//MFNR 纯净夜拍
MFNR("mfnr", "MFNR")
//延时拍摄
MOTION_DELAY_SHOT("MotionDelayShot", "MotionDelayShot")
//未知工作模式
UNKNOWN("unknown", "");

3.6 实现拍摄功能

启动拍照之前,需要对下面几种状态进行判断:

  /**
* 判断相机是否处于拍照模式下
*/

MediaMode mode = MediaMode.find(getCameraMode());
if (MediaMode.BURST != mode &&
MediaMode.AEB != mode &&
MediaMode.SINGLE != mode &&
MediaMode.TIMELAPSE != mode) {
//非拍照模式
return;
}

/**
* 检查是否处于空闲状态
*/
WorkState cameraWorkState = WorkState.find(getWorkStatus());
if (WorkState.IDLE != cameraWorkState) {
//相机正在工作
return;
}

/**
* 检查SDCard是否正常
*/
SDCardState sdCardState = SDCardState.find(getSdCardStatus());
if (sdCardState != SDCardState.CARD_READY && sdCardState != SDCardState.LOW_SPEED_CARD) {
//SD卡异常
return;
}

实现拍照功能:

AutelBaseCamera  baseCamera = ((CameraActivity) getActivity()).getCurrentCamera();
@Override
public void onClick(View v) {
baseCamera.startTakePhoto(new CallbackWithNoParam() {
@Override
public void onFailure(AutelError error) {
logOut("startTakePhoto " + error.getDescription());
}

@Override
public void onSuccess() {
logOut("startTakePhoto onSuccess");
}
});
}
});

3.7 实现停止拍照

@Override
public void onClick(View v) {
baseCamera.startTakePhoto(new CallbackWithNoParam() {
@Override
public void onFailure(AutelError error) {
logOut("startTakePhoto " + error.getDescription());
}

@Override
public void onSuccess() {
logOut("startTakePhoto onSuccess");
}
});
}
});

3.8 实现录像功能

在启动录像功能之前需要对以下几种状态进行判断:

/**
* 判断相机是否处于录像模式
*/
MediaMode mode = MediaMode.find(getCameraMode());
if (MediaMode.VIDEO != mode) {
//非录像模式
return;
}
/**
* 检查是否处于空闲状态
*/
WorkState cameraWorkState = WorkState.find(getWorkStatus());
if (WorkState.IDLE != cameraWorkState) {
//相机正在工作
return;
}

/**
* 检查SDCard是否正常
*/
SDCardState sdCardState = SDCardState.find(getSdCardStatus());
if (sdCardState != SDCardState.CARD_READY && sdCardState != SDCardState.LOW_SPEED_CARD) {
//SD卡异常
return;
}

启动录像功能:

baseCamera.startRecordVideo(new CallbackWithNoParam() {
@Override
public void onFailure(AutelError error) {
logOut("startRecordVideo " + error.getDescription());
}

@Override
public void onSuccess() {
logOut("startRecordVideo onSuccess");
}
});

3.9 停止录像实现

baseCamera.startRecordVideo(new CallbackWithNoParam() {
@Override
public void onFailure(AutelError error) {
logOut("startRecordVideo " + error.getDescription());
}

@Override
public void onSuccess() {
logOut("startRecordVideo onSuccess");
}
});

至此,SDK拍摄录像的使用已经介绍完成,希望您喜欢本教程,并继续关注我们的下一个教程!