之前我们通过EasyStreamClient对接海康流媒体V4.X实现了无插件播放,在这其中还有很多SDK中关键的函数需要注意,本文对这些函数做一个总结,大家可以参考。同时本文附带了海康流媒体 V4.X SDK 错误码定义说明,大家也可以对照错误码的定义来进行局部修改和调试。

1、相对时间回放函数接口 StreamClient_PlayBackByOppositeTime

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK
StreamClient_PlayBackByOppositeTime(
int sessionhandle,
char* url,
char* useragent,
int transmethod,
char *deviceusername,
char *devicepasswd,
int from,
int to
);

(2)接口说明:

请求相对时间回放功能。

(3)参数说明:

sessionhandle[in] 会话句柄(StreamClient_CreateSession 函数返回值),
windowhandle[in] 窗口句柄(未使用,传 NULL),
url[in] 绝对时间回放 url(url 格式参见 流媒体取流 URL 说明章节 ),
useragent[in] 客户端名称(比如:StreamClient),
transmethod[in] 传输方式(RTPRTSP_TRANSMODE/0X9000、
RTPUDP_TRANSMODE/0X9002),
deviceusername[in] 设备的用户名,
devicepasswd[in] 设备的密码,
from[in] 开始时间(以毫秒为单位),
to[in] 结束时间(以毫秒为单位)。

(4)返回值:

成功时返回 0,失败返回错误码

2、绝对时间倒放函数接口 StreamClient_BackwardEx

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_BackwardEx(
int sessionhandle,
const char* url,
const char* useragent,
int transmethod,
const char *deviceusername,
const char *devicepasswd,
pABS_TIME pfrom,
pABS_TIME pto
);

(2)接口说明:

请求绝对时间倒放功能。

(3)参数说明:

sessionhandle[in] 会话句柄(StreamClient_CreateSession 函数返回值),
url[in] 绝对时间回放 url(url 格式参见 流媒体取流 URL 说明章节 ),
useragent[in] 客户端名称(比如:StreamClient),
transmethod[in] 传输方式(RTPRTSP_TRANSMODE/0X9000、
RTPUDP_TRANSMODE/0X9002),
deviceusername[in] 设备的用户名,
devicepasswd[in] 设备的密码,
from[in] 开始时间,
to[in] 结束时间。

(4)返回值:

成功时返回 0,失败返回错误码。

(5)备注:

开始时间和结束时间顺序问题,例如:倒放以下时间段录像:2014-5-5 18:00:00 至 2014-5-8
18:00:00。
开始时间传入 2014-5-8 18:00:00;
结束时间传入 2014-5-5 18:00:00。

3、设备 UDP 传输方式端口范围函数接口 StreamClient_SetRTPUDPPortRange

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK
StreamClient_SetRTPUDPPortRange(
unsigned short count,
unsigned short baseport
);

(2)接口说明:

设备 UDP 传输方式端口范围。

(3)参数说明:

count [in] UDP 端口对数,
baseport [in] UDP 起始端口。

(4)返回值:

成功时返回 0,失败返回错误码,参见流媒体 4.3 客户端错误码文档。

4、强制 I 帧操作函数接口 StreamClient_ForceIFrame

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_ForceIFrame(
int sessionhandle
);

(2)接口说明:

强制 I 帧操作,用于实时预览。

(3)参数说明:

sessionhandle[in] 会话句柄(StreamClient_CreateSession 函数返回值)。

(4)返回值:

成功时返回 0,失败返回错误码。

5、强制 I 帧操作函数接口 StreamClient_ForceIFrame

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_ForceIFrame(
int sessionhandle
);

(2)接口说明:

强制 I 帧操作,用于实时预览。

(3)参数说明:

sessionhandle[in] 会话句柄(StreamClient_CreateSession 函数返回值)。

(4)返回值:

成功时返回 0,失败返回错误码

6、发送推流请求函数接口 StreamClient_PushData

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_PushData(
int sessionHandle,
const char* url,
const char* userAgent,
const char* deviceUsername,
const char* devicePasswd,
const char* destIp,
unsigned short destPort,
int transMethod
);

(2)接口说明:

发送推流请求,请求流媒体服务器向指定解码器推流,应用于电视墙。

(3)参数说明:

sessionHandle[in] 会话句柄(StreamClient_CreateSession 函数返回值),
url[in] 推流请求 url(url 格式参见 流媒体取流 URL 说明章节 ),
userAgent[in] 客户端名称(比如:StreamClient),
deviceUsername[in] 设备的用户名,
devicePasswd[in] 设备的密码,
destIp[in] 目标解码器的 IP,
destPort[in] 目标解码器的端口,
transmethod[in] 传输方式(当前仅支持 RTPUDP_TRANSMODE)。

(4)返回值:

成功时返回 0,失败返回错误码。

7、设置 RTSP 信令超时时间函数接口 StreamClient_SetRtspTimeout

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_SetRtspTimeout(
int sessionhandle,
unsigned int timeout
);

(2)接口说明:

设置 RTSP 信令超时时间,不调用此函数 RTSP 信令默认超时时间是 6 秒。

(3)参数说明:

sessionHandle[in] 会话句柄(StreamClient_CreateSession 函数返回值),
timeout [in] 超时时间,单位:秒。

(4)返回值:

成功时返回 0,失败返回错误码,参见流媒体 4.3 客户端错误码文档。

(5)备注:

当设置超时时间是 0 秒时,接口内部会自动改为 1 秒。

8、开启 RTP 包排序接口 StreamClient_RtpPacketReSortEnable

(1)接口声明:

HPR_STREAMCLIENT_DECLARE int CALLBACK StreamClient_
RtpPacketReSortEnable (
int session_handle,
int MaxBuffPacket = 25,
);

(2)接口说明:
开启 RTP 包排序,UDP 传输时需要排序,只支持 RTP 流,如果非 RTP 流,直接回调原始
码流。
(3)参数说明:
session_handle[in] 会话句柄(StreamClient_CreateSession 函数返回值),
MaxBuffPacket [in] 最大缓冲包数。
(4)返回值:
成功时返回 0,失败返回错误码。

附:海康流媒体 V4.X SDK 错误码定义说明

1、函数返回值错误码定义

#define STREAM_CLIENT_NO_RTSP_SESSION -3 ///< 流媒体客户端会话已经用尽
#define STREAM_CLIENT_NO_INIT -2 ///< 流媒体客户端未初始化
#define STREAM_CLIENT_ERR_NO_DEF -1 ///< 错误未定义
#define STREAM_CLIENT_NOERROR 0 ///< 没有错误
#define STREAM_CLIENT_SAESSION_INVALID 1 ///< 会话无效
#define STREAM_CLIENT_OVER_MAX_CONN 2 ///< 超出流媒体用户个数超过最大
#define STREAM_CLIENT_NETWORK_FAIL_CONNECT 3 ///< 连接设备失败。设备不在线或网络原因引起的连接超时等。
#define STREAM_CLIENT_DEVICE_OFF_LIEN 4 ///< 设备掉线
#define STREAM_CLIENT_DEVICE_OVER_MAX_CONN 5 ///< 设备超过最大连接数
#define STREAM_CLIENT_RECV_ERROR 6 ///< 从流媒体服务器接收数据失败
#define STREAM_CLIENT_RECV_TIMEOUT 7 ///< 从流媒体服务器接收数据超时
#define STREAM_CLIENT_SEND_ERROR 8 ///< 向流媒体服务器发送数据失败
#define STREAM_CLIENT_TRANSMETHOD_INVALID 9 ///< 传输方式无效(不是RTP/RTSP,RTP/UDP,RTP/MCAST)
#define STREAM_CLIENT_CREATESOCKET_ERROR 10 ///< 创建SOCKET失败
#define STREAM_CLIENT_SETSOCKET_ERROR 11 ///< 设置SOCKET失败
#define STREAM_CLIENT_BINDSOCKET_ERROR 12 ///< 绑定SOCKET失败
#define STREAM_CLIENT_LISTENSOCKET_ERROR 13 ///< 监听SOCKET失败
#define STREAM_CLIENT_URL_FORMAT_ERROR 14 ///< URL格式错误
#define STREAM_CLIENT_RTSP_STATE_INVALID 15 ///< RTSP状态无效
#define STREAM_CLIENT_RTSP_RSP_ERROR 16 ///< RTSP回应错误(语法错误,未包含必须的字段)
#define STREAM_CLIENT_RTSP_RSP_STATE_ERROR 17 ///< RTSP返回状态失败
#define STREAM_CLIENT_PARSE_SDP_FAIL 18 ///< 解析SDP失败
#define STREAM_CLIENT_PARSE_RTSP_FAIL 19 ///< 解析RTSP信令失败(比如:获取RTSP某字段失败,RTSP)
#define STREAM_CLIENT_MEDIACOUNT_LESS_ZERO 20 ///< 解析SDP时,未解析到traceID
#define STREAM_CLIENT_SEND_DESCRIBE_FAIL 21 ///< 发送describe信令失败
#define STREAM_CLIENT_SEND_SETUP_FAIL 22 ///< 发送setup信令失败
#define STREAM_CLIENT_SEND_PLAY_FAIL 23 ///< 发送play信令失败
#define STREAM_CLIENT_SEND_PAUSE_FAIL 24 ///< 发送pause信令失败
#define STREAM_CLIENT_SEND_TRERDOWN_FAIL 25 ///< 发送teardown信令失败
#define STREAM_CLIENT_RECV_DESCRIBE_TIMEOUT 26 ///< 接收describe超时
#define STREAM_CLIENT_RECV_SETUP_TIMEOUT 27 ///< 接收setup超时
#define STREAM_CLIENT_RECV_PLAY_TIMEOUT 28 ///< 接收play超时
#define STREAM_CLIENT_RECV_PAUSE_TIMEOUT 29 ///< 接收pause超时
#define STREAM_CLIENT_RECV_TEARDOWN_TIMEOUT 30 ///< 接收teardown超时
#define STREAM_CLIENT_DESCRIBE_RSP_ERROR 31 ///< describe响应错误
#define STREAM_CLIENT_SETUP_RSP_ERROR 32 ///< setup响应错误
#define STREAM_CLIENT_PLAY_RSP_ERROR 33 ///< play响应错误
#define STREAM_CLIENT_PAUSE_RSP_ERROR 34 ///< pause响应错误
#define STREAM_CLIENT_TEARDOWN_RSP_ERROR 35 ///< teardown响应错误
#define STREAM_CLIENT_REDIRECT_ERROR 36 ///< 重定向失败
#define STREAM_CLIENT_UDP_GET_SERVER_PROT_FAIL 37 ///< 从RTSP的setup信令解析服务器端口失败
#define STREAM_CLIENT_CREATE_UPD_CONNECT_FAIL 38 ///< 创建UDP异步网络连接失败
#define STREAM_CLIENT_OPEN_UDP_CONNECT_FAIL 39 ///< 打开UDP异步网络连接失败
#define STREAM_CLIENT_UDP_ASYNC_RECV_FAIL 40 ///< UDP投递异步接收请求失败
#define STREAM_CLIENT_OPT_BACK_DATE_ERROR 41 ///< 相对时间回放时间错误
#define STREAM_CLIENT_ABS_BACK_DATE_ERROR 42 ///< 绝对时间回放时间错误
#define STREAM_CLIENT_MSG_CB_INVALID 43 ///< 消息回调设置错误
#define STREAM_CLIENT_SEND_PTZ_FAILED 44 ///< 发送云台控制信令失败
#define STREAM_CLIENT_SEND_FORCEIFRAM_FAILED 45 ///< 发送强制I帧信令失败
#define STREAM_CLIENT_SEND_GETVEDIOPARAM_FAILED 46 ///< 发送获取视频参数信令失败
#define STREAM_CLIENT_SEND_SETVEDIOPARAM_FAILED 47 ///< 发送设置视频参数信令失败
#define STREAM_CLIENT_RECV_PTZ_TIMEOUT 48 ///< 接收云台控制信令超时
#define STREAM_CLIENT_RECV_FORCEIFRAM_TIMEOUT 49 ///< 接收强制I帧信令超时
#define STREAM_CLIENT_RECV_GETVEDIOPARAM_TIMEOUT 50 ///< 接收获取视频参数信令超时
#define STREAM_CLIENT_RECV_SETVEDIOPARAM_TIMEOUT 51 ///< 接收设置视频参数信令超时
#define STREAM_CLIENT_FUNCTION_NO_ACHIEVE 52 ///< 函数未实现
#define STREAM_CLIENT_CONFIG_RTSP_SESSION_FAILED 53 ///< 配置RTSP会话时,某参数无效
#define STREAM_CLIENT_FUNC_PARAM_INVALID 54 ///< 函数参数无效
#define STREAM_CLIENT_SESSION_POINTER_INVALID 55 ///< 会话指针无效
#define STREAM_CLIENT_MEMORY_LACK 56 ///< 内存不足或申请内存失败
#define STREAM_CLIENT_SEND_SETPARAMETER_FAILED 57 ///< 发送设置参数信令失败
#define STREAM_CLIENT_RECV_SETPARAMETER_TIMEOUT 58 ///< 接收设置参数信令超时
#define STREAM_CLIENT_SEND_HEARTBEAT_FAILED 59 ///< 发送心跳信令失败
#define STREAM_CLIENT_RECV_HEARTBEAT_TIMEOUT 60 ///< 接收心跳信令超时
#define STREAM_CLIENT_PUSHDATA_TRANSMETHOD_INVALID 61 ///< 推流传输方式无效(仅支持RTPUDP_TRANSMODE)
#define STREAM_CLIENT_VTDU_PERMISSION_LACK 62 ///< 权限不足(VTDU)
#define STREAM_CLIENT_ANALYZE_DATA_FAILED 63 ///< 帧分析失败
#define STREAM_CLIENT_VTM_PARSE_ERROR 64 ///< 信令解析出错(VTM)
#define STREAM_CLIENT_VTM_EMPTY_CLUSTER 65 ///< 集群中无vtdu存在(VTM)
#define STREAM_CLIENT_VTM_OVERLOAD_ERROR 66 ///< 集群超载时,权限不足(VTM)
#define STREAM_CLIENT_VTM_LACK_PERMISSION 67 ///< 权限限制(VTM)
#define STREAM_CLIENT_VTM_SERVER_INTERNAL 68 ///< 服务器内部错误(VTM)

2、消息回调错误定义(流媒体客户端产生)

#define STREAM_CLIENT_SEND_HEARTBEAT_FAIL 4001 ///< 发送心跳失败
#define STREAM_CLIENT_HEARTBEAT_TIMEOUT 4002 ///< 心跳超时
#define STREAM_CLIENT_NOT_SUPPORT_PS_STREAM 4003 ///< 不支持转封装成PS码流标识,消息数据回调中使用
#define STREAM_CLIENT_NO_TRANSFORM_PS_STREAM 4004 ///< 码流已经是PS流,不再转封装,直接回调原始码流,消息数据回调中使用
#define STREAM_CLIENT_TRANSFORM_PS_OPEN_ERROR 4005 ///< 转封装开启失败

3、消息回调错误定义(流媒体服务器产生)

#define STREAM_CLIENT_ERR_FROM_SERVER 8000 ///< 总的错误码,根据这个错误码进行判断
#define STREAM_CLIENT_CLICK 8001 ///< 因权限不足,被踢掉
#define STREAM_CLIENT_LOCATION_FAILED 8002 ///< 回放定位失败
#define STREAM_CLIENT_DEVICE_NET_ERROR 8500 ///< 错误
#define STREAM_CLIENT_DEVICE_NET_ERROR_PARAM 8501 ///< 请求的参数错误(URL、通道不存在等)
#define STREAM_CLIENT_DEVICE_NET_ERROR_PASSWD 8502 ///< 用户名密码错误
#define STREAM_CLIENT_DEVICE_NET_ERROR_CONNECT 8503 ///< 设备不在线,或连接超时
#define STREAM_CLIENT_VAG_STREAM_TIME_OUT 8601 //取流超时
#define STREAM_CLIENT_VAG_STREAM_HEADER_NULL 8602 //没有码流头
#define STREAM_CLIENT_VAG_START_STREAM_ERROR 8603 //vag 取流交互失败
#define STREAM_CLIENT_VAG_PARSE_URL 8604 //解析 url 失败
#define STREAM_CLIENT_VAG_LOGIN_VAG 8605 //登录 VAG 失败
#define STREAM_CLIENT_VAG_QUERY_RES 8606 //查询 VAG 资源
#define STREAM_CLIENT_VAG_HIK_START_STREAM 8607 //海康设备取流
#define STREAM_CLIENT_VAG_DAHUA_START_STREAM 8608 //大华设备取流
#define STREAM_CLIENT_VAG_INIT_DEV_CONNECTION 8609 //主动设备收流连接开启失败

4、消息回调错误定义(VTM产生)

#define STREAM_CLIENT_VTM_ERR 9000 ///< VTM 错误