SDK使用说明
1、接入必读
- 本SDK只包含真机调试的功能,不支持任何模拟器的调试。
- 设备添加流程请参考Demo源码,注意设备状态。
- Android的Demo使用so库加jni文件的方式引入SDK,下载Demo可直接运行代码。
2、简介
本文档用于澄清慧视云开放平台SDK Android版本接口之间的关系以及接口调用顺序。
3、环境准备
支持 Android studio 1.4及以上版本
支持 JDK 7.0以上版本
支持 Android 手机系统4.0以上版本,包含华为鸿蒙系统
支持NDK 21版本
4、环境配置
1.安装SDK
方式一:使用Gradle安装
如果是之前才用过直接下载方式的需要删除之前拷贝进来的所有so库文件以及jar包
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
dependencies {
/*SDK核心模块,必须依赖*/
implementation 'com.github.jovision:JMediaKit:v2.0.0'
}
方式二:直接下载安装
下载SDK并解压缩
使用默认配置,不需要修改build.gradle。在 main 目录下创建文件夹 jniLibs (如果有就不需要创建了),将下载libs文件夹内容libs/arm64-v8a、libs/armeabi、libs/armeabi-v7a复制到这个目录下,如果已经有这个目录,将下载的 so 库复制到这个目录,jni.java文件复制到com.jovision.jvplayer包下即可。
2.配置权限
在AndroidManifest.xml中配置权限:
<!--允许程序打开网络套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许程序设置内置sd卡的写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5、SDK初始化
可以直接在首页启动后调用播放库的初始化。
/**
* @brief 初始化
* @param object 事件回调对象,需实现void OnJavEvent(int player_id, int event_type, int event_state, String json_data);
* @return 错误码
*/
public static native int javPlayerInit( Object object );
6、直播流程
1.视频连接
/**
* @brief 连接媒体
* @param info 连接媒体所需的信息,支持:url、本地媒体文件路径:d:\1.mp4、平台返回的json串,utf8编码
* @param channel_index 通道标号,从0开始,p2p连接时有效
* @param stream_index 码流标号,从0开始,p2p连接时有效
* @return 成功返回player_id,失败返回0
*/
public static native int javPlayerConnect(String info, int channel_index, int stream_index);
参数说明
参数 | 参数类型 | 参数说明 |
---|---|---|
info | String | 走p2p协议可直接把平台返回json串传入,走jvmp协议需要将jvmp字段解析出来传入 |
channel_index | int | 通道标号,从0开始; |
stream_index | int | 码流标号,0为主码流,1为次码流,默认传0; |
连接回调处理
void OnJavEvent(int player_id, int event_type, int event_state, String json_data){
if (event_type == 0) {
if (event_state == 9) {
//解码成功,显示画面在SurfaceView上
Jni. javPlayerShow (playerId, mSurfaceHolder.getSurface(), 0, 0, mSurfaceHolder.getSurfaceFrame().width(), mSurfaceHolder.getSurfaceFrame().height());
} else {
}
}
}
回调参数说明
参数 | 参数类型 | 参数说明 |
---|---|---|
player_id | int | 连接返回player_id,用来对应画面; |
event_type | int | 事件类型,取值如下: 0:直播或者回放连接事件; 1:按时间回放进度; 2:按文件回放进度; 3:录像事件; 4.:对讲事件 5:录像下载事件 |
event_state | int | 事件类型为0时,事件状态,取值如下: 0:无状态; 1:已连接; 2:连接失败; 3:连接限制(p2p连接时,设备连接达到上线了) 4:连接中断(网络异常或服务中断) 5:连接断开(正常断开,可用于判断录像回放结束)7:正在缓冲 8:解码失败 9:解码成功,收到解码成功后即可调用show接口来预览图像 |
json_data | String | 携带数据,例如录像回放的进度信息; |
2.显示画面
/**
* @brief 显示画面,可重复调用(设置显示区域),目前第二次以及后续的调用windows_id无效
* @param player_id 播放器id
* @param surface 窗口句柄(安卓平台传入surface,IOS平台传入view)
* @param left 屏幕坐标,显示位置最左侧(手机平台传入0)
* @param top 屏幕坐标,显示位置最顶侧(手机平台传入0)
* @param right 屏幕坐标,显示位置最右侧(手机平台传入view的宽)
* @param bottom 屏幕坐标,显示位置最底侧(手机平台传入view的高)
* @return 无
*/
public static native void javPlayerShow(int player_id, Object surface, int left, int top, int right, int bottom);
注:此方法需在UI线程调用;
3.视频断开
/**
* @brief 断开连接,异步操作,无回调。所有返回的播放id都应调用此接口进行销毁
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerDisconnect(int player_id);
playerId是调用连接媒体接口成功后返回的;
4.开关视频声音
/**
* @brief 是否静音
* @param player_id 播放器id
* @param enable 0 静音, 1 播放
* @return 无
*/
public static native void javPlayerMute(int player_id, int enable);
参数说明:
参数 | 参数类型 | 参数说明 |
---|---|---|
player_id | int | 连接视频返回的player_id |
enable | int | 1:播放;0:静音; |
注意:只有单分屏时才可调用该方法;回放画面声音也是这个方法;
7、回放流程
1.播放回放
/**
* @brief 录像回放
* @param p2p_info p2p连接所需的信息(平台返回的json串),utf8编码
* @param channel_index 通道标号,从0开始
* @param stream_index 码流标号,从0开始
* @param begin_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @param end_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @return 播放器id
*/
public static native int javPlayerPlayRecord(String p2p_info, int channel_index, int stream_index, String begin_time, String end_time);
参数说明:
参数 | 参数类型 | 参数说明 |
---|---|---|
p2p_info | String | 服务器返回的json串,Gson解析异常造成的的问题,可参考Android常见问题 |
channel_index | int | 通道标号,从0开始; |
stream_index | int | 码流标号,0为主码流,1为次码流,默认传0; |
begin_time | String | 开始时间,rfc3339固定格式,例如2020-07-01T00:00:00.000+08:00,取值为获取到的录像文件的开始时间转成对应格式; |
2.视频连接状态回调
void OnJavEvent(int player_id, int event_type, int event_state, String json_data){
if (event_type == 0) {
if (event_state == 9) {
//解码成功,显示画面在SurfaceView上
Jni. javPlayerShow (playerId, mSurfaceHolder.getSurface(), 0, 0, mSurfaceHolder.getSurfaceFrame().width(), mSurfaceHolder.getSurfaceFrame().height());
//连接成功之后,每秒收到回调接收当前播放的时间戳
} else {
}
}
}
注:回调参数参考视频连接。
3.控制当前回放的暂停及播放
/**
* @brief 回放暂停
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerPause(int player_id);
/**
* @brief 恢复回放
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerResume(int player_id);
4.设置回放播放速度
/**
* @brief 倍速
* @param player_id 播放器id
* @param speed 取值(-4~0~4)播放速度为:2^speed
* @return 无
*/
public static native void javPlayerSetSpeed(int player_id, int speed);
参数说明:
参数 | 参数类型 | 参数说明 |
---|---|---|
player_id | int | 连接返回player_id,用来对应画面; |
speed | int | 倍速,取值为-4~0~4,播放速度为2^speed; |
5.回放根据具体时间跳转
/**
* @brief 跳转
* @param player_id 播放器id
* @param time_pos rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @return 无
*/
public static native void javPlayerSkip(int player_id, String time_pos);
参数说明:
参数 | 参数类型 | 参数说明 |
---|---|---|
player_id | int | 连接返回player_id,用来对应画面; |
time_pos | String | 指定时间,rfc3339固定格式,例如2020-07-01T00:00:00.000+08:00; |
8、对讲流程
1.开启对讲
/**
* @brief 开启语音对讲
* @param info 开启对讲所需的信息,支持:url、平台返回的json串(p2p)Gson解析异常造成的的问题,可参考Android常见问题
* @param channel_index 通道标号,从0开始,p2p连接时有效
* @return 对讲id,失败返回0
*/
public static native int javPlayerIntercomStart(String info, int channel_index);
注:channel_index:
NVR 设备对讲:传 -1
IPC 设备对讲:传 0
NVR 通道对讲:从0开始
2.结束对讲
/**
* @brief 停止语音对讲
* @param player_id 对讲id
* @return 无
*/
public static native void javPlayerIntercomStop(int player_id);
3.对讲状态回调
回调参数说明:
参数 | 参数类型 | 参数说明 |
---|---|---|
player_id | int | 连接返回player_id,用来对应画面; |
event_type | int | 事件类型,取值如下: 0:直播或者回放连接事件; 1:按时间回放进度; 2:按文件回放进度; 3:录像事件; 4.:对讲事件 5:录像下载事件 |
event_state | int | 事件类型为4时,事件状态,取值如下: 0:无状态; 1:开始对讲成功; 2:开始对讲失败; 3:对讲中断;4:对讲结束 |
json_data | String | 携带数据,无; |
9、抓拍
/**
* @brief 抓拍画面,适用于直播和回放
* @param player_id 播放器id
* @param format 0:bmp,1:jpg,2:png其他暂不支持
* @param fullname 抓图文件名(全路径)
* @return 无
*/
public static native void javPlayerSnapshot(int player_id, int format, String fullname);
10、本地录像
1.开启录像
/**
* @brief 开始录像
* @param player_id 播放器id
* @param format 0:mp4,其他暂不支持
* @param save_path 存储路径
* @param name_prefix 录像文件名前缀,录像名为:prefix_开始时间_结束时间.mp4
* @return 无
*/
public static native void javPlayerRecordStart(int player_id, int format, String save_path, String name_prefix);
本地录像回调对应状态说明:
注:int类型,从0开始
枚举值 | 说明 |
---|---|
JRS_NONE | 无状态 |
JRS_START_RECORD | 开始录像 |
JRS_CREATE_PACKAGE_OK | 创建录像文件成功,收到json数据,详见:player_record |
JRS_CREATE_PACKAGE_FAILED | 创建录像文件失败 |
JRS_CLOSE_PACKAGE_OK | 关闭录像文件成功,收到json数据,详见:player_record |
JRS_CLOSE_PACKAGE_FAILED | 关闭录像文件失败 |
JRS_WRITE_FAILED | 写入失败 |
JRS_STORE_THE_WARNING | 存储空间不足 |
JRS_STOP_RECORD | 关闭录像 |
2.停止录像
/**
* @brief 停止录像
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerRecordStop(int player_id);
11、切换码流
先把码流的连接断开,然后重新创建新码流连接即可。(换码流连接)
12、设备本地录像远程下载
1.下载分为两个方式:按时间段下载和按文件下载。
/**
* @brief 开始下载按时间段
* @param info p2p连接所需的信息(平台返回的json串),utf8编码
* @param channel_index 通道标号,从0开始
* @param stream_index 码流标号,从0开始
* @param begin_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @param end_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @param format 0:mp4,其他暂不支持
* @param save_path 存储路径
* @param name_prefix 录像文件名前缀,录像名为:prefix_开始时间_结束时间.mp4
* @return 无
*/
public static native void javPlayerDownloadTimeStart(String info, int channel_index, int stream_index, String begin_time, String end_time, int format, String save_path, String name_prefix);
/**
* @brief 开始下载,传入开始结束时间是内部为了计算文件总时长
* @param info p2p连接所需的信息(平台返回的json串),utf8编码
* @param file_name 按文件下载时需传入文件名
* @param begin_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @param end_time rfc3339 格式的时间,如:2020-06-27T17:18:00.000+08:00
* @param format 0:mp4,其他暂不支持
* @param save_path 存储路径
* @param name_prefix 录像文件名前缀,录像名为:prefix_开始时间_结束时间.mp4
* @return 无
*/
public static native int javPlayerDownloadFileStart(String info, String file_name, String begin_time, String end_time, int format, String save_path, String name_prefix);
2.暂停下载
/**
* @brief 暂停下载
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerDownloadPause(int player_id);
3.继续下载
/**
* @brief 继续下载
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerDownloadResume(int player_id);
4.停止下载
/**
* @brief 停止下载
* @param player_id 播放器id
* @return 无
*/
public static native void javPlayerDownloadStop(int player_id);
13、摄像机配置网络
声波配网播放声波
/**
* @brief 开始播放声波
* @param data 要生成声波的字符串
* @param times 重复次数
* @return 无
*/
public static native void utlStartSoundWave(String data, int times);
/**
* @brief 停止播放声波
* @return 无
*/
public static native void utlStopSoundWave() ;
14、其他
1. AAC文件录音及播放
- 录制AAC文件
/**
* @brief 开始采集声音到文件(AAC编码格式ADTS文件格式),仅支持手机端,不能与语音对讲功能同时使用
* @param channels 通道数,目前仅支持1通道
* @param sample_rate 采样率,支持8000、16000
* @param sample_bits 采样位宽,支持8、16
* @param fullname aac文件路径
* @return 无
*/
public static native void utlStartCollectSoundToAACFile(int channels, int sample_rate, int sample_bits, String fullname);
/**
* @brief 停止采集声音,结束文件写入
* @return 无
*/
public static native void utlStopCollectSound();
- 播放AAC文件
/**
* @brief 播放aac格式的声音文件(AAC编码格式ADTS文件格式),仅支持手机端,不能与语音对讲功能同时使用
* @param channels 通道数,目前仅支持1通道
* @param sample_rate 采样率,支持8000、16000
* @param sample_bits 采样位宽,支持8、16
* @param fullname aac文件路径
* @return 无
*/
public static native void utlPlayAACFile(int channels, int sample_rate, int sample_bits, String fullname);
/**
* @brief 停止播放aac声音文件
* @return 无
*/
public static native void utlStopPlayAACFile();
2. 图片解密
/**
* @brief 解密aes加密的文件
* @param src_file_full_name 源文件
* @param key 密钥
* @param iv 向量
* @param dst_file_full_name 目标文件
* @return 0:成功,<0:失败
*/
public static native int utlAesCbcDecryptFile(String src_file_full_name, String key, String iv, String dst_file_full_name);
3. 设备透传
/**
* @brief 获取设备透传命令的服务地址
* @param 无
* @return 服务地址,形如:http://127.0.0.1:12345/, 使用时需追加上"/v1/udms/send_cmd"等服务名使用
*/
public static native String utlGetWebServiceUrl();