正文
1. DS40xxSDK.dll
using
System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace HikServer.DS40xxSDK
{
#region enum
/// <summary>
/// 板卡类型
/// </summary>
public enum BOARD_TYPE_DS : uint
{
DS400XM = 0 , // M卡
DS400XH = 1 , // H卡
DS4004HC = 2 , // 4004HC
DS4008HC = 3 , // 4008HC
DS4016HC = 4 , // 4016HC
DS4001HF = 5 , // 4001HF
DS4004HF = 6 , // 4004HF
DS4002MD = 7 , // 4002MD
DS4004MD = 8 , // 4004MD
DS4016HCS = 9 , // 4016HCS
DS4002HT = 10 , // 4002HT
DS4004HT = 11 , // 4004HT
DS4008HT = 12 , // 4008HT
DS4004HC_PLUS = 13 , // 4004HC+
DS4008HC_PLUS = 14 , // 4008HC+
DS4016HC_PLUS = 15 , // 4016HC+
DS4008HF = 16 , // 4008HF
DS4008MD = 17 , // 4008MD
DS4008HS = 18 , // 4008HS
DS4016HS = 19 , // 4016HS
INVALID_BOARD_TYPE = 0xffffffff ,
}
/// <summary>
/// 视频预览格式
/// </summary>
public enum TypeVideoFormat
{
vdfRGB8A_233 = 0x00000001 ,
vdfRGB8R_332 = 0x00000002 ,
vdfRGB15Alpha = 0x00000004 ,
/// <summary>
/// 16位RGB视频压缩格式
/// </summary>
vdfRGB16 = 0x00000008 ,
/// <summary>
/// 24位RGB视频压缩格式
/// </summary>
vdfRGB24 = 0x00000010 ,
vdfRGB24Alpha = 0x00000020 ,
vdfYUV420Planar = 0x00000040 ,
/// <summary>
/// YUV422视频压缩格式
/// </summary>
vdfYUV422Planar = 0x00000080 ,
vdfYUV411Planar = 0x00000100 ,
vdfYUV420Interspersed = 0x00000200 ,
vdfYUV422Interspersed = 0x00000400 ,
vdfYUV411Interspersed = 0x00000800 ,
vdfYUV422Sequence = 0x00001000 , /* U0, Y0, V0, Y1: For VO overlay */
vdfYUV422SequenceAlpha = 0x00002000 ,
/* U0, Y0, V0, Y1: For VO overlay, with low bit for alpha blending */
vdfMono = 0x00004000 , /* 8 bit monochrome */
vdfYUV444Planar = 0x00008000 ,
};
/// <summary>
/// 视频制式
/// </summary>
public enum VideoStandard_t : uint
{
/// <summary>
/// 无视频信号
/// </summary>
StandardNone = 0x80000000 ,
/// <summary>
/// NTSC制式
/// </summary>
StandardNTSC = 0x00000001 ,
/// <summary>
/// PAL制式
/// </summary>
StandardPAL = 0x00000002 ,
StandardSECAM = 0x00000004 ,
} ;
/// <summary>
/// 编码图像分辨率
/// </summary>
public enum PictureFormat_t
{
ENC_CIF_FORMAT = 0 ,
ENC_QCIF_FORMAT = 1 ,
ENC_2CIF_FORMAT = 2 ,
ENC_4CIF_FORMAT = 3 ,
ENC_QQCIF_FORMAT = 4 ,
ENC_CIFQCIF_FORMAT = 5 ,
ENC_CIFQQCIF_FORMAT = 6 ,
ENC_DCIF_FORMAT = 7
};
/// <summary>
/// 码流控制方式
/// </summary>
public enum BitrateControlType_t
{
/// <summary>
/// 变码率
/// </summary>
brCBR = 0 ,
/// <summary>
/// 恒定码率
/// </summary>
brVBR = 1 ,
};
public enum FrameType_t
{
PktError = 0 ,
PktIFrames = 0x0001 ,
PktPFrames = 0x0002 ,
PktBBPFrames = 0x0004 ,
PktAudioFrames = 0x0008 ,
PktMotionDetection = 0x00010 ,
PktDspStatus = 0x00020 ,
PktOrigImage = 0x00040 ,
PktSysHeader = 0x00080 ,
PktBPFrames = 0x00100 ,
PktSFrames = 0x00200 ,
PktSubIFrames = 0x00400 ,
PktSubPFrames = 0x00800 ,
PktSubBBPFrames = 0x01000 ,
PktSubSysHeader = 0x02000
};
#endregion
#region struct
/// <summary>
/// 板卡信息结构体
/// </summary>
public struct DS_BOARD_DETAIL
{
/// <summary>
/// 板卡类型
/// </summary>
BOARD_TYPE_DS type;
/// <summary>
/// 序列号
/// BYTE sn[16];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16 )]
byte [] sn;
/// <summary>
/// 板卡包含的DSP个数
/// </summary>
uint dspCount;
/// <summary>
/// 板卡上第一个DSP的索引
/// </summary>
uint firstDspIndex;
/// <summary>
/// 板卡包含的编码通道个数
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 板卡上第一个编码通道的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 板卡包含的解码通道个数
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 板卡上第一个解码通道的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 板卡包含的视频输出通道个数
/// </summary>
uint displayChannelCount;
/// <summary>
/// 板卡上第一个视频输出通道的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
/// <summary>
/// 硬件版本,format:major.minor.build,major:bit 16-19,minor: bit 8-15,build: bit 0-7
/// </summary>
uint version;
}
/// <summary>
/// DSP信息结构体
/// </summary>
public struct DSP_DETAIL
{
/// <summary>
/// 此DSP所包含的编码通道个数
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 此DSP上第一个编码通道在所有编码通道中的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 此DSP所包含的解码通道个数
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 此DSP上第一个解码通道在所有解码通道中的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 此DSP包含的显示通道个数
/// </summary>
uint displayChannelCount;
/// <summary>
/// 此DSP上第一个显示通道在所有显示通道中的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
uint reserved4;
}
/// <summary>
/// 特殊功能结构体
/// </summary>
public struct CHANNEL_CAPABILITY
{
/// <summary>
/// 音频预览
/// </summary>
byte [] bAudioPreview;
/// <summary>
/// 报警信号
/// </summary>
byte [] bAlarmIO;
/// <summary>
/// 看家狗
/// </summary>
byte [] bWatchDog;
}
/// <summary>
/// 版本信息
/// </summary>
public struct PVERSION_INFO
{
/// <summary>
/// DSP版本号,DSP的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// Driver版本号,Driver的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK版本号,SDK的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 显示窗口内的矩形区域
/// </summary>
// [StructLayout(LayoutKind.
// public struct RECT
// {
// public long left;
// public long top;
// public long right;
// public long bottom;
// }
/// <summary>
/// 帧统计信息结构体
/// </summary>
public struct PFRAMES_STATISTICS
{
/// <summary>
/// 视频帧
/// </summary>
ulong VideoFrames;
/// <summary>
/// 音频帧
/// </summary>
ulong AudioFrames;
/// <summary>
/// 丢失帧
/// </summary>
ulong FramesLost;
/// <summary>
/// 丢失的码流(字节)
/// </summary>
ulong QueueOverflow;
/// <summary>
/// 当前的帧率(bps)
/// </summary>
ulong CurBps;
}
/// <summary>
/// 版本信息结构体
/// </summary>
public struct PHW_VERSION
{
/// <summary>
/// DSP程序的版本号和Build号
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// 驱动程序的版本号和Build号
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK 的版本号和Build号
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 系统时间
/// </summary>
public struct SYSTEMTIME
{
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
}
#endregion
#region delegate
/// <summary>
/// 原始图像流设置
///
/// typedef void (*IMAGE_STREAM_CALLBACK)(UINT channelNumber,void *context);
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="context"> 设备上下文 </param>
public delegate void IMAGE_STREAM_CALLBACK( uint channelNumber, IntPtr context);
/// <summary>
/// 编码数据流直接读取回调函数
///
/// typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="DataBuf"> 缓冲区地址 </param>
/// <param name="Length"> 缓冲区长度 </param>
/// <param name="FrameType"> 缓冲区数据帧类型 </param>
/// <param name="context"> 设备上下文 </param>
/// <returns></returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
// public delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, byte[] DataBuf, uint Length, FrameType_t FrameType, IntPtr context);
public delegate int STREAM_DIRECT_READ_CALLBACK( int channelNumber, IntPtr DataBuf, int Length, FrameType_t FrameType, IntPtr context);
// public unsafe delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, void * DataBuf, uint Length, int FrameType, IntPtr context);
/// <summary>
/// 直接读取码流回调函数
///
/// typedef int (*STREAM_READ_CALLBACK)(ULONG channelNumber, void *context)
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="context"> 设备上下文 </param>
/// <returns></returns>
public delegate int STREAM_READ_CALLBACK( ulong channelNumber, IntPtr context);
/// <summary>
/// 移动侦测结果回调函数
///
/// typedef void (*MOTION_DETECTION_CALLBACK)(ULONG channelNumber, BOOL bMotionDetected,void *context)
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="bMotionDetected">
/// 移动侦测发生标志,如果当前通道所设置的移动侦测
/// 区域内产生了移动侦测,则被置为True;如果当前通道所设置的移动侦测区域内自上
/// 一次产生移动侦测后delay秒内没有发生移动侦测,则被置为False。
/// </param>
/// <param name="context"> 设备上下文 </param>
public delegate void MOTION_DETECTION_CALLBACK( ulong channelNumber, bool bMotionDetected, IntPtr context);
/// <summary>
/// 画图回调函数
///
/// #define DRAWFUN(x) void (CALLBACK* x)(long nPort,HDC hDc,LONG nUser)
/// </summary>
/// <param name="nPort"> 通道号 </param>
/// <param name="HDC"> offscreen表面设备上下文,相当于显示窗口中的DC </param>
/// <param name="nUser"> 用户数据 </param>
public delegate void DrawFun( long nPort, IntPtr HDC, long nUser);
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace HikServer.DS40xxSDK
{
#region enum
/// <summary>
/// 板卡类型
/// </summary>
public enum BOARD_TYPE_DS : uint
{
DS400XM = 0 , // M卡
DS400XH = 1 , // H卡
DS4004HC = 2 , // 4004HC
DS4008HC = 3 , // 4008HC
DS4016HC = 4 , // 4016HC
DS4001HF = 5 , // 4001HF
DS4004HF = 6 , // 4004HF
DS4002MD = 7 , // 4002MD
DS4004MD = 8 , // 4004MD
DS4016HCS = 9 , // 4016HCS
DS4002HT = 10 , // 4002HT
DS4004HT = 11 , // 4004HT
DS4008HT = 12 , // 4008HT
DS4004HC_PLUS = 13 , // 4004HC+
DS4008HC_PLUS = 14 , // 4008HC+
DS4016HC_PLUS = 15 , // 4016HC+
DS4008HF = 16 , // 4008HF
DS4008MD = 17 , // 4008MD
DS4008HS = 18 , // 4008HS
DS4016HS = 19 , // 4016HS
INVALID_BOARD_TYPE = 0xffffffff ,
}
/// <summary>
/// 视频预览格式
/// </summary>
public enum TypeVideoFormat
{
vdfRGB8A_233 = 0x00000001 ,
vdfRGB8R_332 = 0x00000002 ,
vdfRGB15Alpha = 0x00000004 ,
/// <summary>
/// 16位RGB视频压缩格式
/// </summary>
vdfRGB16 = 0x00000008 ,
/// <summary>
/// 24位RGB视频压缩格式
/// </summary>
vdfRGB24 = 0x00000010 ,
vdfRGB24Alpha = 0x00000020 ,
vdfYUV420Planar = 0x00000040 ,
/// <summary>
/// YUV422视频压缩格式
/// </summary>
vdfYUV422Planar = 0x00000080 ,
vdfYUV411Planar = 0x00000100 ,
vdfYUV420Interspersed = 0x00000200 ,
vdfYUV422Interspersed = 0x00000400 ,
vdfYUV411Interspersed = 0x00000800 ,
vdfYUV422Sequence = 0x00001000 , /* U0, Y0, V0, Y1: For VO overlay */
vdfYUV422SequenceAlpha = 0x00002000 ,
/* U0, Y0, V0, Y1: For VO overlay, with low bit for alpha blending */
vdfMono = 0x00004000 , /* 8 bit monochrome */
vdfYUV444Planar = 0x00008000 ,
};
/// <summary>
/// 视频制式
/// </summary>
public enum VideoStandard_t : uint
{
/// <summary>
/// 无视频信号
/// </summary>
StandardNone = 0x80000000 ,
/// <summary>
/// NTSC制式
/// </summary>
StandardNTSC = 0x00000001 ,
/// <summary>
/// PAL制式
/// </summary>
StandardPAL = 0x00000002 ,
StandardSECAM = 0x00000004 ,
} ;
/// <summary>
/// 编码图像分辨率
/// </summary>
public enum PictureFormat_t
{
ENC_CIF_FORMAT = 0 ,
ENC_QCIF_FORMAT = 1 ,
ENC_2CIF_FORMAT = 2 ,
ENC_4CIF_FORMAT = 3 ,
ENC_QQCIF_FORMAT = 4 ,
ENC_CIFQCIF_FORMAT = 5 ,
ENC_CIFQQCIF_FORMAT = 6 ,
ENC_DCIF_FORMAT = 7
};
/// <summary>
/// 码流控制方式
/// </summary>
public enum BitrateControlType_t
{
/// <summary>
/// 变码率
/// </summary>
brCBR = 0 ,
/// <summary>
/// 恒定码率
/// </summary>
brVBR = 1 ,
};
public enum FrameType_t
{
PktError = 0 ,
PktIFrames = 0x0001 ,
PktPFrames = 0x0002 ,
PktBBPFrames = 0x0004 ,
PktAudioFrames = 0x0008 ,
PktMotionDetection = 0x00010 ,
PktDspStatus = 0x00020 ,
PktOrigImage = 0x00040 ,
PktSysHeader = 0x00080 ,
PktBPFrames = 0x00100 ,
PktSFrames = 0x00200 ,
PktSubIFrames = 0x00400 ,
PktSubPFrames = 0x00800 ,
PktSubBBPFrames = 0x01000 ,
PktSubSysHeader = 0x02000
};
#endregion
#region struct
/// <summary>
/// 板卡信息结构体
/// </summary>
public struct DS_BOARD_DETAIL
{
/// <summary>
/// 板卡类型
/// </summary>
BOARD_TYPE_DS type;
/// <summary>
/// 序列号
/// BYTE sn[16];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16 )]
byte [] sn;
/// <summary>
/// 板卡包含的DSP个数
/// </summary>
uint dspCount;
/// <summary>
/// 板卡上第一个DSP的索引
/// </summary>
uint firstDspIndex;
/// <summary>
/// 板卡包含的编码通道个数
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 板卡上第一个编码通道的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 板卡包含的解码通道个数
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 板卡上第一个解码通道的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 板卡包含的视频输出通道个数
/// </summary>
uint displayChannelCount;
/// <summary>
/// 板卡上第一个视频输出通道的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
/// <summary>
/// 硬件版本,format:major.minor.build,major:bit 16-19,minor: bit 8-15,build: bit 0-7
/// </summary>
uint version;
}
/// <summary>
/// DSP信息结构体
/// </summary>
public struct DSP_DETAIL
{
/// <summary>
/// 此DSP所包含的编码通道个数
/// </summary>
uint encodeChannelCount;
/// <summary>
/// 此DSP上第一个编码通道在所有编码通道中的索引
/// </summary>
uint firstEncodeChannelIndex;
/// <summary>
/// 此DSP所包含的解码通道个数
/// </summary>
uint decodeChannelCount;
/// <summary>
/// 此DSP上第一个解码通道在所有解码通道中的索引
/// </summary>
uint firstDecodeChannelIndex;
/// <summary>
/// 此DSP包含的显示通道个数
/// </summary>
uint displayChannelCount;
/// <summary>
/// 此DSP上第一个显示通道在所有显示通道中的索引
/// </summary>
uint firstDisplayChannelIndex;
uint reserved1;
uint reserved2;
uint reserved3;
uint reserved4;
}
/// <summary>
/// 特殊功能结构体
/// </summary>
public struct CHANNEL_CAPABILITY
{
/// <summary>
/// 音频预览
/// </summary>
byte [] bAudioPreview;
/// <summary>
/// 报警信号
/// </summary>
byte [] bAlarmIO;
/// <summary>
/// 看家狗
/// </summary>
byte [] bWatchDog;
}
/// <summary>
/// 版本信息
/// </summary>
public struct PVERSION_INFO
{
/// <summary>
/// DSP版本号,DSP的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// Driver版本号,Driver的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK版本号,SDK的BUILD号,用于软件升级时标明该版本的最后修改时间
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 显示窗口内的矩形区域
/// </summary>
// [StructLayout(LayoutKind.
// public struct RECT
// {
// public long left;
// public long top;
// public long right;
// public long bottom;
// }
/// <summary>
/// 帧统计信息结构体
/// </summary>
public struct PFRAMES_STATISTICS
{
/// <summary>
/// 视频帧
/// </summary>
ulong VideoFrames;
/// <summary>
/// 音频帧
/// </summary>
ulong AudioFrames;
/// <summary>
/// 丢失帧
/// </summary>
ulong FramesLost;
/// <summary>
/// 丢失的码流(字节)
/// </summary>
ulong QueueOverflow;
/// <summary>
/// 当前的帧率(bps)
/// </summary>
ulong CurBps;
}
/// <summary>
/// 版本信息结构体
/// </summary>
public struct PHW_VERSION
{
/// <summary>
/// DSP程序的版本号和Build号
/// </summary>
ulong DspVersion, DspBuildNum;
/// <summary>
/// 驱动程序的版本号和Build号
/// </summary>
ulong DriverVersion, DriverBuildNum;
/// <summary>
/// SDK 的版本号和Build号
/// </summary>
ulong SDKVersion, SDKBuildNum;
}
/// <summary>
/// 系统时间
/// </summary>
public struct SYSTEMTIME
{
ushort wYear;
ushort wMonth;
ushort wDayOfWeek;
ushort wDay;
ushort wHour;
ushort wMinute;
ushort wSecond;
ushort wMilliseconds;
}
#endregion
#region delegate
/// <summary>
/// 原始图像流设置
///
/// typedef void (*IMAGE_STREAM_CALLBACK)(UINT channelNumber,void *context);
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="context"> 设备上下文 </param>
public delegate void IMAGE_STREAM_CALLBACK( uint channelNumber, IntPtr context);
/// <summary>
/// 编码数据流直接读取回调函数
///
/// typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="DataBuf"> 缓冲区地址 </param>
/// <param name="Length"> 缓冲区长度 </param>
/// <param name="FrameType"> 缓冲区数据帧类型 </param>
/// <param name="context"> 设备上下文 </param>
/// <returns></returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
// public delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, byte[] DataBuf, uint Length, FrameType_t FrameType, IntPtr context);
public delegate int STREAM_DIRECT_READ_CALLBACK( int channelNumber, IntPtr DataBuf, int Length, FrameType_t FrameType, IntPtr context);
// public unsafe delegate int STREAM_DIRECT_READ_CALLBACK(uint channelNumber, void * DataBuf, uint Length, int FrameType, IntPtr context);
/// <summary>
/// 直接读取码流回调函数
///
/// typedef int (*STREAM_READ_CALLBACK)(ULONG channelNumber, void *context)
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="context"> 设备上下文 </param>
/// <returns></returns>
public delegate int STREAM_READ_CALLBACK( ulong channelNumber, IntPtr context);
/// <summary>
/// 移动侦测结果回调函数
///
/// typedef void (*MOTION_DETECTION_CALLBACK)(ULONG channelNumber, BOOL bMotionDetected,void *context)
/// </summary>
/// <param name="channelNumber"> 通道号 </param>
/// <param name="bMotionDetected">
/// 移动侦测发生标志,如果当前通道所设置的移动侦测
/// 区域内产生了移动侦测,则被置为True;如果当前通道所设置的移动侦测区域内自上
/// 一次产生移动侦测后delay秒内没有发生移动侦测,则被置为False。
/// </param>
/// <param name="context"> 设备上下文 </param>
public delegate void MOTION_DETECTION_CALLBACK( ulong channelNumber, bool bMotionDetected, IntPtr context);
/// <summary>
/// 画图回调函数
///
/// #define DRAWFUN(x) void (CALLBACK* x)(long nPort,HDC hDc,LONG nUser)
/// </summary>
/// <param name="nPort"> 通道号 </param>
/// <param name="HDC"> offscreen表面设备上下文,相当于显示窗口中的DC </param>
/// <param name="nUser"> 用户数据 </param>
public delegate void DrawFun( long nPort, IntPtr HDC, long nUser);
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586675,如需转载请自行联系原作者