通過閱讀本文,您可以快速接入 IDRS SDK,實現遠程雙錄的相關功能,關于遠程雙錄的更多信息請參見 概述。
前提條件
在接入 IDRS SDK 遠程雙錄之前,請確保您已完成以下操作:
申請阿里云公有云用戶,并開通金融云賬號。
購買并開通智能雙錄質檢服務。
在控制臺中為登錄用戶創建 AK/SK,并獲取用戶的 AK/SK 信息。
關于如何使用 SDK 的更多信息請參見 新用戶如何開始使用手機端 SDK。
如果您在遠程雙錄中使用水印功能,請確保已在控制臺中創建水印,更多信息請參見 創建水印。
創建項目工程
打開 Android Studio IDE,用 Android Studio 創建一個項目工程。
Android Studio 下載地址請參見 Android Studio 下載文件歸檔。
接入 IDRS
配置項目環境
在根目錄下的 build.gradle 中添加 Maven 源。
buildscript { ext.mpaas_artifact = "mpaas-baseline" ext.mpaas_baseline = "10.2.3-8" } allprojects { repositories { //... maven { url 'http://mvn.cloud.alipay.com/nexus/content/repositories/releases/' name 'alipay' credentials { username 'mvn_read_ws' password 'mrk8929' } } //... } }
在應用目錄下的 build.gradle(:app) 中引入依賴。
在應用目錄下的
AndroidManifest.xml
中為 IDRS SDK 申請權限。<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.microphone" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
defaultConfig{
ndk {
abiFilters "armeabi","armeabi-v7a", "arm64-v8a"
//如果要設置指定abi 在初始化之前調用IdrsSdk.getInstance().setOsType();
}
}
dependencies {
implementation platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
implementation ('com.mpaas.android:idrs')//雙錄原子能力庫
implementation 'com.aliyun.openservices:aliyun-log-android-sdk:2.6.2'//日志庫
implementation 'com.squareup.okhttp3:okhttp:3.11.0'//網絡庫
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'//網絡庫
implementation "com.alibaba:fastjson:1.1.54.android"http://json庫
}
IDRS 使用流程
初始化 IDRS
路徑:com.mpaas.idrs.IdrsSdk#init
初始化方法僅對 IDRS SDK 初始化所在的 activity 進行前臺監聽,因此為了精確地計算使用時長,您可以在 Application onCreate 中調用初始化方法。
IdrsAppLifecycle.init(this);
在所需場景中初始化 IDRS SDK 的方法如下:
/**
* 初始化
* @param idrsParams 用戶數據
* @param sdkInitCallBack 創建回調 成功(可獲取artvc實例設置監聽)/失敗
* @param progressCallBack 資源下載進度,不使用動態獲取資源可以不傳
*/
public void init(Context context,
IdrsParams idrsParams,
SdkInitCallBack sdkInitCallBack,
SdkResourceProgress progressCallBack)
/**
* sAppId 控制臺獲取
* AK 控制臺獲取
* SK 控制臺獲取
* sUid 身份標識、推薦數字、字母
* sType IdrsSdk.TYPE_REMOTE 遠程 IdrsSdk.TYPE_LOCAL 本地
* sSecurityToken 定制版本密鑰,阿里云用戶直接傳null
* engineTypes 使用的模塊
*/
public class IdrsParams {
public String sAppId;
public String AK;
public String SK;
public String sUid;
public String sType;
public String sSecurityToken;
public Set<EngineType> engineTypes;
}
public interface SdkInitCallBack {
void success();
void fail(String message);
}
public interface SdkResourceProgress {
void progress(int progress);
}
/**
* 智能雙錄包含的引擎模塊
*/
public enum EngineType {
AUDIO_DETECT_ENGINE, //語音識別
FACE_DETECT_ENGINE, //人臉檢測
HAND_DETECT_ENGINE, //手勢識別
OCR_DETECT_ENGINE, //OCR
LOCAL_RECORDE_ENGINE, //本地錄制
}
動態獲取資源文件
//設置動態獲取資源
implementation platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
implementation ('com.mpaas.android:idrs') {
exclude module:'idrs-dynamic-res-local-pkg-build' //云端資源本地包模塊
}
//默認arm64-v8a 設置指定so庫
public void setABIType(Set<ABIType> abiType)
/**
* @param 下載資源回調
*
*/
public void getSdkResourceData(SdkResourceCallback SdkResourceCallback)
創建房間
路徑:com.mpaas.idrs.IdrsSdk#createRoom
/**
* 創建房間
* @param context Activity Context
* @param sdkInitCallBack 創建回調 成功(可獲取ARTVC實例設置監聽)/失敗
*/
public void createRoom(Context context, final SdkInitCallBack sdkInitCallBack)
獲取 ARTVC 實例
路徑:com.mpaas.idrs.IdrsSdk#getRtcEngineInstance
調用 getRtcEngineInstance 接口可以實現 ARTVC 的相關功能,更多信息請參見 Android 進階功能。
public AlipayRtcEngine getRtcEngineInstance()
加入房間
路徑:com.mpaas.idrs.IdrsSdk#joinRoom
/**
* 加入房間
* @param context Activity Context
* @param roomId 房間號
* @param token 房間密碼
* @param sdkInitCallBack 加入回調 成功/失敗
*/
public void joinRoom(Context context, String roomId, String token, final SdkInitCallBack sdkInitCallBack)
開啟錄制
路徑:com.mpaas.idrs.IdrsSdk#startRTCRecord
/**
* 開啟錄制
* @param waterMarkId 水印ID
*/
public void startRTCRecord(String waterMarkId)
開啟錄制擴展
路徑:com.mpaas.idrs.IdrsSdk#startRTCRecord(java.lang.String, java.lang.String, java.util.Map<java.lang.String,java.lang.String>, com.mpaas.idrs.RecordParam)
/**
* 開啟RTC服務端錄制
* @param waterMarkId 水印ID 傳null則為自定義水印模式
* @param tagFilter 數據流tag 傳null則為合流錄制模式
* @param config 占位符水印顯示配置
* @return RequestId 錄制Id 需要保存后通過stopRTCRecord停止對應流的錄制
* ----------------------------------------------------------------------
* 如果是在createRoom extra參數開啟的錄制,會在onRecordInfo回調給到recordId
* 其余的都在rtcEngine.customRawRequest 調用,在AlipayRtcEngineEventExtendListener的onCustomRawResp透出服務器結果
* requestId = rtcEngine.customRawRequest(MSG_SERVER_RECORD_START,new JSONObject());
* if(requestId == null){
* Log.e(TAG,"customRawRequest faill");
* }
*/
public Long startRTCRecord(String waterMarkId, String tagFilter, Map<String, String> config, RecordParam recordParamObj)
變更錄制配置
路徑:com.mpaas.idrs.IdrsSdk#modifyRTCRecordConfig
/**
* 變更錄制配置
* @param recordId 錄制Id
* @param tagPositions 布局配置
* @param overlaps 水印配置
* @return requestId
*/
public Long modifyRTCRecordConfig(String recordId, TagPositions tagPositions, Overlaps overlaps)
結束錄制
路徑:com.mpaas.idrs.IdrsSdk#stopRTCRecord
/**
* 結束錄制
* @param recordId 錄制ID
* @param reportRequest 上傳錄制參數
* @param callBack 上傳回調 成功/失敗
*/
public void stopRTCRecord(String recordId, UploadReportRequest reportRequest, UploadReportCallBack callBack)
自定義音頻發布
publishConfig.videoSource = VIDEO_SOURCE_NULL;
publishConfig.audioSource = PublishAudioSource.AUDIO_SOURCE_CUSTOM;
publishConfig.customAudioOptions = new CustomAudioOptions();
publishConfig.customAudioOptions.customAudioListener = createRtcCustomAudioListener(publishConfig.videoSource);
rtcEngine.publish( publishConfig );
public RtcCustomAudioListener createRtcCustomAudioListener(PublishVideoSource publishVideoSource){
final String pcmFileName = "licai.pcm";
final InputStream inputStream;
try{
inputStream = getAssets().open(pcmFileName);
}catch (Exception e){
Log.e(TAG,"openfile:"+e.toString());
return null;
}
if(inputStream == null){
Log.e(TAG,"inputStream == null");
return null;
}
CustomAudioListener listener = null;
try {
listener = new CustomAudioListener(inputStream,publishVideoSource);
}catch (RuntimeException e){
Log.e(TAG,e.toString());
e.printStackTrace();
}
if(listener != null){
listener.setVolume(100);
}
return listener;
}
// CustomAudioListener.java
import java.io.InputStream;
import java.nio.ByteBuffer;
import android.util.Log;
import com.alipay.mobile.artvc.constants.PublishAudioSource;
import com.alipay.mobile.artvc.constants.PublishVideoSource;
import com.alipay.mobile.artvc.engine.AlipayRtcEngine;
import com.alipay.mobile.artvc.engine.CustomAudioResult;
import com.alipay.mobile.artvc.engine.RtcCustomAudioListener;
import com.alipay.mobile.artvc.params.UnpublishConfig;
public class CustomAudioListener extends RtcCustomAudioListener {
final public static String TAG = "CustomAudioListener";
private byte[]buffer; //臨時變量
private final AlipayRtcEngine rtcEngine;
private final InputStream inputStream;
private final CustomAudioResult result = new CustomAudioResult(); //返回值
UnpublishConfig unpublishConfig = new UnpublishConfig();
//※※※InputStream僅做demo使用,如果要上線需要考慮io讀取問題。
public CustomAudioListener(InputStream inputStream, PublishVideoSource publishVideoSource){
rtcEngine = AlipayRtcEngine.getOnlyInstance();
if(rtcEngine == null){
throw new RuntimeException("rtcEngine is null");
}
this.inputStream = inputStream;
unpublishConfig.videoSource = publishVideoSource;
}
@Override
public void onCustomAudioRecordStarted(ByteBuffer byteBuffer) {
//初始化ByteBuffer的position等參數,onNeedCustomAudioData可直接向array填寫數據。
//也可以直接通過position、limit等方法初始化。
byteBuffer.rewind();
byteBuffer.put(new byte[byteBuffer.capacity()]);
}
@Override
public void onCustomAudioRecordStopped() {
Log.i(TAG,"onCustomAudioRecordStopped");
unpublishConfig.audioSource = PublishAudioSource.AUDIO_SOURCE_CUSTOM;
rtcEngine.unpublish(unpublishConfig);
}
//返回讀取的數據長度,若返回-1表示結束錄制,將會轉到onCustomAudioRecordStopped()并結束線程。若要重新開始需要重新推流。
@Override
public CustomAudioResult onNeedCustomAudioData(ByteBuffer byteBuffer) {
try{
buffer = byteBuffer.array();
result.lenth = inputStream.read(buffer,byteBuffer.arrayOffset(),byteBuffer.capacity());
if(result.lenth < byteBuffer.capacity()){
Log.i(TAG,"pcm讀取完畢");
result.noMoreAudioData = true;
return result;
}
}catch (Exception e){
Log.e(TAG,"[error]onNeedCustomAudioData:"+e.toString());
result.noMoreAudioData = true;
result.lenth = 0;
}
return result;
}
//0表示靜音,100表示正常音量。范圍0~100
public void setVolume(final int newVolume) {
result.volume = newVolume;
}
}
本地音頻旁路回調
mAlipayRtcEngineAudioListener.setEnableAudioCaptured(true);
rtcEngine.setAlipayRtcEngineAudioListener(mAlipayRtcEngineAudioListener, null);
private AlipayRtcEngineAudioListener mAlipayRtcEngineAudioListener = new AlipayRtcEngineAudioListener() {
@Override
public boolean getEnableAudioCaptured() {
return super.getEnableAudioCaptured();
}
@Override
public boolean getEnableAudioSoundVolume() {
return super.getEnableAudioSoundVolume();
}
@Override
public void onWebRtcAudioCapturered(AlipayRtcAudioInfo alipayRtcAudioInfo) {
super.onWebRtcAudioCapturered(alipayRtcAudioInfo);
Log.i(TAG, "AudioCapture onSoundVolume: " + JSON.toJSONString(alipayRtcAudioInfo));
}
@Override
public void onSoundVolume(AlipayRtcAudioSoundInfo info) {
super.onSoundVolume(info);
Log.i(TAG, "onSoundVolume: " + JSON.toJSONString(info));
}
};
遠端音頻旁路回調
rtcEngine.setAudioTrackListener(new AlipayRtcEngineAudioTrackListener() {
//不要阻塞此回調。
@Override
public void onWebRtcAudioTrackData(AlipayRtcAudioInfo alipayRtcAudioInfo) {
if (alipayRtcAudioInfo != null && alipayRtcAudioInfo.data != null) {
Log.i(CallActivity.TAG, "AudioCapture remote: " + JSON.toJSONString(alipayRtcAudioInfo));
}
}
}.setEnableAudioTrackCopy(true),null);
退出房間
路徑:com.mpaas.idrs.IdrsSdk#release
退出房間即釋放 IDRS。
public void release()
IDRS 對外能力接口
回傳雙錄結果
/**
* 回傳雙錄結果
* @param resultBean 錄制結果
* @param callback 上傳回調
*/
public static void uploadFiles(final IdrsProcessResultBean resultBean, UploadCallback callback)
獲取房間信息
public void setRoomInfo(RoomInfo roomInfo)
設置房間信息
public void setRoomInfo(RoomInfo roomInfo)
獲取 RTC 實例
public AlipayRtcEngine getRtcEngineInstance()
置用戶 ID
public void setUserId(String userId)
獲取 AppData
public DataBean getAppData()
開啟語音識別
public int startDialogforData(Handler handler)
停止語音識別
public void stopDialog()
創建面部識別檢測器
/**
* 創建面部識別檢測器
* @param callBack 初始化回調
* @return FaceDetector
*/
public FaceDetector createFaceDetector(SdkInitCallBack callBack)
創建 OCR 檢測器
public OCRDetector createOCRDetector(SdkInitCallBack callBack)
創建手勢識別檢測器
public HandDetector createHandDetector(SdkInitCallBack callBack)
監聽屏幕旋轉
/**
* 監聽屏幕旋轉
*/
public void detectScreenRotate(Context context)
開啟手勢識別
/**
* 開啟手勢識別
* @param data 圖像幀
* @param imageWidth 寬
* @param imageHeight 高
* @param angle 角度
* @param isFrontCamera 是否前置攝像頭
* @param isStatic 是否靜態識別
* @return 識別結果
*/
public ArrayList<HandDetectionResult> startHandDetection(byte[] data, int imageWidth, int imageHeight, int angle, boolean isFrontCamera, boolean isStatic)
開啟人臉檢測
/**
* 人臉檢測
*
* @param data
* @param imageWidth
* @param imageHeight
* @param angle
* @param needFlipX
* @return
*/
public DectetResult[] startDetectFace(byte[] data, int imageWidth, int imageHeight, int angle, boolean needFlipX)
獲取人臉特征
public float[] getFeature(DectetResult dectetResult)
獲取位圖特征
public float[] getBitmapFeature(Bitmap bitmap)
人臉識別相關度
public float faceRecognitionSimilarity(float[] features1, float[] features2)
畫面實時標記
public RectF viewRectToFrameRect(RectF viewRect, int viewWidth, int viewHeight, int frameWidth, int frameHeight, boolean mirror, int rotate)
身份證識別
/**
* 身份證識別
* @param width 寬
* @param height 高
* @param data 數據幀
* @param roi
* @param rotation 角度
* @param mirror 是否鏡像
* @param isFront
* @return
*/
public String ocr_run(int width, int height, byte[] data, float[] roi, int rotation, boolean mirror, boolean isFront)
手寫體識別
public String classify_run(int width, int height, byte[] data, float[] roi, int rotation, boolean mirror)
TTS 相關
/**
* 開啟tts
* @param text
* @param listener
*/
public void startTTs(String text, AudioService.TTsListener listener)
/**
* 取消tts
*/
public void cancelTts()
/**
* 暫停tts
*/
public void pauseTts()
/**
* 當前是否暫停
* @return
*/
public boolean isPauseTts()
/**
* 是否正在播放
* @return
*/
public boolean isPlayTts()
/**
* 恢復tts
*/
public void resumeTts()
/**
* 設置tts參數
* @param key
* @param value
*/
public void setparamTts(String key, String value)