存储卡视频回放

更新时间:2024-03-04 08:53:06

涂鸦 IPC SDK 开发支持存储卡录制功能。智能摄像机(IPC)插入存储卡后,可以查看存储卡的信息和状态,并设置录像开关和模式。

功能说明

智能摄像机在存储卡中保存视频录像后,可以通过 IPC SDK 在 App 端播放视频录像。更多详情,请参考 存储卡管理

同实时视频直播一样,在开始视频回放前,您需要:

  1. 创建 IThingSmartCameraP2P 对象,连接上 P2P(Peer-to-peer)通道。

  2. P2P 通道连接成功后,用户可以查询到设备端存储卡中录制的视频片段时间信息,然后播放视频片段。

  3. 开启视频回放成功后,用户可以使用音视频功能,例如开启或停止视频录制、视频截图、开启或关闭视频声音。更多详情,请参考 音视频功能

    存储卡视频回放

视频片段

设备端保存在存储卡中的视频片段,IPC SDK 支持以天为单位查看和播放视频录像,并且能够查询某年某月中,哪几天保存过视频录像,以便于用户查看。

查询保存过视频的日期

在开始视频回放前,需要先查询某年某月中保存过视频录像的日期。

接口说明

void queryRecordDaysByMonth(int year, int month, OperationDelegateCallBack callBack);

参数说明

参数 说明
year 查询的年份
month 查询的月份
monthcallBack 结果回调

示例代码

int year = Integer.parseInt(substring[0]);
int mouth = Integer.parseInt(substring[1]);
queryDay = Integer.parseInt(substring[2]);
mCameraP2P.queryRecordDaysByMonth(year, mouth, new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {
    //data 是查询到的月份数据
    MonthDays monthDays = JSONObject.parseObject(data, MonthDays.class);
    mBackDataMonthCache.put(mCameraP2P.getMonthKey(), monthDays.getDataDays());
    mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE, ARG1_OPERATE_SUCCESS, data));
  }

  @Override
  public void onFailure(int sessionId, int requestId, int errCode) {
    mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE, ARG1_OPERATE_FAIL));
  }
});

查询某日的视频片段

查询到有用视频片段的日期后,根据日期查询当日的视频片段记录。

接口说明

void queryRecordTimeSliceByDay(int year, int month, int day, OperationDelegateCallBack callBack);

参数说明

参数 说明
year 查询的年份
month 查询的月份
day 查询的天
callBack 结果回调

示例代码

int year = Integer.parseInt(substring[0]);
int mouth = Integer.parseInt(substring[1]);
int day = Integer.parseInt(substring[2]);
mCameraP2P.queryRecordTimeSliceByDay(year, mouth, day, new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {
    // data 是查询到指定日期的视频片段数据集
    parsePlaybackData(data);
  }

  @Override
  public void onFailure(int sessionId, int requestId, int errCode) {
    mHandler.sendEmptyMessage(MSG_DATA_DATE_BY_DAY_FAIL);
  }
});

parsePlaybackData(data) 方法参考

private void parsePlaybackData(Object obj) {
        RecordInfoBean recordInfoBean = JSONObject.parseObject(obj.toString(), RecordInfoBean.class);
        if (recordInfoBean.getCount() != 0) {
            List<TimePieceBean> timePieceBeanList = recordInfoBean.getItems();
            if (timePieceBeanList != null && timePieceBeanList.size() != 0) {
                mBackDataDayCache.put(mCameraP2P.getDayKey(), timePieceBeanList);
            }
            mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE_BY_DAY_SUCC, ARG1_OPERATE_SUCCESS));
        } else {
            mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE_BY_DAY_FAIL, ARG1_OPERATE_FAIL));
        }
    }

RecordInfoBean 数据模型

参数 说明
count 片段个数
List 视频片段集合

TimePieceBean 数据模型

参数 说明
startTime 视频片段开始时间
endTime 视频片段结束时间
playTime 视频片段播放时间

播放视频

开启回放

接口说明

void startPlayBack(int startTime, int stopTime, int playTime, OperationDelegateCallBack callBack, OperationDelegateCallBack finishCallBack);

参数说明

参数 说明
startTime 10 位时间戳格式的开始时间
stopTime 结束时间
playTime 播放时间
callBack 开启视频回放回调
finishcallBack 结束视频回放回调

示例代码

mCameraP2P.startPlayBack(timePieceBean.getStartTime(),
                         timePieceBean.getEndTime(),
                         timePieceBean.getStartTime(), new OperationDelegateCallBack() {
                           @Override
                           public void onSuccess(int sessionId, int requestId, String data){
                             isPlayback = true;
                           }

                           @Override
                           public void onFailure(int sessionId, int requestId, int errCode){
                             isPlayback = false;
                           }
                         }, new OperationDelegateCallBack() {
                           @Override
                           public void onSuccess(int sessionId, int requestId, String data){
                             isPlayback = false;
                           }

                           @Override
                           public void onFailure(int sessionId, int requestId, int errCode){
                             isPlayback = false;
                           }
                         });

暂停回放

接口说明

void pausePlayBack(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

示例代码

mCameraP2P.pausePlayBack(new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {
    isPlayback = false;
  }

  @Override
  public void onFailure(int sessionId, int requestId, int errCode) {

  }
});

恢复回放

接口说明

void resumePlayBack(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

示例代码

mCameraP2P.resumePlayBack(new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {
    isPlayback = true;
  }

  @Override
  public void onFailure(int sessionId, int requestId, int errCode) {

  }
});

结束回放

接口说明

void stopPlayBack(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

示例代码

mCameraP2P.stopPlayBack(new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {

  }

  @Override
  public void onFailure(int sessionId, int requestId, int errCode) {

  }
});

倍速播放

部分 IPC 设备在播放存储卡视频回放时,支持变速播放。您可以使用 设备能力类 ICameraConfigInfo 查询设备支持的播放倍速。

接口说明

void setPlayBackSpeed(int speed, OperationDelegateCallBack callBack);

参数说明

参数 说明
speed 播放倍速,指定的播放倍数需要设备支持
callBack 操作回调

下载视频

部分 IPC 设备支持将存储卡视频下载到 App 上,您可以通过 IPC SDK 提供的接口判断设备是否支持下载存储卡视频。

查询视频是否支持下载

接口说明

判断设备是否支持存储卡视频回放下载,该接口需要在 P2P 连接成功之后调用。

boolean isSupportPlaybackDownload();

示例代码

IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    ICameraConfigInfo cameraConfig = cameraInstance.getCameraConfig(devId);
    if (cameraConfig != null) {
        boolean supportPlaybackDownload = cameraConfig.isSupportPlaybackDownload();
    }
}

开始下载视频

接口说明

设备侧 SDK 支持完整单个或者多个连续片段的下载。

void startPlayBackDownload(int startTime, int stopTime, String folderPath, String fileName, OperationDelegateCallBack callBack, ProgressCallBack progressCallBack, OperationDelegateCallBack finishCallBack);

参数说明

参数 说明
startTime 选择起始片段的开始时间
stopTime 选择结束片段的结束时间
folderPath 存储路径
fileName 文件名称
callBack 操作回调
progressCallBack 下载回调
finishCallBack 结束回调

由于 IPC 设备对回放视频文件的检索能力限制,不会对单个视频片段做分割。因此,视频下载的开始时间(startTime)和结束时间(stopTime),必须设置在单个或多个连续视频片段的最开始一个片段的起始时间和最后一个片段的结束时间。

暂停下载视频

接口说明

void pausePlayBackDownload(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

恢复下载视频

接口说明

void resumePlayBackDownload(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

停止下载视频

接口说明

void stopPlayBackDownload(OperationDelegateCallBack callBack);

参数说明

参数 说明
callBack 操作回调

删除视频

部分 IPC 设备支持通过 App 控制删除存储卡上某天的回放视频。目前,只支持按日期删除全天的视频。

查询视频是否支持删除

接口说明

判断设备是否支持删除存储卡上的回放视频,该接口需要在 P2P 连接成功之后调用。

boolean isSupportPlaybackDelete();

示例代码

IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    ICameraConfigInfo cameraConfig = cameraInstance.getCameraConfig(devId);
    if (cameraConfig != null) {
        boolean supportPlaybackDelete = cameraConfig.isSupportPlaybackDelete();
    }
}

删除指定日期的视频

接口说明

void deletePlaybackDataByDay(String day, OperationDelegateCallBack callBack, OperationDelegateCallBack finishCallBack);

参数说明

参数 说明
day 期望删除的日期,格式为 yyyyMMdd
callBack 操作回调
finishCallBack 结束回调