存储卡录像

更新时间:2024-06-17 02:34:28下载pdf

智能摄像机在存储卡中保存视频录像后,可以通过 IPC SDK 在 App 端播放视频录像。

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

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

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

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

    存储卡录像

核心接口

演示录屏 接口 描述 备注
IThingSmartCameraP2P queryRecordDaysByMonth 查询保存过视频的日期 在开始视频回放前,需要先查询某年某月中保存过视频录像的日期
IThingSmartCameraP2P queryRecordTimeSliceByDay 查询某日的视频片段 查询到有视频片段的日期后,根据日期查询当日的视频片段记录
IThingSmartCameraP2P startPlayBack 开启回放 错误码查询
IThingSmartCameraP2P stopPlayBack 结束回放 -
IThingSmartCameraP2P disconnect 断连 设备不需要连接时,需要及时断开释放 P2P 会话

重点关注

注意不要在 IThingSmartCameraP2P 对象调用方法的回调函数里(可能异步调用)调用该对象的其他 API。否则,可能会造成死锁。

核心代码

查询保存过视频的日期

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

查询某日的视频片段

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

开启回放

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

结束回放

void stopPlayBack(OperationDelegateCallBack callBack);

Java:

// 1. 创建 IThingSmartCameraP2P
IThingSmartCameraP2P mCameraP2P = null;
IThingIPCCore cameraInstance = ThingIPCSdk.getCameraInstance();
if (cameraInstance != null) {
    mCameraP2P = cameraInstance.createCameraP2P(devId));
}
ThingCameraView mVideoView = findViewById(R.id.camera_video_view);
// 2. 为渲染视图容器设置回调
mVideoView.setViewCallback(new AbsVideoViewCallback() {
    @Override
    public void onCreated(Object view) {
        super.onCreated(view);
        // 渲染视图构造完成时,为 IThingSmartCameraP2P 绑定渲染视图
        if (null != mCameraP2P){
            mCameraP2P.generateCameraView(view);
        }
    }
});
// 3. 构造渲染视图
mVideoView.createVideoView(devId);
// 4. 注册 P2P 监听
AbsP2pCameraListener absP2pCameraListener = new AbsP2pCameraListener() {
    @Override
    public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus) {
            super.onSessionStatusChanged(camera, sessionId, sessionStatus);
            // sessionStatus = -3 (超时)或 -105(鉴权失败) 时,建议发起一次重连,注意避免循环
            }
};
if (null != mCameraP2P){
    mCameraP2P.registerP2PCameraListener(absP2pCameraListener);
}
// 5.连接 P2P
if (null != mCameraP2P){
mCameraP2P.connect(devId, new OperationDelegateCallBack() {
    @Override
    public void onSuccess(int sessionId, int requestId, String data) {
        //连接成功,发送 Handler 消息回到主线程再发起拉流
    }

    @Override
    public void onFailure(int sessionId, int requestId, int errCode) {
        //连接失败
    }
});
}
// 6. 开启回放
if (null != mCameraP2P){
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;
                           }
                         });
}
// 7. 在页面关闭或者不需要回放时,停止释放 P2P 会话
@Override
public void onDestroy() {
    if (null != mCameraP2P) {
        // 不需要回放时,停止回放
        mCameraP2P.stopPlayBack(new OperationDelegateCallBack() {
  @Override
  public void onSuccess(int sessionId, int requestId, String data) {

  }

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

  }
});
        mCameraP2P.disconnect(devId,null);
        mCameraP2P.removeOnP2PCameraListener(absP2pCameraListener);
        mCameraP2P.destroyP2P();
    }
}