同步操作将从 van/RTVS 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
视频平台(以下简称RTVS)只负责与设备的音视频流通信,并不支持808通道接入,808通道需要808网关支持,RTVS与808网关通过以下方式进行通信。
RTVS会按照以下规则通过Get请求发送0x9101、0x9201、0x9202、0x9205等1078规定走808通道指令,需要网关实现以下HTTP接口。
[配置的网关HTTP接口地址]VideoControl?Content=808协议16进制字符串&IsSuperiorPlatformSend=是否是上级平台发送
例1:http://127.0.0.1:8888/WebService/VideoControl?Content=9101001401377788321025C20C31302E31302E31302E3233304CF40000010001&IsSuperiorPlatformSend=true
例2:http://127.0.0.1:8888/WebService/VideoControl?Content=920200090112464004260003030500200820172042
接口参数:
字段 | 说明 | 例子 |
---|---|---|
Content | 808协议16进制字符串(包头+包体) 包头不含7E、未转义、流水号需要808平台替换 |
9101001401377788321025C20C31302E31302E31302E3233304CF40000010001 |
IsSuperiorPlatformSend | 是否是上级平台发送,网关可用此字段确定是否由上级平台发起。 一般为true才会包含此字段,为false时此字段不传 |
true |
返回要求,类型String 值如下表:
消息ID | 类型 | 返回数据 |
---|---|---|
0x9206 | String | "0":车辆不在线 "-1":失败 其他:应答流水号(下发9206指令的流水号) |
0x9201,0x9205 | String | "0":车辆不在线 "-1":失败 其他:指令ID(redis接口中录像列表应答会用到此ID) |
其他 | String | "0":车辆不在线 "-1":失败 "1":成功(仅指将指令成功发送到网关) |
RTVS会按照以下规则通过Post请求批量发送0x9105通知,需要网关实现以下HTTP接口。
[配置的网关HTTP接口地址]WCF0x9105?Content=命令帧信息
例如:http://127.0.0.1:8888/WebService/WCF0x9105?Content=[{"Sim":"013777883221","NotifyList":[{"Channel":1,"PacketLossRate":0},{"Channel":2,"PacketLossRate":10}]},{"Sim":"013777883210","NotifyList":[{"Channel":1,"PacketLossRate":0}]}]
接口参数:
字段 | 说明 | 例子 |
---|---|---|
Content | JT0x9105SimItem 数组的JSON | [{"Sim":"013777883221","NotifyList":[{"Channel":1,"PacketLossRate":0},{"Channel":2,"PacketLossRate":10}]},{"Sim":"013777883210","NotifyList":[{"Channel":1,"PacketLossRate":0}]}] |
返回要求,类型String 值如下表:
类型 | 返回数据 |
---|---|
String | "-1":失败 "1":成功(仅指将指令成功发送到网关) |
/// <summary>
/// cheji传输状态
/// </summary>
public class JT0x9105SimItem
{
/// <summary>
/// 手机号
/// </summary>
[DataMember]
public string Sim { get; set; }
/// <summary>
/// 通道信息
/// </summary>
[DataMember]
public List<JT0x9105ChannelItem> NotifyList { get; set; }
}
/// <summary>
/// 通道传输状态
/// </summary>
public class JT0x9105ChannelItem
{
/// <summary>
/// 通道号
/// </summary>
[DataMember]
public byte Channel { get; set; }
/// <summary>
/// 丢包率
/// </summary>
[DataMember]
public byte PacketLossRate { get; set; }
}
RTVS响应上级平台时,需要拿车牌和车牌颜色换取手机号,需要网关实现以下HTTP接口。
[配置的网关HTTP接口地址]GetVehicleSim?PlateCode=[车牌号码]=&PlateColor=[车牌颜色]
例如:http://127.0.0.1:8888/WebService/GetVehicleSim?PlateCode=京A12345=&PlateColor=2
接口参数:
字段 | 说明 | 例子 |
---|---|---|
PlateCode | 车牌号码 | 京A12345 |
PlateColor | 车牌颜色 | 2 |
返回要求:
类型String,值 手机号,如果不存在返回 null或空字符串。
808平台需要在设备上线时候发送查询音视频属性指令,收到结果后将结果按照下面格式存入redis。
类别 | 值 |
---|---|
数据类型 | Hash |
Key | AVParameters:[手机号] |
值 | JTRTAVParametersUpload |
/// <summary>
/// 终端上传音视频属性
/// 0x1003
/// </summary>
[DataContract]
public class JTRTAVParametersUpload
{
/// <summary>
/// 输入音频编码方式(0:保留,1:G.721,2:G.722,3:G.723,4:G.728,5:G.729 ,......请参考JTRTAVCodeType)
/// </summary>
/// <remarks></remarks>
[DataMember]
public JTRTAVCodeType AudioCodeType { get; set; }
/// <summary>
/// 输入音频声道数
/// </summary>
/// <remarks></remarks>
[DataMember]
public byte AudioChannels { get; set; }
/// <summary>
/// 输入音频采样率(0::8kHZ,1:22.05kHZ,2:44.1kHZ,3:48kHZ)
/// </summary>
/// <remarks></remarks>
[DataMember]
public JTRTAudioSampleRate AudioSamplingRate { get; set; }
/// <summary>
/// 输入音频采样位数(0:8位,1:16位,2:32位,请参考JTRTAudioSampleDigit)
/// </summary>
[DataMember]
public JTRTAudioSampleDigit AudioSamplingDigit { set; get; }
/// <summary>
/// 音频帧长度(1至4294967295)
/// </summary>
[DataMember]
public UInt16 AudioFrameLength { get; set; }
/// <summary>
/// 是否支持音频输出(0:不支持,1:支持)
/// </summary>
[DataMember]
public byte AudioOut { get; set; }
/// <summary>
/// 视频编码方式(0:保留,1:G.721,2:G.722,3:G.723,4:G.728,5:G.729,......请参考JTRTAVCodeType)
/// </summary>
[DataMember]
public JTRTAVCodeType VideoCodeType { get; set; }
/// <summary>
/// 终端支持的最大音频物理通道数量
/// </summary>
[DataMember]
public byte AudioMaxChannels { get; set; }
/// <summary>
/// 终端支持的最大视频物理通道数量
/// </summary>
[DataMember]
public byte VideoMaxChannels { get; set; }
}
RTVS向808平台发送查询录像列表指令后,808平台收到设备应答后,应当将应答结果按下面格式写入redis。
类别 | 值 |
---|---|
数据类型 | String |
Key | OCX_ORDERINFO_[发起指令时HTTP接口返回的指令ID] |
值 | VideoOrderAck 的JSON ,其中Data为JTVideoListInfo 的JSON,如果指令失败将Data置为null |
/// <summary>
/// 视频指令应答消息
/// </summary>
public class VideoOrderAck
{
/// <summary>
/// 返回值状态:0(初始),1(成功),2(设备不在线),3(失败),4(等待回应超时),5(等待回应中),6(作废)
/// </summary>
public int Status { get; set; }
/// <summary>
/// 返回数据
/// </summary>
public string Data { get; set; }
/// <summary>
/// 错误消息
/// </summary>
public string ErrMessage { get; set; }
}
public class VideoOrderAck {
/**
* 返回值状态:0(初始),1(成功),2(设备不在线),3(失败),4(等待回应超时),5(等待回应中),6(作废)
*/
public int Status;
/**
* 返回数据
*/
public String Data;
/**
* 错误消息
*/
public String ErrMessage;
// 已省略getset方法
}
/// <summary>
/// 终端上传音视频资源列表数据格式
/// (0x1205)
/// </summary>
[DataContract]
public class JTVideoListInfo
{
/// <summary>
/// 流水号(对应查询音视频资源列表指令的流水号)
/// </summary>
[DataMember]
public UInt16 SerialNumber { get; set; }
/// <summary>
/// 音视频资源总数(无符合条件的音视频资源,置为0)
/// </summary>
[DataMember]
public UInt32 FileCount { get; set; }
/// <summary>
/// 音视频资源列表(见表23)
/// </summary>
[DataMember]
public List<JTVideoFileListItem> FileList { get; set; }
}
/// <summary>
/// 终端上传音视频资源列表数据格式
/// 终端上传音视频资源列表格式
/// (0x1205)
/// </summary>
[DataContract]
public class JTVideoFileListItem
{
/// <summary>
/// 逻辑通道号(0表示所有通道)
/// </summary>
[DataMember]
public byte Channel { get; set; }
/// <summary>
/// 开始时间(yyyy-MM-dd HH:mm:ss)
/// </summary>
[DataMember]
public DateTime StartTime { get; set; }
/// <summary>
/// 结束时间(yyyy-MM-dd HH:mm:ss)
/// </summary>
[DataMember]
public DateTime EndTime { get; set; }
/// <summary>
/// 报警标志(bit0~bit31见JT/T 808-2011表18报警标志位定义;bit32~bit64见表13;全0表示无报警类型条件)
/// </summary>
[DataMember]
public UInt64 Alarm { get; set; }
/// <summary>
/// 音视频资源类型(0:音视频,1:音频,2:视频,3:视频或音视频)
/// </summary>
[DataMember]
public byte MediaType { get; set; }
/// <summary>
/// 码流类型(0:所有码流,1:主码流,2:子码流)
/// </summary>
[DataMember]
public byte StreamType { get; set; }
/// <summary>
/// 存储器类型(0:所有存储器,1:主存储器,2:灾备存储器)
/// </summary>
[DataMember]
public MemoryType StorageType { get; set; }
/// <summary>
/// 文件大小(单字节BYTE)
/// </summary>
[DataMember]
public uint FileSize { get; set; }
}
public class JTVideoListInfo {
/**
* 流水号(对应查询音视频资源列表指令的流水号)
*/
public int SerialNumber ;
/**
* 音视频资源总数(无符合条件的音视频资源,置为0)
*/
public int FileCount ;
/**
* 音视频资源列表(见表23)
*/
public List<JTVideoFileListItem> FileList ;
// 已省略getset方法
}
public class JTVideoFileListItem {
/**
* 逻辑通道号(0表示所有通道)
*/
public byte Channel ;
/**
* 开始时间(yyyy-MM-dd HH:mm:ss)
*/
public String StartTime ;
/**
* 结束时间(yyyy-MM-dd HH:mm:ss)
*/
public String EndTime ;
/**
* 报警标志(bit0~bit31见JT/T 808-2011表18报警标志位定义;bit32~bit64见表13;全0表示无报警类型条件)
*/
public long Alarm ;
/**
* 音视频资源类型(0:音视频,1:音频,2:视频,3:视频或音视频)
*/
public byte MediaType ;
/**
* 码流类型(0:所有码流,1:主码流,2:子码流)
*/
public byte StreamType ;
/**
* 存储器类型(0:所有存储器,1:主存储器,2:灾备存储器)
*/
public int StorageType ;
/**
* 文件大小(单字节BYTE)
*/
public long FileSize ;
// 已省略getset方法
}
此处按照1077功能要求配置磁盘空间使用规则,需要平台将配置写入redis,RTVS会按照配置的值进行磁盘空间管理。
类别 | 值 |
---|---|
数据类型 | Hash |
Key | storage_settings |
值 | JTStorageSettings |
/// <summary>
/// 磁盘设置
/// </summary>
[DataContract]
public class JTStorageSettings
{
/// <summary>
/// 超出阈值后处理 1 表示滚动删除 其他无动作
/// </summary>
[DataMember]
public byte beyondFlag;
/// <summary>
/// 存储报警阈值0-100
/// </summary>
[DataMember]
public int alarmThreshold;
}
当磁盘空间超过设定上限百分比后,RTVS向Redis发布磁盘空间不足报警,平台需要订阅此消息显示报警。
类别 | 值 |
---|---|
类型 | Subscribe |
Key | not_enough_storage_space_channel |
值 | String |
与政府平台交互的时效口令信息,需要平台在更新时写入redis
类别 | 值 |
---|---|
类型 | String |
Key | AUTHORIZE_CODE_1 或 AUTHORIZE_CODE_2 |
值 | String |
AUTHORIZE_CODE_1 为 归属地区政府平台使用的时效口令
AUTHORIZE_CODE_2 为 跨域地区政府平台使用的时效口令
政府平台音视频请求会先从809链路发送消息,网关返回服务器信息后政府平台才会请求视频流,RTVS收到的请求无法确认是实时还是历史,所以需要网关将其他信息写入redis中,格式如下:
类别 | 值 |
---|---|
类型 | String |
Key | [车牌号码].[车牌颜色].[逻辑通道号].[音视频标志] |
值 | real@[JTSDownRealVideoRequest 的JSON] |
/// <summary>
/// 实时音视频请求消息
/// DOWN_REALVIDEO_MSG_STARTUP
/// (0x9801)
/// </summary>
public class JTSDownRealVideoRequest
{
/// <summary>
/// 音视频类型
/// 0x00:音视频;0x01:音频;0x02:视频
/// </summary>
public byte AvitemType { get; set; }
/// <summary>
/// 手机号 如有不再调用http请求换取SIM接口
/// </summary>
public string Sim { get; set; }
}
类别 | 值 |
---|---|
类型 | String |
Key | [车牌号码].[车牌颜色].[逻辑通道号].[音视频标志] |
值 | back@[JTRTDownPlayBackMsgStartUp 的JSON] |
/// <summary>
/// 远程录像回放请求消息
/// 从链路
/// DOWN_PLAYBACK_MSG_STARTUP
/// 0x9A01
/// </summary>
public class JTRTDownPlayBackMsgStartUp
{
/// <summary>
/// 码流类型
/// </summary>
/// <remarks></remarks>
public byte STREAM_TYPE { get; set; }
/// <summary>
/// 回放起始时间 UTC时间
/// </summary>
/// <remarks></remarks>
public UInt64 PLAYBACK_STARTTIME { get; set; }
/// <summary>
/// 回放结束时间 UTC时间
/// </summary>
/// <remarks></remarks>
public UInt64 PLAYBACK_ENDTIME { get; set; }
/// <summary>
/// 手机号 如有不再调用http换取SIM接口
/// </summary>
public string Sim { get; set; }
/// <summary>
/// 音视频类型
/// 0x00:音视频;0x01:音频;0x02:视频;0x03:视频或音视频
/// </summary>
public byte AVITEM_TYPE { get; set; }
}
服务端视频缓存格式为VDT,RTVS支持将VDT格式文件转码成MP4并上传到指定FTP服务器。(与设备录像FTP上传逻辑一致)
类别 | 值 |
---|---|
类型 | Publish |
Key | transcode_mp4_upload_ftp_start |
值 | TranscodeUploadStart 的JSON |
public class TranscodeUploadStart
{
/// <summary>
/// 写redis的key值
/// </summary>
public string redis_key;
/// <summary>
/// 写redis的模式 0.string set 1.publish
/// </summary>
public int redis_mode;
/// <summary>
/// 自定义标记
/// </summary>
public string tag;
/// <summary>
/// 手机号
/// </summary>
public string sim;
/// <summary>
/// 通道号
/// </summary>
public byte channel;
/// <summary>
/// DateTimeToUNIX_long(格林威治时间)
/// </summary>
public long start_time;
/// <summary>
/// DateTimeToUNIX_long(格林威治时间)
/// </summary>
public long end_time;
/// <summary>
/// 字段含义同1078的0x1205
/// </summary>
public ulong alam;
/// <summary>
/// 字段含义同1078的0x1205
/// </summary>
public byte video_audio_type;
/// <summary>
/// 字段含义同1078的0x1205
/// </summary>
public byte stream_type;
/// <summary>
/// 字段含义同1078的0x1205
/// </summary>
public byte storage_type;
/// <summary>
/// ftp信息
/// </summary>
public string ftp_ip;
public int ftp_port;
public string ftp_username;
public string ftp_password;
public string ftp_remote_filename;
public string ftp_remote_filepath;
}
RTVS转码MP4并上传FTP完成后,会通过TranscodeUploadStart指定的方式(redis_key 和 redis_mode)写回redis,平台需要按照对应方式取最终结果。
类别 | 值 |
---|---|
类型 | Subscribe 或 String 由 [TranscodeUploadStart.redis_mode]决定 |
Key | [TranscodeUploadStart指定的redis_key] |
值 | TranscodeUploadFinish 的JSON |
public class TranscodeUploadFinish
{
/// <summary>
/// 自定义标记
/// </summary>
public string tag;
/// <summary>
/// //0成功, -2查询数据库失败 -3ftp上传失败
/// </summary>
public int error_code;
}
此处主要是为了解决不同厂家设备实现不一致的问题,可按照设备配置对讲数据是否需要海思头,同时支持多少路实时或历史视频传输等。
类别 | 值 |
---|---|
类型 | String |
Key | SIM_CONFIG_FOR_RTVS_[手机号] |
值 | SimLimiteConfig 的JSON |
/// <summary>
/// 每个设备手机号一个配置
/// </summary>
public class SimLimiteConfig
{
/// <summary>
/// 最大连接数
/// </summary>
public int m_sim_max_connection_all;
/// <summary>
/// 实时流最大连接数
/// </summary>
public int m_sim_max_connection_realplay;
/// <summary>
/// 回放流最大连接数
/// </summary>
public int m_sim_max_connection_backplay;
/// <summary>
/// 对讲流最大连接数
/// </summary>
public int m_sim_max_connection_talk;
/// <summary>
/// 广播最大连接数
/// </summary>
public int m_sim_max_connection_listen;
/// <summary>
/// 同一通道最大连接数
/// </summary>
public int m_channel_max_connection_all;
/// <summary>
/// 同一通道最大实时流连接数(区分主子码流能有2个)
/// </summary>
public int m_channel_max_connection_realplay;
/// <summary>
/// 同一通道回放流最大连接数
/// </summary>
public int m_channel_max_connection_backplay;
/// <summary>
/// 同一通道对讲流最大连接数
/// </summary>
public int m_channel_max_connection_talk;
/// <summary>
/// 同一通道广播最大连接数
/// </summary>
public int m_channel_max_connection_listen;
/// <summary>
/// 同一设备对讲监听能不能同时进行
/// </summary>
public bool m_is_taklback_listen_meanwhile;
/// <summary>
/// 同一通道实时历史能不能同时传
/// </summary>
public bool m_is_channel_real_back_meanwhile;
/// <summary>
/// 同一通道不同码流类型能不能同时传
/// </summary>
public bool m_is_channel_real_streamtype_meanwhile;
/// <summary>
/// 是否是绝对时间戳
/// </summary>
public bool m_is_absolute_timestamp;
/// <summary>
/// 绝对时间戳的起始时间
/// </summary>
public long m_start_absolute_timestamp;
/// <summary>
/// 是否有海思头
/// </summary>
public bool m_is_audio_have_haisi_header;
/// <summary>
/// 是否设备cheji,一个连接就只发一个通道的数据
/// </summary>
public static bool m_is_device_connection_single_channel = true;
/// <summary>
/// 设置默认配置信息
/// </summary>
/// <param name="config"></param>
private static void DefaultConfig(SimLimiteConfig config)
{
config.m_sim_max_connection_all = 20;
config.m_sim_max_connection_realplay = 20;
config.m_sim_max_connection_backplay = 20;
config.m_sim_max_connection_talk = 3;
config.m_sim_max_connection_listen = 3;
config.m_channel_max_connection_all = 20;
config.m_channel_max_connection_realplay = 20;
config.m_channel_max_connection_backplay = 20;
config.m_channel_max_connection_talk = 3;
config.m_channel_max_connection_listen = 3;
config.m_is_taklback_listen_meanwhile = false;
config.m_is_channel_real_back_meanwhile = true;
config.m_is_channel_real_streamtype_meanwhile = true;
config.m_is_absolute_timestamp = false;
config.m_is_audio_have_haisi_header = true;
}
}
网关在收到上级平台音视频请求后,需要应答视频服务器IP和端口,如果RTVS启用集群模式,需要网关通过集群管理API获取一个最佳视频GOV服务地址。
接口地址:
[集群管理地址]api/GetBest?Type=1005&Tag=[手机号]
Tag可传可不传,传Tag会尽量保证同一个设备在一个RTVS上,建议加上。
例:http://127.0.0.1:30888/api/GetBest?Type=1005&Tag=013300001111
返回数据格式如下
[IP地址]:[端口]
例: 10.10.10.228:6035
网关在收到上级平台关闭实时音视频请求后,可以不与RTVS交互直接发给设备,但可能造成正在观看的其他客户端也被关闭。
为解决此问题,可以将此指令转发给RTVS来处理关闭。
接口地址:
[集群管理地址]ProxyTag/[Tag]/1004/WebService/Gov0x9802?VehicleNO=[车牌号]&VehicleColor=[车牌颜色]&ChannelID=[通道号]&AvitemType=[音视频类型]
Tag与获取GOV服务地址的Tag保持一致。
例:http://127.0.0.1:30888/ProxyTag/013300001111/1004/WebService/Gov0x9802?VehicleNO=京A12345&VehicleColor=2&ChannelID=1&AvitemType=0
接口参数 可查看1078协议中0x9802相关定义:
字段 | 说明 | 例子 |
---|---|---|
Tag | Tag与获取GOV服务地址的Tag保持一致,建议为手机号 | 013300001111 |
VehicleNO | 车牌号码 | 京A12345 |
VehicleColor | 车牌颜色 | 2 |
ChannelID | 逻辑通道号 0 表示所有 | 1 |
AvitemType | 音视频类型 0x00:音视频;0x01:音频;0x02:视频 | 0 |
返回数据格式如下
返回值 | 说明 |
---|---|
-1 | 参数错误 |
0 | 失败 |
1 | 成功 |
接口地址:
[集群管理地址]ProxyTag/[Tag]/1004/WebService/Gov0x9A02?VehicleNO=[车牌号]&VehicleColor=[车牌颜色]&ControlType=[控制类型]&FastTime=[倍数]&DateTime=[拖动位置]
Tag与获取GOV服务地址的Tag保持一致。
例:http://127.0.0.1:30888/ProxyTag/013300001111/1004/WebService/Gov0x9A02?VehicleNO=京A12345&VehicleColor=2&ControlType=5&FastTime=0&DateTime=1606905169
接口参数 可查看1078协议中0x9A02相关定义:
字段 | 说明 | 例子 |
---|---|---|
Tag | Tag与获取GOV服务地址的Tag保持一致,建议为手机号 | 013300001111 |
VehicleNO | 车牌号码 | 京A12345 |
VehicleColor | 车牌颜色 | 2 |
ControlType | 回放类型 0x00:正常回放,0x01:暂停回放,0x02:结束回放,0x03:快进回放,0x04:关键帧快退回放,0x05:拖动回放,0x06:关键帧播放 |
5 |
FastTime | 快进或快退倍数 回放类型为0x3或0x4时有效 0x00:无效,0x01:1倍,0x02:2倍,0x03:4倍,0x04:8倍,0x05:16倍 |
0 |
DateTime | 拖动位置,用UTC时间表示,回放控制为0x05时,此字段内容有效 | 1606905169 |
返回数据格式如下
返回值 | 说明 |
---|---|
-1 | 参数错误 |
0 | 失败 |
1 | 成功 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。