Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
821d693f
Commit
821d693f
authored
May 11, 2017
by
xzl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加海康IPC的接入源码
parent
4b48a24a
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
365 行增加
和
0 行删除
+365
-0
tests/DeviceHK/DeviceHK.cpp
+248
-0
tests/DeviceHK/DeviceHK.h
+117
-0
没有找到文件。
tests/DeviceHK/DeviceHK.cpp
0 → 100644
查看文件 @
821d693f
/*
* DeviceHK.cpp
*
* Created on: 2016年8月10日
* Author: xzl
*/
#ifdef ENABLE_HKDEVICE
#include "DeviceHK.h"
#include "Util/TimeTicker.h"
#include "Util/MD5.h"
namespace
ZL
{
namespace
DEV
{
#define HK_APP_NAME "live"
DeviceHK
::
DeviceHK
()
{
InfoL
<<
endl
;
static
onceToken
token
(
[]()
{
NET_DVR_Init
();
NET_DVR_SetDVRMessageCallBack_V31
([](
LONG
lCommand
,
NET_DVR_ALARMER
*
pAlarmer
,
char
*
pAlarmInfo
,
DWORD
dwBufLen
,
void
*
pUser
){
WarnL
<<
pAlarmInfo
;
return
TRUE
;
},
NULL
);
},
[]()
{
NET_DVR_Cleanup
();
});
}
DeviceHK
::~
DeviceHK
()
{
InfoL
<<
endl
;
}
void
DeviceHK
::
connectDevice
(
const
connectInfo
&
info
,
const
connectCB
&
cb
,
int
iTimeOut
)
{
NET_DVR_USER_LOGIN_INFO
loginInfo
;
NET_DVR_DEVICEINFO_V40
loginResult
;
//login info
strcpy
(
loginInfo
.
sDeviceAddress
,
info
.
strDevIp
.
c_str
());
loginInfo
.
wPort
=
info
.
ui16DevPort
;
strcpy
(
loginInfo
.
sUserName
,
info
.
strUserName
.
c_str
());
strcpy
(
loginInfo
.
sPassword
,
info
.
strPwd
.
c_str
());
//callback info
typedef
function
<
void
(
LONG
lUserID
,
DWORD
dwResult
,
LPNET_DVR_DEVICEINFO_V30
lpDeviceInfo
)
>
hkLoginCB
;
loginInfo
.
bUseAsynLogin
=
TRUE
;
weak_ptr
<
Device
>
weakSelf
=
shared_from_this
();
loginInfo
.
pUser
=
new
hkLoginCB
([
weakSelf
,
cb
](
LONG
lUserID
,
DWORD
dwResult
,
LPNET_DVR_DEVICEINFO_V30
lpDeviceInfo
)
{
//TraceL<<lUserID<<" "<<dwResult<<" "<<lpDeviceInfo->sSerialNumber;
connectResult
result
;
if
(
dwResult
==
TRUE
)
{
result
.
strDevName
=
(
char
*
)(
lpDeviceInfo
->
sSerialNumber
);
result
.
ui16ChnStart
=
lpDeviceInfo
->
byStartChan
;
result
.
ui16ChnCount
=
lpDeviceInfo
->
byChanNum
;
auto
_strongSelf
=
weakSelf
.
lock
();
if
(
_strongSelf
)
{
auto
strongSelf
=
dynamic_pointer_cast
<
DeviceHK
>
(
_strongSelf
);
strongSelf
->
onConnected
(
lUserID
,
lpDeviceInfo
);
}
}
else
{
WarnL
<<
"connect deviceHK failed:"
<<
NET_DVR_GetLastError
();
}
cb
(
dwResult
==
TRUE
,
result
);
});
loginInfo
.
cbLoginResult
=
[](
LONG
lUserID
,
DWORD
dwResult
,
LPNET_DVR_DEVICEINFO_V30
lpDeviceInfo
,
void
*
pUser
)
{
auto
*
fun
=
static_cast
<
hkLoginCB
*>
(
pUser
);
(
*
fun
)(
lUserID
,
dwResult
,
lpDeviceInfo
);
delete
fun
;
};
NET_DVR_SetConnectTime
(
iTimeOut
*
1000
,
3
);
NET_DVR_Login_V40
(
&
loginInfo
,
&
loginResult
);
}
void
DeviceHK
::
disconnect
(
const
relustCB
&
cb
)
{
m_mapChannels
.
clear
();
if
(
m_i64LoginId
>=
0
)
{
NET_DVR_Logout
(
m_i64LoginId
);
m_i64LoginId
=
-
1
;
Device
::
onDisconnected
(
true
);
}
}
void
DeviceHK
::
addChannel
(
int
iChn
,
bool
bMainStream
)
{
DevChannel
::
Ptr
channel
(
new
DevChannelHK
(
m_i64LoginId
,
(
char
*
)
m_deviceInfo
.
sSerialNumber
,
iChn
,
bMainStream
));
m_mapChannels
[
iChn
]
=
channel
;
}
void
DeviceHK
::
delChannel
(
int
chn
)
{
m_mapChannels
.
erase
(
chn
);
}
void
DeviceHK
::
onConnected
(
LONG
lUserID
,
LPNET_DVR_DEVICEINFO_V30
lpDeviceInfo
)
{
m_i64LoginId
=
lUserID
;
m_deviceInfo
=
*
lpDeviceInfo
;
Device
::
onConnected
();
}
void
DeviceHK
::
addAllChannel
(
bool
bMainStream
)
{
InfoL
<<
endl
;
for
(
int
i
=
0
;
i
<
m_deviceInfo
.
byChanNum
;
i
++
)
{
addChannel
(
m_deviceInfo
.
byStartChan
+
i
,
bMainStream
);
}
}
DevChannelHK
::
DevChannelHK
(
int64_t
i64LoginId
,
const
char
*
pcDevName
,
int
iChn
,
bool
bMainStream
)
:
DevChannel
(
HK_APP_NAME
,(
StrPrinter
<<
MD5
(
pcDevName
).
hexdigest
()
<<
"_"
<<
iChn
<<
endl
).
data
()),
m_i64LoginId
(
i64LoginId
)
{
InfoL
<<
endl
;
NET_DVR_PREVIEWINFO
previewInfo
;
previewInfo
.
lChannel
=
iChn
;
//通道号
previewInfo
.
dwStreamType
=
bMainStream
?
0
:
1
;
// 码流类型,0-主码流,1-子码流,2-码流3,3-码流4 等以此类推
previewInfo
.
dwLinkMode
=
1
;
// 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-RTP/RTSP,5-RSTP/HTTP
previewInfo
.
hPlayWnd
=
0
;
//播放窗口的句柄,为NULL表示不播放图象
previewInfo
.
byProtoType
=
0
;
//应用层取流协议,0-私有协议,1-RTSP协议
previewInfo
.
dwDisplayBufNum
=
1
;
//播放库播放缓冲区最大缓冲帧数,范围1-50,置0时默认为1
previewInfo
.
bBlocked
=
0
;
m_i64PreviewHandle
=
NET_DVR_RealPlay_V40
(
m_i64LoginId
,
&
previewInfo
,
[](
LONG
lPlayHandle
,
DWORD
dwDataType
,
BYTE
*
pBuffer
,
DWORD
dwBufSize
,
void
*
pUser
)
{
DevChannelHK
*
self
=
reinterpret_cast
<
DevChannelHK
*>
(
pUser
);
if
(
self
->
m_i64PreviewHandle
!=
(
int64_t
)
lPlayHandle
)
{
return
;
}
self
->
onPreview
(
dwDataType
,
pBuffer
,
dwBufSize
);
},
this
);
if
(
m_i64PreviewHandle
==
-
1
)
{
throw
std
::
runtime_error
(
StrPrinter
<<
"设备["
<<
pcDevName
<<
"/"
<<
iChn
<<
"]开始实时预览失败:"
<<
NET_DVR_GetLastError
()
<<
endl
);
}
}
DevChannelHK
::~
DevChannelHK
()
{
InfoL
<<
endl
;
if
(
m_i64PreviewHandle
>=
0
)
{
NET_DVR_StopRealPlay
(
m_i64PreviewHandle
);
m_i64PreviewHandle
=
-
1
;
}
if
(
m_iPlayHandle
>=
0
)
{
PlayM4_StopSoundShare
(
m_iPlayHandle
);
PlayM4_Stop
(
m_iPlayHandle
);
m_iPlayHandle
=
-
1
;
}
}
void
DevChannelHK
::
onPreview
(
DWORD
dwDataType
,
BYTE
*
pBuffer
,
DWORD
dwBufSize
)
{
//TimeTicker1(-1);
switch
(
dwDataType
)
{
case
NET_DVR_SYSHEAD
:
{
//系统头数据
if
(
!
PlayM4_GetPort
(
&
m_iPlayHandle
))
{
//获取播放库未使用的通道号
WarnL
<<
"PlayM4_GetPort:"
<<
NET_DVR_GetLastError
();
break
;
}
if
(
dwBufSize
>
0
)
{
if
(
!
PlayM4_SetStreamOpenMode
(
m_iPlayHandle
,
STREAME_REALTIME
))
{
//设置实时流播放模式
WarnL
<<
"PlayM4_SetStreamOpenMode:"
<<
NET_DVR_GetLastError
();
break
;
}
if
(
!
PlayM4_OpenStream
(
m_iPlayHandle
,
pBuffer
,
dwBufSize
,
1024
*
1024
))
{
//打开流接口
WarnL
<<
"PlayM4_OpenStream:"
<<
NET_DVR_GetLastError
();
break
;
}
PlayM4_SetDecCallBackMend
(
m_iPlayHandle
,
[](
int
nPort
,
char
*
pBuf
,
int
nSize
,
FRAME_INFO
*
pFrameInfo
,
void
*
nUser
,
int
nReserved2
)
{
DevChannelHK
*
chn
=
reinterpret_cast
<
DevChannelHK
*>
(
nUser
);
if
(
chn
->
m_iPlayHandle
!=
nPort
)
{
return
;
}
chn
->
onGetDecData
(
pBuf
,
nSize
,
pFrameInfo
);
},
this
);
if
(
!
PlayM4_Play
(
m_iPlayHandle
,
0
))
{
//播放开始
WarnL
<<
"PlayM4_Play:"
<<
NET_DVR_GetLastError
();
break
;
}
InfoL
<<
"设置解码器成功!"
<<
endl
;
//打开音频解码, 需要码流是复合流
if
(
!
PlayM4_PlaySoundShare
(
m_iPlayHandle
))
{
WarnL
<<
"PlayM4_PlaySound:"
<<
NET_DVR_GetLastError
();
break
;
}
}
}
break
;
case
NET_DVR_STREAMDATA
:
{
//流数据(包括复合流或音视频分开的视频流数据)
if
(
dwBufSize
>
0
&&
m_iPlayHandle
!=
-
1
)
{
if
(
!
PlayM4_InputData
(
m_iPlayHandle
,
pBuffer
,
dwBufSize
))
{
WarnL
<<
"PlayM4_InputData:"
<<
NET_DVR_GetLastError
();
break
;
}
}
}
break
;
case
NET_DVR_AUDIOSTREAMDATA
:
{
//音频数据
}
break
;
case
NET_DVR_PRIVATE_DATA
:
{
//私有数据,包括智能信息
}
break
;
default
:
break
;
}
}
void
DevChannelHK
::
onGetDecData
(
char
*
pBuf
,
int
nSize
,
FRAME_INFO
*
pFrameInfo
)
{
//InfoL << pFrameInfo->nType;
switch
(
pFrameInfo
->
nType
)
{
case
T_YV12
:
{
if
(
!
m_bVideoSeted
)
{
m_bVideoSeted
=
true
;
VideoInfo
video
;
video
.
iWidth
=
pFrameInfo
->
nWidth
;
video
.
iHeight
=
pFrameInfo
->
nHeight
;
video
.
iFrameRate
=
pFrameInfo
->
nFrameRate
;
initVideo
(
video
);
}
char
*
yuv
[
3
];
int
yuv_len
[
3
];
yuv_len
[
0
]
=
pFrameInfo
->
nWidth
;
yuv_len
[
1
]
=
pFrameInfo
->
nWidth
/
2
;
yuv_len
[
2
]
=
pFrameInfo
->
nWidth
/
2
;
int
dwOffset_Y
=
pFrameInfo
->
nWidth
*
pFrameInfo
->
nHeight
;
yuv
[
0
]
=
pBuf
;
yuv
[
2
]
=
yuv
[
0
]
+
dwOffset_Y
;
yuv
[
1
]
=
yuv
[
2
]
+
dwOffset_Y
/
4
;
inputYUV
(
yuv
,
yuv_len
,
pFrameInfo
->
nStamp
);
}
break
;
case
T_AUDIO16
:
{
if
(
!
m_bAudioSeted
)
{
m_bAudioSeted
=
true
;
AudioInfo
audio
;
audio
.
iChannel
=
pFrameInfo
->
nWidth
;
audio
.
iSampleBit
=
pFrameInfo
->
nHeight
;
audio
.
iSampleRate
=
pFrameInfo
->
nFrameRate
;
initAudio
(
audio
);
}
inputPCM
(
pBuf
,
nSize
,
pFrameInfo
->
nStamp
);
}
break
;
default
:
break
;
}
}
}
/* namespace DEV */
}
/* namespace ZL */
#endif //ENABLE_HKDEVICE
tests/DeviceHK/DeviceHK.h
0 → 100644
查看文件 @
821d693f
/*
* DeviceHK.h
*
* Created on: 2016年8月10日
* Author: xzl
*/
#ifndef DEVICE_DEVICEHK_H_
#define DEVICE_DEVICEHK_H_
#include <sys/time.h>
#include "HCNetSDK.h"
#include "PlayM4.h"
#include "Device/Device.h"
#include "Util/onceToken.h"
#include "Util/logger.h"
#include "Util/TimeTicker.h"
using
namespace
ZL
::
Util
;
namespace
ZL
{
namespace
DEV
{
class
connectInfo
{
public
:
connectInfo
(
const
char
*
_strDevIp
,
uint16_t
_ui16DevPort
,
const
char
*
_strUserName
,
const
char
*
_strPwd
)
{
strDevIp
=
_strDevIp
;
ui16DevPort
=
_ui16DevPort
;
strUserName
=
_strUserName
;
strPwd
=
_strPwd
;
}
string
strDevIp
;
uint16_t
ui16DevPort
;
string
strUserName
;
string
strPwd
;
};
class
connectResult
{
public
:
string
strDevName
;
uint16_t
ui16ChnStart
;
uint16_t
ui16ChnCount
;
};
typedef
function
<
void
(
bool
success
,
const
connectResult
&
)
>
connectCB
;
typedef
function
<
void
(
bool
success
)
>
relustCB
;
class
Device
:
public
enable_shared_from_this
<
Device
>
{
public
:
typedef
std
::
shared_ptr
<
Device
>
Ptr
;
Device
()
{
}
virtual
~
Device
(){
disconnect
([](
bool
bSuccess
){
});};
virtual
void
connectDevice
(
const
connectInfo
&
info
,
const
connectCB
&
cb
,
int
iTimeOut
=
3
)
=
0
;
virtual
void
disconnect
(
const
relustCB
&
cb
)
{
}
virtual
void
addChannel
(
int
iChnIndex
,
bool
bMainStream
=
true
)
=
0
;
virtual
void
delChannel
(
int
iChnIndex
)
=
0
;
virtual
void
addAllChannel
(
bool
bMainStream
=
true
)
=
0
;
protected
:
void
onConnected
()
{
}
void
onDisconnected
(
bool
bSelfDisconnect
)
{
}
};
class
DevChannelHK
;
class
DeviceHK
:
public
Device
{
public
:
typedef
std
::
shared_ptr
<
DeviceHK
>
Ptr
;
DeviceHK
();
virtual
~
DeviceHK
();
void
connectDevice
(
const
connectInfo
&
info
,
const
connectCB
&
cb
,
int
iTimeOut
=
3
)
override
;
void
disconnect
(
const
relustCB
&
cb
)
override
;
void
addChannel
(
int
iChnIndex
,
bool
bMainStream
=
true
)
override
;
void
delChannel
(
int
iChnIndex
)
override
;
void
addAllChannel
(
bool
bMainStream
=
true
)
override
;
private
:
map
<
int
,
std
::
shared_ptr
<
DevChannel
>
>
m_mapChannels
;
int64_t
m_i64LoginId
=
-
1
;
NET_DVR_DEVICEINFO_V30
m_deviceInfo
;
void
onConnected
(
LONG
lUserID
,
LPNET_DVR_DEVICEINFO_V30
lpDeviceInfo
);
};
class
DevChannelHK
:
public
DevChannel
{
public
:
typedef
std
::
shared_ptr
<
DevChannel
>
Ptr
;
DevChannelHK
(
int64_t
i64LoginId
,
const
char
*
pcDevName
,
int
iChn
,
bool
bMainStream
=
true
);
virtual
~
DevChannelHK
();
protected
:
int64_t
m_i64LoginId
=
-
1
;
int64_t
m_i64PreviewHandle
=
-
1
;
int
m_iPlayHandle
=
-
1
;
void
onPreview
(
DWORD
dwDataType
,
BYTE
*
pBuffer
,
DWORD
dwBufSize
);
void
onGetDecData
(
char
*
pBuf
,
int
nSize
,
FRAME_INFO
*
pFrameInfo
);
bool
m_bVideoSeted
=
false
;
bool
m_bAudioSeted
=
false
;
};
}
/* namespace DEV */
}
/* namespace ZL */
#endif
/* DEVICE_DEVICEHK_H_ */
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论