IPC 视频直播

更新时间:2025-12-16 07:16:15下载pdf

概念

ThingIPCSdk(Internet Protocol Camera Software Development Kit)是涂鸦智能为鸿蒙开发者提供的智能摄像头开发工具包。它封装了与涂鸦智能摄像头设备交互的所有核心功能,让开发者可以轻松构建智能安防、家庭监控、智能家居等应用。

API 说明

ThinkIPCSdk 模块

init

功能描述

初始化 ThinkIPCSdk,这是使用 SDK 所有功能前的必要步骤。初始化会配置 SDK 运行环境、注册必要的服务和组件。

函数签名

static init(context: Context);

参数说明

参数 类型 说明
context Context 鸿蒙应用的组件上下文,用于 SDK 内部调用系统 API

IPC SDK 初始化可以尽量提前,在程序启动时执行。

示例

ThingIPCSdk.init();

getCameraP2P

功能描述

得到 ThinkCameraP2P 实例对象。

函数签名

static getCameraP2P(devId: string): IThingCameraP2P;

参数说明

参数 类型 说明
devId string 设备 ID

返回值

IThingCameraP2P 实例对象。


getCloudCamera

功能描述

得到 ThinkCloudCamera 实例对象。

函数签名

static getCloudCamera(devId: string): IThingCloudCamera;

参数说明

参数 类型 说明
devId string 设备 ID

返回值

IThingCloudCamera 实例对象。


getSDCardManager

功能描述

得到 IThingCameraSDCardManager 实例对象。

函数签名

static getSDCardManager(devId: string) : IThingCameraSDCardManager;

参数说明

参数 类型 说明
devId string 设备 ID

返回值

IThingCameraSDCardManager 实例对象。


IThinkCameraP2P 模块

initP2P

功能描述

初始化 P2P 连接服务。P2P 初始化依赖于用户登录和 MQTT 连接的完成,用于建立设备间的直连通道,实现低延迟的音视频传输。

函数签名

initP2P(uid: string): void;

参数说明

参数 类型 说明
uid string 用户唯一标识符,从登录后的用户信息中获取

IThinkCameraP2P 初始化,依赖登录完成和 MQTT 的初始化完成。

示例

export class TSmartDeviceController implements ITSmartLocalKeyProvider {
  public async getLocalKey(topicId: string): Promise<string | undefined> {
    if (topicId.startsWith(TSmartMqttConfig.TOPIC_PREFIX_DEVICE_IN)) {
      const device =
        await TSmartDeviceCache.get(topicId.replace(TSmartMqttConfig.TOPIC_PREFIX_DEVICE_IN, '')) as TSmartDeviceModel
      return device.localKey;
    }
    return "";
  }
}

...
IPCLog.d(this.logTag, "登录成功:" + resp);
TSmartMqtt.initClient(TSmartUser.getDomain()?.mobileMqttsUrl ?? '',
                (TSmartUser.getPartnerIdentity() ?? '') + (TSmartUser.getSid() ?? ''), TSmartUser.getSid() ?? '',
                (await MD5.digest(TSmartUser.getEcode())).substring(8, 24), new TSmartDeviceController());

TSmartMqtt.connect();
ThingIPCSdk.getP2P().initP2P(TSmartUser.getUid() as string);

bindXComponentContext

功能描述

播放窗口设置。

函数签名

bindXComponentContext(xComponentContext: XComponentContext) : void;

参数说明

参数 类型 说明
xComponentContext XComponentContext 视频渲染组件的上下文对象,用于接收摄像头视频帧数据。不可为 undefined(尽管签名允许,实际使用时必须传递有效值)

示例

cameraP2P = ThingIPCSdk.getCameraP2P("devid");

XComponent({id: 'xcomponentId0',type: XComponentType.SURFACE,
            libraryname: 'thingvideorenderersdk'
}).onLoad((xComponentContext) => {
    this.xComponentContext0 = xComponentContext as XComponentContext;
    this.cameraP2P.bindXComponentContext(this.xComponentContext0);
}).onDestroy(() => {
    console.log('onDestroy');
}).id("xcomponent")

connect/connectWrapper()

功能描述

建立 P2P 连接。

函数签名

connect(): Promise<ThingCameraResponse<number>>;
connectWrapper() : Promise<ThingCameraResponse<void>>;

返回值

Promise<ThingCameraResponse<number>>:异步返回会话 ID(Data 字段)和错误码。


disconnect

功能描述

断开 P2P 连接。

函数签名

disconnect(force : boolean): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
force boolean true:强制断开,false:正常断开

返回值

Promise<ThingCameraResponse<void>>

断开后需重新调用 connect 才能操作。


isconnect

功能描述

查询当前连接状态。

函数签名

isConnected(): boolean;

返回值(Boolean)

  • ture:已连接。
  • false:未连接。

startPreview

功能描述

开始实时视频预览。

函数签名

startPreview(callback : ThingCameraCallback): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
callback ThingCameraCallback 操作结果回调

返回值

Promise<ThingCameraResponse<void>>

需先调用 connect

示例

IPCLog.d(this.logTag, 'ipc connect start')

if (TSmartUser.getUid() !== undefined) {
    this.cameraP2P.connectWrapper().then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc connect success')
            let previewCallBack: ThingCameraCallback = {
                    onResponse: (reason: string, errCode: number) => {
                      if (errCode >= 0) {
                        IPCLog.d(this.logTag, 'ipc preview success')
                      } else {
                        IPCLog.e(this.logTag, 'ipc preview fail')
                      }
                      return 0;
                    }
                  }
            this.cameraP2P.startPreview(previewCallBack).then((result) => {
                    if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                      IPCLog.d(this.logTag, 'ipc preview return success')
                    } else {
                      IPCLog.e(this.logTag, 'ipc preview fail')
                    }
                  }).catch((e: TSmartAtopRequestError) => {
                    IPCLog.e(this.logTag, 'ipc preview fail' + e)
                  });
                } else {
                  IPCLog.e(this.logTag, 'ipc connect fail')
                }
              }).catch((e: TSmartAtopRequestError) => {
                IPCLog.e(this.logTag, 'ipc connect fail' + e)
              })
            } else {
              IPCLog.e(this.logTag, 'uid is undefined')
            }
    IPCLog.d(this.logTag, 'ipc connect end')

stopPreview

功能描述

停止实时预览。

函数签名

stopPreview(callback : ThingCameraCallback): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
callback ThingCameraCallback 操作结果回调

返回值

Promise<ThingCameraResponse<void>>

示例

IPCLog.d(this.logTag, 'ipc disconnect start')
    let stopPreviewCallBack: ThingCameraCallback = {
              onResponse(reason: string, errCode: number): number {
                IPCLog.d(this.logTag, 'ipc disconnect callback')
                return 0;
              }
    };
    this.cameraP2P.stopPreview(stopPreviewCallBack).then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc stopPreview return success')
        } else {
                IPCLog.e(this.logTag, 'ipc stopPreview fail')
        }
    }).catch((e: TSmartAtopRequestError) => {
        IPCLog.e(this.logTag, 'ipc preview fail' + e)
    });

    this.cameraP2P.disconnect(true).then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc disconnect return success')
        } else {
            IPCLog.e(this.logTag, 'ipc disconnect fail')
        }
    }).catch((e: TSmartAtopRequestError) => {
        IPCLog.e(this.logTag, 'ipc preview fail' + e)
    });

startPlayBack

功能描述

播放设备端录制的视频(云端回放)。

函数签名

startPlayBack(startTime : number, endTime : number, playTime : number, callback: ThingCameraFinishableCallback<string, string>): void;

参数说明

参数 类型 说明
startTime number 回放开始时间戳(秒)
endTime number 回放结束时间戳(秒)
playTime number 初始播放时间戳(秒)
callback ThingCameraFinishableCallback<string, string> 回放进度/状态回调

示例

camera.startPlayBack(1620000000, 1620003600, 1620000000, {  
  onFinished(data, code) {  
    if (code === 0) console.log("回放完成");  
  },  
  onEvent(type, info1, info2, msg) {  
    console.log("回放事件:", type);  
  }  
});  

pausePlayBack

功能描述

暂停回放。

函数签名

pausePlayBack() : Promise<ThingCameraResponse<number>>;

返回值

Promise<ThingCameraResponse<number>>

示例

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "暂停 SD 卡视频");
            this.cameraP2P.pausePlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "暂停 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "暂停 SD 卡视频 失败");
              }
            });
          } else {
            IPCLog.d(this.logTag, "暂停 SD 卡视频失败,this.cameraP2P === undefined");
          }

resumePlayBack

功能描述

恢复回放。

函数签名

resumePlayBack() : Promise<ThingCameraResponse<number>>;

返回值

Promise<ThingCameraResponse<number>>

示例

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "恢复 SD 卡视频");
            this.cameraP2P.resumePlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "恢复 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "恢复 SD 卡视频 失败");
              }
            });
          } else {
            IPCLog.d(this.logTag, "恢复 SD 卡视频失败,this.cameraP2P === undefined");
          }

stopPlayBack()

功能描述

停止回放。

函数签名

stopPlayBack() : Promise<ThingCameraResponse<void>>;

返回值

Promise<ThingCameraResponse<void>>

示例

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "停止 SD 卡视频");

            this.cameraP2P.stopPlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "停止 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "停止 SD 卡视频 失败 " + result.errorCodeNumber);
              }
            });
          } else {
            IPCLog.d(this.logTag, "停止 SD 卡视频失败,this.cameraP2P === undefined");
          }

queryRecordDaysByMonth

功能描述

查询指定月份中有录像数据的所有日期列表,用于在日历控件中标记哪些天有可回放的录像。

函数签名

queryRecordDaysByMonth(month: number, year: number): Promise<ThingCameraResponse<string>>;

参数说明

参数 类型 说明
month number 月份(1-12)
year number 年份(如 2025)

返回值

Promise<ThingCameraResponse<string>>

  • 需要先建立 P2P 连接(connectWrapperconnect)。
  • 返回的日期格式为两位数字符串(如 “01”, “26”)。
  • 如果当月没有录像,DataDays 数组为空。

示例

let connectResult = await this.cameraP2P.connectWrapper();

          if (connectResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, "connect 成功 ");
            this.cameraP2P.queryRecordDaysByMonth(3, 2025).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS && result.data !== undefined) {
                let playbackDays = JSON.parse(result.data) as Record<string, Array<string>>;
                IPCLog.d(this.logTag, "queryRecordDaysByMonth 成功" + playbackDays["DataDays"].toString());
              } else {
                IPCLog.e(this.logTag, "queryRecordDaysByMonth 失败 " + result.errorCodeNumber);
              }
            })
          } else {
            IPCLog.d(this.logTag, "connect 失败 ");
          }

queryRecordTimeSliceByDay

功能描述

查询指定日期的详细录像时间段信息,包括每个录像片段的开始/结束时间,用于生成时间轴控件。

函数签名

queryRecordTimeSliceByDay(day : number, month : number, year : number) : Promise<ThingCameraResponse<string>>;

参数说明

参数 类型 说明
day number 日期(1-31)
month number 月份(1-12)
year number 年份(如 2025)

返回值

Promise<ThingCameraResponse<string>>

示例

let connectResult = await this.cameraP2P.connectWrapper();

          if (connectResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, "connect 成功 ");
            this.cameraP2P.queryRecordTimeSliceByDay(26, 3, 2025).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS && result.data !== undefined) {
                IPCLog.d(this.logTag, "queryRecordTimeSliceByDay 成功");
                let playbackBean = JSON.parse(result.data)  as ThingCameraPlayBackBean;
                // let playbackBean = ArkTSUtils.ASON.parse(json) as ThingCameraPlayBackBean;
                IPCLog.d(this.logTag, "queryRecordTimeSliceByDay 成功 " + playbackBean.items?.length);
                if (playbackBean.items !== undefined && playbackBean.items?.length > 0) {
                  this.mFirstThingCameraTimePieceBean = playbackBean.items[0];
                }
              } else {
                IPCLog.e(this.logTag, "queryRecordTimeSliceByDay 失败 " + result.errorCodeNumber);
              }
            })
          } else {
            IPCLog.d(this.logTag, "connect 失败 ");
          }

startRecordLocalMp4

功能描述

录制实时视频到本地文件。

函数签名

startRecordLocalMp4(recordParams: ThingCameraSnapshotParams): Promise<ThingCameraResponse<string>>;

参数说明

参数 类型 说明
recordParams ThingCameraSnapshotParams 保存地址

ThingCameraSnapshotParams 参数结构

参数 类型 描述
dir string 保存文件路径
filename string 文件名
rotate number 旋转角度
saveToSysTem boolean 是否保存到系统相册(需权限)

返回值

Promise<ThingCameraResponse<string>>

示例

const response = await camera.startRecordLocalMp4({  
  dir: "/sdcard/videos",  
  fileName: "20231001",  
  rotate: 0  
});  

stopRecordLocalMp4

功能描述

停止本地录像。

函数签名

stopRecordLocalMp4(): Promise<ThingCameraResponse<string>>;

返回值

Promise<ThingCameraResponse<string>>:最终文件路径。

需与 startRecordLocalMp4 配对使用。

示例

const response = await camera.stopRecordLocalMp4();  
console.log("视频已保存:", response.data);  

startAudioTalk / stopAudioTalk

功能描述

启动/停止双向语音对讲。

函数签名

startAudioTalk() : Promise<ThingCameraResponse<void>>;
stopAudioTalk() : Promise<ThingCameraResponse<void>>;

返回值

Promise<ThingCameraResponse<void>>

需确认设备支持音频功能。

示例

await camera.startAudioTalk(); // 开始对讲  
await camera.stopAudioTalk();  // 停止对讲  

getVideoBitRateKbps

功能描述

获取实时视频码率。

函数签名

getVideoBitRateKbps() : number;

返回值

当前码率(kbps)。

示例

const bitrate = camera.getVideoBitRateKbps();  
console.log("当前码率:", bitrate);  

setMute/getMute

功能描述

设置/获取静音状态。

函数签名

setMute(mute : number) : Promise<ThingCameraResponse<void>>;
getMute() : number;

参数说明

参数 类型 说明
mute number 0:取消静音,1:静音

返回值

Promise<ThingCameraResponse<void>>

number:返回当前静音状态。

示例

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "静音");

            this.cameraP2P.setMute(1).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "静音 成功");
              } else {
                IPCLog.d(this.logTag, "静音 失败 " + result.errorCodeNumber);
              }
            });
          } else {
            IPCLog.d(this.logTag, "静音失败,this.cameraP2P === undefined");
          }

if (this.cameraP2P !== undefined) {
            this.cameraP2P.getMute()
          } else {
            IPCLog.d(this.logTag, "获取静音状态失败,this.cameraP2P === undefined");
          }

requestCameraRtcConfig

功能描述

请求摄像头 P2P 连接所需的 RTC 配置信息(如密码、Token、服务器地址等)。

函数签名

requestCameraRtcConfig(devId: string): Promise<ThingCameraResponse<ThingCameraRtcConfig>>;

参数说明

参数 类型 说明
devId string 设备 ID

ThingCameraRtcConfig 参数结构

参数 类型 描述
devId string 设备 ID
password string 连接密码
skill string 设备能力描述
p2pId string P2P 唯一标识符
p2pType number 底层传输协议类型
p2pSpecifiedType number 连接策略
p2pConfig string P2P 服务器配置
sessionTid string 会话追踪 ID
vedioClaritys collections.Array 支持的清晰度列表
virtualCameraUrl string 虚拟摄像头 URL
virtualCameraEncryptKey string 虚拟摄像头密钥
vedioClarity number 视频清晰度,默认值为 4
audioAttributes ThingCameraConfigAudioAttributesBean 音频硬件能力

返回值

Promise<ThingCameraResponse<ThingCameraRtcConfig>>:包含连接配置的响应对象。

示例

const configResult = await camera.requestCameraRtcConfig("device123");
if (configResult.errorCodeNumber === 0 && configResult.data) {
  console.log("获取到配置:", configResult.data);
  // 后续可用于手动调用 createDevice
}

createDevice

功能描述

根据 RTC 配置创建摄像头设备实例,初始化底层 P2P 对象。

函数签名

createDevice(cameraConfig: ThingCameraRtcConfig): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
cameraConfig ThingCameraRtcConfig 获取的配置对象

返回值

Promise<ThingCameraResponse<void>>

示例

// 手动连接流程
const configResult = await camera.requestCameraRtcConfig("device123");
if (configResult.data) {
  const createResult = await camera.createDevice(configResult.data);
  if (createResult.errorCodeNumber === 0) {
    // 设备创建成功,可调用 connect()
    await camera.connect();
  }
}

registerP2PCameraListener

功能描述

注册 P2P 摄像头事件监听器,接收连接状态、视频帧、音频数据等事件。

函数签名

registerP2PCameraListener(listener: OnP2PCameraListener): void;

参数说明

参数 类型 说明
listener OnP2PCameraListener 事件监听器对象

示例

const listener: OnP2PCameraListener = {
  onSessionStatusChanged: (sessionId, status, camera) => {
    console.log(`连接状态变化: ${sessionId}, 状态: ${status}`);
  },
  onReceiveFrameYUVData: (sessionId, y, u, v, frameInfo, camera) => {
    // 自定义视频帧处理(通常由 XComponent 自动处理)
    console.log(`收到视频帧: ${frameInfo.nWidth}x${frameInfo.nHeight}`);
  },
  onReceiveAudioBufferData: (sessionId, pcm, audioInfo, camera) => {
    // 音频数据处理
    console.log("收到音频数据");
  }
};

camera.registerP2PCameraListener(listener);

unregisterP2PCameraListener

功能描述

移除已注册的事件监听器。

函数签名

unregisterP2PCameraListener(listener: OnP2PCameraListener): void;

参数说明

参数 类型 说明
listener OnP2PCameraListener 事件监听器对象

建议在页面销毁或不需要监听时及时移除,避免内存泄漏。

示例

// 移除监听器(如页面销毁时)
camera.unregisterP2PCameraListener(listener);

snapshot

功能描述

对当前视频画面进行截图,保存为本地图片文件。

函数签名

snapshot(snapshotParams: ThingCameraSnapshotParams): Promise<ThingCameraResponse<string>>;

参数说明

参数 类型 说明
snapshotParams ThingCameraSnapshotParams 文件存储信息

ThingCameraSnapshotParams 参数结构

参数 类型 描述
dir string 保存文件路径
fileName string 文件名
rotate number 旋转角度
saveToSysTem boolean 是否保存到系统相册(需权限)

返回值

Promise<ThingCameraResponse<string>>:返回完整文件路径(Data 字段)。

需要在视频预览状态下调用,确保目录具有写入权限

示例

const snapshotResult = await camera.snapshot({
  dir: "/sdcard/Pictures", 
  fileName: "camera_20231001_120000",
  rotate: 0
});

if (snapshotResult.errorCodeNumber === 0) {
  console.log("截图保存至:", snapshotResult.data);
  // 结果: /sdcard/Pictures/camera_20231001_120000.jpg
}

getVideoClarity

功能描述

获取当前视频清晰度设置。

函数签名

getVideoClarity(): Promise<ThingCameraResponse<number>>;

返回值

Promise<ThingCameraResponse<number>>:当前清晰度值。

示例

const clarityResult = await camera.getVideoClarity();
if (clarityResult.errorCodeNumber === 0) {
  const currentClarity = clarityResult.data;
  console.log("当前清晰度:", currentClarity); // 如 4(高清)
}

setVideoClarity

功能描述

设置视频清晰度。

函数签名

setVideoClarity(clarity: number): Promise<ThingCameraResponse<number>>;

参数说明

参数 类型 说明
clarity number 清晰度值(2 = 标清,4 = 高清,8 = 超清)

返回值

Promise<ThingCameraResponse<number>>:设置后的清晰度值。

示例

// 设置为高清
const setResult = await camera.setVideoClarity(4);
if (setResult.errorCodeNumber === 0) {
  console.log("清晰度已设置为:", setResult.data);
}

getIsEchoData

功能描述

获取当前音频回声数据透出状态。

函数签名

getIsEchoData(): boolean;

返回值

  • true:音频数据透出给监听器处理。
  • false:音频数据直接发送给设备(默认)。

示例

const isEcho = camera.getIsEchoData();
console.log("回声模式:", isEcho ? "透出" : "直发");

setIsEchoData

功能描述

设置音频回声数据处理模式。

函数签名

setIsEchoData(echoData: boolean): void;

参数说明

参数 类型 说明
echoData boolean true:音频数据透出到 OnP2PCameraListener.onReceiveSpeakerEchoData
false:音频数据直接发送到摄像头设备
  • false(默认):普通对讲场景,音频直接传输。
  • true:需要音频预处理的场景(如回声消除、噪声抑制、音效添加等)。

示例

// 开启回声数据透出(用于自定义音频处理)
camera.setIsEchoData(true);

// 注册监听器处理音频数据
const listener: OnP2PCameraListener = {
  onReceiveSpeakerEchoData: (audioBuffer, sampleRate) => {
    // 自定义音频处理逻辑(如降噪、音效等)
    console.log(`音频数据: ${audioBuffer.byteLength} 字节, 采样率: ${sampleRate}`);
    // 处理后可选择性发送给设备
  }
};
camera.registerP2PCameraListener(listener);

supportLowPower

功能描述

检查设备是否支持低功耗唤醒模式(如电池供电设备)。

函数签名

supportLowPower(): boolean;

返回值

  • true:设备支持低功耗唤醒。
  • false:不支持。

示例

if (cameraP2P.supportLowPower()) {  console.log("设备支持低功耗模式");}

startVideoTalk

功能描述

开始视频对讲功能,建立视频通话连接。

函数签名

startVideoTalk(callback: ThingBaseCallback): number;

参数说明

参数 类型 说明
callback ThingBaseCallback 操作结果回调

返回值

number 请求 ID,用于后续操作标识。

  • 需要设备支持视频对讲功能。
  • 调用成功后需要配合 startVideoCapturestartSendVideoTalkData 使用。

示例

const requestId = cameraP2P.startVideoTalk({
  onResponse: (reason: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("视频对讲开始成功");
      // 开始视频采集和发送
      cameraP2P.startVideoCapture(640, 480, 20);
      cameraP2P.startSendVideoTalkData(requestId);
    } else {
      console.log("视频对讲开始失败");
    }
    return 0;
  }});

pauseVideoTalk

功能描述

暂停视频对讲。

函数签名

pauseVideoTalk(callback: ThingBaseCallback): number;

参数说明

参数 类型 说明
callback ThingBaseCallback 操作结果回调

返回值

number:操作结果代码。

只能在视频对讲已开始状态下调用。

示例

cameraP2P.pauseVideoTalk({
  onResponse: (reason: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("视频对讲暂停成功");
    }                                                                 
    return 0;
  }
});

resumeVideoTalk

功能描述

恢复视频对讲。

函数签名

resumeVideoTalk(callback: ThingBaseCallback): number;

参数说明

参数 类型 说明
callback ThingBaseCallback 操作结果回调

返回值

number:请求 ID。

只能在视频对讲暂停状态下调用。

示例

const requestId = cameraP2P.resumeVideoTalk({
  onResponse: (reason: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("视频对讲恢复成功");
    }
    return 0;                                                                                      
  }
});

stopVideoTalk

功能描述

停止视频对讲。

函数签名

stopVideoTalk(): number;

返回值

number:操作结果代码。

会同时停止视频采集和数据发送。

示例

const result = cameraP2P.stopVideoTalk();
if (result >= 0) {
  console.log("视频对讲停止成功");
}

startVideoCapture

功能描述

开始视频采集。

函数签名

startVideoCapture(width: number, height: number, frameRate: number): number;

参数说明

参数 类型 说明
width number 视频宽度
height number 视频高度
frameRate number 帧率(15-30,默认 20)

返回值

number:操作结果代码。

需要在视频对讲开始后调用。

示例

const result = cameraP2P.startVideoCapture(640, 480, 20);
if (result >= 0) {
  console.log("视频采集开始成功");
}

stopVideoCapture

功能描述

停止视频采集。

函数签名

stopVideoCapture(): number;

返回值

number:操作结果代码。

会自动停止视频数据发送。

示例

const result = cameraP2P.stopVideoCapture();
if (result >= 0) {
  console.log("视频采集停止成功");
}

switchCamera

功能描述

切换摄像头(前后置摄像头切换)。

函数签名

switchCamera(): number;

返回值

number:操作结果代码。

需要设备支持多摄像头。

示例

const result = cameraP2P.switchCamera();
if (result >= 0) {
  console.log("摄像头切换成功");
}

startSendVideoTalkData

功能描述

开始视频编码并发送视频数据到设备。

函数签名

startSendVideoTalkData(requestId: number): number;

参数说明

参数 类型 说明
requestId number 视频对讲的请求 ID

返回值

number:操作结果代码。

需要在视频采集开始后调用。

示例

const result = cameraP2P.startSendVideoTalkData(requestId);
if (result >= 0) {
  console.log("视频数据发送开始成功");
}

stopSendVideoTalkData

功能描述

停止视频编码和视频数据发送。

函数签名

stopSendVideoTalkData(): number;

返回值
number:操作结果代码。

会自动停止视频采集。

示例

const result = cameraP2P.stopSendVideoTalkData();
if (result >= 0) {
  console.log("视频数据发送停止成功");
}

enableAudioEffect

功能描述

启用或禁用音频特效。

函数签名

enableAudioEffect(enable: boolean): number;

参数说明

参数 类型 说明
enable boolean true:启用,false:禁用

返回值

number:操作结果代码。

需要在音频对讲开始前设置。

示例

const result = cameraP2P.enableAudioEffect(true);
if (result >= 0) {
  console.log("音频特效启用成功");
}

setAudioEffectParameters

功能描述

设置音频特效参数。

函数签名

setAudioEffectParameters(  robotizationSupported: boolean,  pitch: number,   time_scale: number,  normal_amp_scale: number,  robot_amp_scale: number): number;

参数说明

参数 类型 说明
robotizationSupported boolean 是否支持机器声
pitch number 音调参数
time_scale number 时间缩放(目前只支持 1.0)
normal_amp_scale number 普通音量缩放
robot_amp_scale number 机器声音量缩放

返回值

number:操作结果代码。

需要在音频特效启用后设置。

示例

const result = cameraP2P.setAudioEffectParameters(true, 1.5, 1.0, 1.0, 1.2);
if (result >= 0) {
  console.log("音频特效参数设置成功");
}

setDeviceFeatures

功能描述

设置设备特性。

函数签名

setDeviceFeatures(jsonFeatures: string): number;

参数说明

参数 类型 说明
jsonFeatures string 设备特性的 JSON 字符串

返回值

number:操作结果代码。

JSON 格式需要符合设备要求。

示例

const features = {
  "video_quality": "high",
  "audio_format": "pcm"
};
const result = cameraP2P.setDeviceFeatures(JSON.stringify(features));
if (result >= 0) {
  console.log("设备特性设置成功");
}

setVideoSplitInfo

功能描述

设置视频分割信息。

函数签名

setVideoSplitInfo(json: string): number;

参数说明

参数 类型 说明
json string 视频分割信息的 JSON 字符串

返回值

number:操作结果代码。

用于多目摄像头视频分割显示。

示例

const splitInfo = {
  "split_type": "quad",
  "channels": 4
};
const result = cameraP2P.setVideoSplitInfo(JSON.stringify(splitInfo));
if (result >= 0) {
  console.log("视频分割信息设置成功");
}

startPlayBackDownload

功能描述

开始回放视频下载。

函数签名

startPlayBackDownload(
  startTime: number,  stopTime: number,
  folderPath: string,  mp4FileName: string,
  thumbFileName: string,
  rotation: ThingCameraConstants.Rotation,
  version: number,
  callback: ThingProgressiveCallback): number;

参数说明

参数 类型 说明
startTime number 开始时间戳
stopTime number 结束时间戳
folderPath string 保存文件夹路径
mp4FileName string MP4 文件名
thumbFileName string 缩略图文件名
rotation ThingCameraConstants.Rotation 旋转角度
version number 版本号
callback ThingProgressiveCallback 进度回调

返回值

number:操作结果代码。

需要确保文件夹路径有写入权限。

示例

const result = cameraP2P.startPlayBackDownload(
  1620000000,
  1620003600,
  "/sdcard/Download",
  "playback.mp4",
  "thumb.jpg",
  ThingCameraConstants.Rotation.ROTATION_0,
  1,{
    onResponse: (reason: string, errCode: number) => {
      console.log("下载响应:", reason);
      return 0;
    },
    onProgress: (progress: number) => {
      console.log("下载进度:", progress + "%");
    }
  }
);

stopPlayBackDownload

功能描述

停止回放视频下载。

函数签名

stopPlayBackDownload(callback: ThingBaseCallback): number;

参数说明

参数 类型 说明
callback ThingBaseCallback 操作结果回调

返回值

number:操作结果代码。

只能停止正在进行的下载任务。

示例

const result = cameraP2P.stopPlayBackDownload({
  onResponse: (reason: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("下载停止成功");
    }
    return 0;
  }
});

deletePlaybackDataByDay

功能描述

按天删除回放数据。

函数签名

deletePlaybackDataByDay(day: string, callback: ThingFinishableCallback): number;

参数说明

参数 类型 说明
day string 日期字符串(格式:YYYYMMDD)
callback ThingFinishableCallback 操作结果回调

返回值

number:操作结果代码。

删除操作不可逆,请谨慎使用。

示例

const result = cameraP2P.deletePlaybackDataByDay("20231201", {
  onFinished: (data: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("删除完成");
    }
  },
  onResponse: (reason: string, errCode: number) => {
    return 0;
  }
});

deletePlaybackDataByFragments

功能描述

按片段删除回放数据。

函数签名

deletePlaybackDataByFragments(fragmentJson: string, callback: ThingFinishableCallback): number;

参数说明

参数 类型 说明
fragmentJson string 片段信息的 JSON 字符串
callback ThingFinishableCallback 操作结果回调

返回值

number:操作结果代码。

JSON 格式需要包含要删除的片段信息。

示例

const fragments = {
  "fragments": [
    {"startTime": 1620000000, "endTime": 1620003600}
  ]
};
const result = cameraP2P.deletePlaybackDataByFragments(JSON.stringify(fragments), {
  onFinished: (data: string, errCode: number) => {
    if (errCode >= 0) {
      console.log("片段删除完成");
    }
  }
});

startPreviewWithClarity

功能描述

以指定清晰度开始预览。

函数签名

startPreviewWithClarity(
  clarity: ThingCameraConstants.VideoClarityMode,
  callback: ThingCameraCallback): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
clarity ThingCameraConstants.VideoClarityMode 清晰度模式
callback ThingCameraCallback 操作回调

返回值

Promise<ThingCameraResponse<void>>:异步操作结果。

可以在预览前指定清晰度,避免先默认清晰度再切换。

示例

const result = await cameraP2P.startPreviewWithClarity(
  ThingCameraConstants.VideoClarityMode.THING_CLARITY_HD,  {
    onResponse: (reason: string, errCode: number) => {
      if (errCode >= 0) {
        console.log("高清预览开始成功");
      }
      return 0;
    }
  }
);

setPlayBackSpeed

功能描述

设置回放视频的播放速度,用于控制回放时的快进、慢放等效果。

函数签名

setPlayBackSpeed(speed: number): Promise<ThingCameraResponse<void>>;

参数说明

参数 类型 说明
speed number 播放速度值

返回值

  • Promise<ThingCameraResponse<void>>:异步操作结果。
  • errorCodeNumber:操作结果错误码。
  • ThingCameraErrorCode.SUCCESS:设置成功。
  • ThingCameraErrorCode.CAMERA_OBJECT_NULL:摄像头对象为空。

其他错误码参考 ThingCameraErrorCode

  • 必须在回放开始后调用,否则设置无效。
  • 不同设备支持的速度范围可能不同,建议在常用速度范围内。
  • 设置速度后,回放画面和音频会相应调整播放速率。
  • 反向播放功能需要设备支持。

示例

// 设置2倍速快进
const result = await cameraP2P.setPlayBackSpeed(2.0);
if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
  console.log("播放速度设置成功:2倍速");
} else {
  console.log("播放速度设置失败,错误码:" + result.errorCodeNumber);
}

// 设置 0.5 倍速慢放
const slowResult = await cameraP2P.setPlayBackSpeed(0.5);
if (slowResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
  console.log("播放速度设置成功:0.5 倍慢放");
}

// 设置正常速度倒放
const reverseResult = await cameraP2P.setPlayBackSpeed(-1.0);
if (reverseResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
  console.log("播放速度设置成功:正常速度倒放");
}

直播

连接拉流

IPCLog.d(this.logTag, 'ipc connect start')

if (TSmartUser.getUid() !== undefined) {
    this.cameraP2P.connectWrapper().then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc connect success')
            let previewCallBack: ThingCameraCallback = {
                    onResponse: (reason: string, errCode: number) => {
                      if (errCode >= 0) {
                        IPCLog.d(this.logTag, 'ipc preview success')
                      } else {
                        IPCLog.e(this.logTag, 'ipc preview fail')
                      }
                      return 0;
                    }
                  }
            this.cameraP2P.startPreview(previewCallBack).then((result) => {
                    if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                      IPCLog.d(this.logTag, 'ipc preview return success')
                    } else {
                      IPCLog.e(this.logTag, 'ipc preview fail')
                    }
                  }).catch((e: TSmartAtopRequestError) => {
                    IPCLog.e(this.logTag, 'ipc preview fail' + e)
                  });
                } else {
                  IPCLog.e(this.logTag, 'ipc connect fail')
                }
              }).catch((e: TSmartAtopRequestError) => {
                IPCLog.e(this.logTag, 'ipc connect fail' + e)
              })
            } else {
              IPCLog.e(this.logTag, 'uid is undefined')
            }
    IPCLog.d(this.logTag, 'ipc connect end')

断开直播

IPCLog.d(this.logTag, 'ipc disconnect start')
    let stopPreviewCallBack: ThingCameraCallback = {
              onResponse(reason: string, errCode: number): number {
                IPCLog.d(this.logTag, 'ipc disconnect callback')
                return 0;
              }
    };
    this.cameraP2P.stopPreview(stopPreviewCallBack).then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc stopPreview return success')
        } else {
                IPCLog.e(this.logTag, 'ipc stopPreview fail')
        }
    }).catch((e: TSmartAtopRequestError) => {
        IPCLog.e(this.logTag, 'ipc preview fail' + e)
    });

    this.cameraP2P.disconnect(true).then((result) => {
        if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, 'ipc disconnect return success')
        } else {
            IPCLog.e(this.logTag, 'ipc disconnect fail')
        }
    }).catch((e: TSmartAtopRequestError) => {
        IPCLog.e(this.logTag, 'ipc preview fail' + e)
    });

SD 卡回放

按月查询 SD 卡回放片段日期

let connectResult = await this.cameraP2P.connectWrapper();

          if (connectResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, "connect 成功 ");
            this.cameraP2P.queryRecordDaysByMonth(3, 2025).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS && result.data !== undefined) {
                let playbackDays = JSON.parse(result.data) as Record<string, Array<string>>;
                IPCLog.d(this.logTag, "queryRecordDaysByMonth 成功" + playbackDays["DataDays"].toString());
              } else {
                IPCLog.e(this.logTag, "queryRecordDaysByMonth 失败 " + result.errorCodeNumber);
              }
            })
          } else {
            IPCLog.d(this.logTag, "connect 失败 ");
          }

SD 卡回放查询视频片段

let connectResult = await this.cameraP2P.connectWrapper();

          if (connectResult.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
            IPCLog.d(this.logTag, "connect 成功 ");
            this.cameraP2P.queryRecordTimeSliceByDay(26, 3, 2025).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS && result.data !== undefined) {
                IPCLog.d(this.logTag, "queryRecordTimeSliceByDay 成功");
                let playbackBean = JSON.parse(result.data)  as ThingCameraPlayBackBean;
                // let playbackBean = ArkTSUtils.ASON.parse(json) as ThingCameraPlayBackBean;
                IPCLog.d(this.logTag, "queryRecordTimeSliceByDay 成功 " + playbackBean.items?.length);
                if (playbackBean.items !== undefined && playbackBean.items?.length > 0) {
                  this.mFirstThingCameraTimePieceBean = playbackBean.items[0];
                }
              } else {
                IPCLog.e(this.logTag, "queryRecordTimeSliceByDay 失败 " + result.errorCodeNumber);
              }
            })
          } else {
            IPCLog.d(this.logTag, "connect 失败 ");
          }

SD 卡回放播放

if (this.mFirstThingCameraTimePieceBean !== undefined) {
            IPCLog.d(this.logTag, "播放 SD 卡视频");
            let startTime: number = this.mFirstThingCameraTimePieceBean.startTime ?? 0;
            let endTime = this.mFirstThingCameraTimePieceBean.endTime ?? 0;
            let playTime = startTime;

            let callback: ThingCameraFinishableCallback<string, string> = {
              onResponse: (reason: string, errCode: number): void => {
                IPCLog.d(this.logTag, "播放 SD 卡视频  onResponse " + errCode);
              },
              onFinished: (data: string, errCode: number): void => {
                IPCLog.d(this.logTag, "播放 SD 卡视频  onFinished " + errCode);
              },
              onEvent: (eventType: number, info1: number, info2: number, errInfo: string): void => {
                IPCLog.d(this.logTag, "播放 SD 卡视频  onEvent " + info1);
              }
            }
            this.cameraP2P.startPlayBack(startTime, endTime, playTime, callback);
          } else {
            IPCLog.d(this.logTag, "播放 SD 卡视频失败,没有片段信息");
          }

SD 卡暂停回放

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "暂停 SD 卡视频");
            this.cameraP2P.pausePlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "暂停 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "暂停 SD 卡视频 失败");
              }
            });
          } else {
            IPCLog.d(this.logTag, "暂停 SD 卡视频失败,this.cameraP2P === undefined");
          }

SD 卡恢复回放

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "恢复 SD 卡视频");
            this.cameraP2P.resumePlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "恢复 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "恢复 SD 卡视频 失败");
              }
            });
          } else {
            IPCLog.d(this.logTag, "恢复 SD 卡视频失败,this.cameraP2P === undefined");
          }

SD 卡停止回放

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "停止 SD 卡视频");

            this.cameraP2P.stopPlayBack().then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "停止 SD 卡视频 成功");
              } else {
                IPCLog.d(this.logTag, "停止 SD 卡视频 失败 " + result.errorCodeNumber);
              }
            });
          } else {
            IPCLog.d(this.logTag, "停止 SD 卡视频失败,this.cameraP2P === undefined");
          }

更新静音状态

if (this.cameraP2P !== undefined) {
            IPCLog.d(this.logTag, "静音");

            this.cameraP2P.setMute(1).then((result) => {
              if (result.errorCodeNumber === ThingCameraErrorCode.SUCCESS) {
                IPCLog.d(this.logTag, "静音 成功");
              } else {
                IPCLog.d(this.logTag, "静音 失败 " + result.errorCodeNumber);
              }
            });
          } else {
            IPCLog.d(this.logTag, "静音失败,this.cameraP2P === undefined");
          }

获取静音状态

if (this.cameraP2P !== undefined) {
            this.cameraP2P.getMute()
          } else {
            IPCLog.d(this.logTag, "获取静音状态失败,this.cameraP2P === undefined");
          }