进阶使用

本文主要介绍在播放器组件使用时的关键注意事项及常见问题归纳。

业务匹配

原生组件

播放器为原生组件,在其上层覆盖自定义组件(如滑动转盘、拖拽手势区域)时,手势响应区域可能超出原生组件本身,导致事件被播放器拦截,影响业务交互体验。为确保交互正常,建议在用户操作自定义组件前调用 ty.nativeDisabled(true) 暂时禁用原生组件的手势响应;操作完成后,再调用 ty.nativeDisabled(false) 恢复手势响应。 如需了解更多详情,请参考原生组件。

// 拖动开始
const handTouchStart = value => {
    ty.nativeDisabled(true);
};

// 拖动时
const handTouchMove = value => {
    ty.nativeDisabled(true);
};
// 拖动结束
const handTouchEnd = value => {
    ty.nativeDisabled(true);
};

播放器上自定义组件

在播放器上添加可点击区域,如截图按钮、对讲按钮等等,均需使用 CoverView 组件包裹。

示例代码

import IpcPlayer from '@ray-js/ray-ipc-player';
import { View, Text, CoverView } from '@ray-js/ray';

function Page() {

  const [show, setShow] = useState(false)
  const deviceId = '1234567890xxxxxx';
  // 设备在线状态
  const onlineStatus = true; 
  // 获取播放器实例, 可以调用播放器实例上的方法
  const onCtx = (ctx) => {
    console.log(ctx, 'ctx');
  };
  // 监听播放器状态
  const onChangeStreamStatus = (status) => {
     console.log(status, 'status');
     // 播放器出流时,显示截图按钮,或者您也可以自定义展示
     if( status === 1002 ) {
        setShow(true);
     }
  };

  return (
    // playerContainer 为播放器容器, 设置播放器的区域大小
    <View className={Styles.playerContainer}>
      <IpcPlayer
          objectFit='contain'
          onCtx={onCtx}
          devId={deviceId}
          onlineStatus={onlineStatus}
          onChangeStreamStatus={onChangeStreamStatus}
        />

        <View className={Styles.featureContainer}>
          {show && <CoverView className={Styles.coverView}>
            <Text>screenshot</Text> 
          </CoverView> }  
        </View>
     </View>    
  )
}

样式定义

.playerContainer {
  width: 100%;
  height: 300px;
  position: relative;
}
.featureContainer {
  // 建议这里只做定位,宽高由内容支撑起来
  position: absolute;
  top: 0;
  left: 0
}
.coverView {
    width: 100px;
    height: 20px;
}

常见问题

1. 拉流播放器白屏

确认当前播放器组件容器不要设置背景色, 可参考原生组件说明

2. 视频流加载错误定位

APP 650 及以上版本, IpcPlayer 满足 >= 2.0.20 版本, 在视频流加载失败,会携带具体错误码,开发者可以根据错误码进行定位。

附录

错误码

参数名说明
-60000暂无可用流量,请尽快充值
-1000接口请求参数非法或为空(传入参数校验)
-1001接口调用失败
-1301接口调用失败
-30接口调用失败
-1002接口结果解析失败【数据无效】
-1303接口结果解析失败【数据无效】
-20003接口结果解析失败【数据无效】
-5无效的参数, 方法参数非法
-1010无效的参数, 方法参数非法
-1310无效的参数, 方法参数非法
-20002无效的参数, 方法参数非法
-40001无效的参数, 方法参数非法
-1011返回结果解析为空
-1311返回结果解析为空
-40002返回结果解析为空
-1020不支持的P2PType
-1未初始化
-1360camera对象未初始化/已被销毁
-10000camera对象未初始化/已被销毁
-1361camera对象创建失败
-1362camera对象连接异常/未连接
-10001camera对象连接异常/未连接
-1390设备离线
-10006设备离线
-1通用错误码
-40000cameraSDK 通用错误
-40200流媒体处理通用错误
-40300解码处理通用错误码
-40400云存储通用错误码
-11无效的会话
-10002session失效
-3超时
-10003超时
-40201获取网络数据超时
-40202获取流媒体超时,需要更多的数据
-40203解码超时
-33p2p获取session超时
-38dtls握手超时
-55连接超时【-3细化】
-56连接超时【-3细化】
-57连接超时【-3细化】
-58连接超时【-3细化】
-1004P2P中途被取消
-1008设备发生错误
-41001设备无响应
-39对端未响应预连接的命令
-20001无效的操作
-20004操作被中断
-40205流媒体处理过程中被用户打断
-20005不允许操作
-20007设备繁忙
-20008内存分配失败
-29内存不足
-30012音频参数有误
-30060设备端返回参数错误
-30061数据传输错误
-30082没有收到第一个i帧【未收到数据】
-12会话被对端关闭
-13会话已关闭
-14会话被本地关闭
-100会话被对端关闭
-115设备处于限制拉流状态
-23会话数满
-104会话数满,关闭会话
-24无效的预连接
-25预连接已断开
-102监听到会话,但是设备处于隐私模式,关闭会话
-103发送数据线程创建失败
-105鉴权失败
-108僵尸会话
-114应用层申请资源失败
-50没有收到answer或者candidate
-52socket 连接失败
-53对端socket 连接失败
-54tcprelay服务未响应(校验失败或设备id不正确)
-20006当前app版本不支持该协议需要升级app
-30083当前只支持mjpeg流
-40301错误的解码输入
-40302错误的解密输出
-40303不支持的像素格式
-41000设备通用错误码
-40206流媒体处理过程中设备异常
-54tcprelay服务未响应(校验失败或设备id不正确)