1.前言
最近在配合客户开发流媒体相关的服务的时候,整理了一些对接过程资料,这里做个分享与记录。流媒体的对接主要牵扯到4个方面:
(1)平台端:业务端系统,包含前端呈现界面。
(2)JT/T808网关:部标设备接入网关,这个是非常重要的,是设备与平台进行数据交换的桥梁,流媒体相关的指令操作也必须依赖它完成。
(3)部标视频机:符合JT/T808协议的车载视频机器。
(4)流媒体服务:符合JT/T1078协议的流媒体服务,用来接收部标视频机的音视频流,并进行转发。
2.交互流程
2.1.实时音视频点播与控制流程
2.2.双向语音对讲流程
2.3.历史音视频回放流程
3.实时音视频点播与控制指令详解
3.1.平台下发拉流指令
命令采用0x9101消息
命令组包示例:
7e91010016138110121350fef70e3132342e3232332e36302e3233341b590000010001097e
示例解释:
7e
9101 --拉流的命令ID
0016 --消息体属性
138110121350 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
fef7 --消息流水号
0e --流媒体地址IP地址长度,14个字节
3132342e3232332e36302e323334 --IP 地址(124.223.60.234)
1b59 --流媒体地址TCP端口(7001)
0000 --流媒体地址UDP端口(0)
01 --视频通道号,即:设备上的摄像头的通道号,看哪个摄像头对哪个摄像头进行拉流
00 --拉流的数据类型(0:音视频;1:视频;2:双向对讲;3:监听;4:中心广播;5:透传,视频点播用音视频或者视频,但是一般都用音视频,对讲用2
01 --码流类型(0:主码流;1:子码流),设备上报的码流类型,一般默认用子码流,流畅度会高些,但是清晰度会稍微差点
09 --校验码
7e
3.2.设备应答拉流指令
设备对拉流指令采用的是通用应答:0x0001消息进行应答
3.3.组成拉流地址
平台收到设备指令应答后,后台组成拉流地址,返回给前端,组包示例如下:
"flv": "http://apollo.aovx.com:8088/00000000018026966027/1.live.flv",
"https_flv": "https://apollo.aovx.com:18443/00000000018026966027/1.live.flv",
"ws_flv": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.flv",
"wss_flv": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.flv",
"fmp4": "http://apollo.aovx.com:8088/00000000018026966027/1.live.mp4",
"https_fmp4": "https://apollo.aovx.com:18443/00000000018026966027/1.live.mp4",
"ws_fmp4": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.mp4",
"wss_fmp4": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.mp4",
"hls": "http://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8",
"https_hls": "https://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8",
"ws_hls": "ws://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8",
"wss_hls": "wss://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8",
"ts": "http://apollo.aovx.com:8088/00000000018026966027/1.live.ts",
"https_ts": "https://apollo.aovx.com:18443/00000000018026966027/1.live.ts",
"ws_ts": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.ts",
"rtmp": "rtmp://apollo.aovx.com:8935/00000000018026966027/1",
"rtsp": "rtsp://apollo.aovx.com:8554/00000000018026966027/1",
"rtsps": "rtsps://apollo.aovx.com:8332/00000000018026966027/1",
其中:apollo.aovx.com是服务器的IP或者域名,后面是每种拉流方式对应的端口
00000000018026966027:对应的是设备的ID,为了兼容JT/T808-2019的协议,所以返回默认20位(前面补0即可)
1.live.flv:其中1指的是通道号,.live.flv流媒体的后缀,不同的拉流方式可能不一样。
前端通过这个地址拉流即可。
3.4.流控制命令
流控制命令采用的是0x9102命令
流控制命令组包示例:
7e91020004138110121350c52e01000001af7e
示例解释:
7e
9102 --流控制的命令ID
0004 --消息体属性
138110121350 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
c52e --消息流水号
01 --视频通道号,即:设备上的摄像头的通道号
00 --控制指令(0:关闭音视频传输指令;1:切换码流;2:暂停该通道所有流的发送;3:回复暂停前流的发送;4:关闭双向对讲)
00 --关闭音视频类型(0:关闭该通道有关的音视频数据;1:只关闭该通道有关的音频;2:只关闭该通道的视频)
01 --切换码流类型(0:新申请码流为主码流;1:新申请码流为子码流)
af --校验码
7e
3.5.设备应答流控制命令
设备流控制命令采用的是通用应答:0x0001消息进行应答
4.双向语音对讲指令详解
4.1.平台下发语音对讲指令
命令采用0x9101消息,语实时拉流一致主要区别是数据类型采用2双向对讲
命令组包示例:
7e9101001601802696602709fc0e3132342e3232332e36302e3233341b590000010201527e
示例解释:
7e
9101 --对讲的命令ID
0016 --消息体属性
018026966027 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
09fc --消息流水号
0e --流媒体地址IP地址长度,14个字节
3132342e3232332e36302e323334 --IP 地址(124.223.60.234)
1b59 --流媒体地址TCP端口(7001)
0000 --流媒体地址UDP端口(0)
01 --对讲通道号
02 --数据类型
01 --码流类型(0:主码流;1:子码流),设备上报的码流类型,一般默认用子码流,流畅度会高些,但是清晰度会稍微差点
52 --校验码
7e
4.2.设备应答对讲指令
设备对拉流指令采用的是通用应答:0x0001消息进行应答
4.3.组成推流与拉流地址
平台收到设备指令应答后,后台组成拉流地址,返回给前端,组包示例如下:
"flv": "http://apollo.aovx.com:8088/00000000018026966027/1.live.flv",
"https_flv": "https://apollo.aovx.com:18443/00000000018026966027/1.live.flv",
"ws_flv": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.flv",
"wss_flv": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.flv",
"fmp4": "http://apollo.aovx.com:8088/00000000018026966027/1.live.mp4",
"https_fmp4": "https://apollo.aovx.com:18443/00000000018026966027/1.live.mp4",
"ws_fmp4": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.mp4",
"wss_fmp4": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.mp4",
"hls": "http://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8",
"https_hls": "https://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8",
"ws_hls": "ws://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8",
"wss_hls": "wss://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8",
"ts": "http://apollo.aovx.com:8088/00000000018026966027/1.live.ts",
"https_ts": "https://apollo.aovx.com:18443/00000000018026966027/1.live.ts",
"ws_ts": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.ts",
"rtmp": "rtmp://apollo.aovx.com:8935/00000000018026966027/1",
"rtsp": "rtsp://apollo.aovx.com:8554/00000000018026966027/1",
"rtsps": "rtsps://apollo.aovx.com:8332/00000000018026966027/1",
"ws_tts": "ws://apollo.aovx.com:7002/00000000018026966027/1?type=0&pt=pcm&vendorType=0",
"wss_tts": "wss://apollo.aovx.com:4443/00000000018026966027/1?type=0&pt=pcm&vendorType=0"
平台端对音频采集通过ws_tts或者wss_tts进行推流,并通过拉流地址进行音频拉流。
4.4.对讲控制命令
对讲控制命令采用的是0x9102命令,当控制指令为4的时候关闭双向对讲
流控制命令组包示例:
7e91020004138110121350c52e01040001ab7e
示例解释:
7e
9102 --流控制的命令ID
0004 --消息体属性
138110121350 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
c52e --消息流水号
01 --视频通道号,即:设备上的摄像头的通道号
04 --控制指令(0:关闭音视频传输指令;1:切换码流;2:暂停该通道所有流的发送;3:回复暂停前流的发送;4:关闭双向对讲)
00 --关闭音视频类型(0:关闭该通道有关的音视频数据;1:只关闭该通道有关的音频;2:只关闭该通道的视频)
01 --切换码流类型(0:新申请码流为主码流;1:新申请码流为子码流)
ab --校验码
7e
4.5.设备应答对讲控制命令
设备对讲控制命令采用的是通用应答:0x0001消息进行应答
5.历史音视频回放指令详解
5.1.获取视频回放列表
视频回放列表获取采用的是:0x9205命令
指令示例:
7E920500140139070096834F900224092300000024092323595900000000000000577E
示例解释:
7E
9205 --查询设备视频列表的命令ID
0014 --消息体属性
013907009683 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
4F90 --消息流水号
02 --视频通道号,即:设备上的摄像头的通道号
240923000000 --查询时间段的开始时间(yyMMddHHmmss)
240923235959 --查询时间段的结束时间(yyMMddHHmmss)
00000000 --报警标志
00 --音视频类型(0:音视频,1:音频,2:视频,3:视频或音视频)
00 --码流类型(0:主码流或子码流;1:主码流;2:子码流)
00 --存储器类型(0:主存储器或者灾备存储器,1:主存储器;2:灾备存储器)
57 --校验码
7E
5.2.设备应答视频列指令
设备对获取视频列表的应答采用的是:0x1205消息进行应答
应答示例:
7E1205000601868057086104B39F1600000000167E
示例解释:
7E
1205 --设备应答视频列表的命令ID
211E --消息体属性(发生了分包)
013907009683 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
003B --当前消息流水号
0005 --总包数
0001 --当前包序号
97F8 --应答流水号
0000002A --视频资源总数01 --通道号
240923091728 --开始时间
240923091938 --结束时间
0000000000000000 --报警标志
00 --音视频资源类型(0:音视频;1:音频;2:视频)
01 --码流类型(1:主码流;2:子码流)
01 --1:主存储器;2:灾备存储器
0C7F425E --文件大小,单位BYTE01
240923091937
240923092128
0000000000000000
00
01
01
0C7FEC45
0124092309212724092309231900000000000000000001010C7FA9B90124092309231724092309250900000000000000000001010C7FA0210124092309250824092309270000000000000000000001010C7FF0300124092309265924092309285000000000000000000001010C7FF9600124092309284924092309304000000000000000000001010C7FD7EB0124092309
5.3.历史视频点播
历史视频点播采用的是:0x9201命令
指令示例:
7e9201002513811012135011190e3132342e3232332e36302e3233341b5900000100000000002404301356182404301439236d7e
示例解释:
7e
9201 --进行历史视频回放命令ID
0025 --消息体属性
138110121350 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
1119 --消息流水号
0e --流媒体地址IP地址长度,14个字节
3132342e3232332e36302e323334 --IP 地址(124.223.60.234)
1b59 --流媒体地址TCP端口(7001)
0000 --流媒体地址UDP端口(0)
01 --视频通道号,即:设备上的摄像头的通道号,看哪个摄像头对哪个摄像头进行拉流
00 --音视频类型(0:音视频,1:音频,2:视频,3:视频或音视频)
00 --码流类型(0:主码流或子码流;1:主码流;2:子码流)
00 --存储器类型(0:主存储器或者灾备存储器,1:主存储器;2:灾备存储器)
00 --回放类型(0:正常回放;1:快进回放;2:快退回放;3:关键帧播放;4:单帧上传)
00 --快进或者快退倍数;0:无效;1:1倍;2:2倍;3:4倍;4:8倍;5:16倍
240430135618 --对应的历史视频列表中某个录像文件的开始时间(yyMMddHHmmss)
240430143923 --对应的历史视频列表中某个录像文件的结束时间(yyMMddHHmmss)
6d --校验码
7e
5.4.设备应答拉流指令
设备对拉流指令采用的是通用应答:0x0001消息进行应答
5.5.组成拉流地址
平台收到设备指令应答后,后台组成拉流地址,返回给前端,组包示例如下,与实时视频一致:
"flv": "http://apollo.aovx.com:8088/00000000018026966027/1.live.flv","https_flv": "https://apollo.aovx.com:18443/00000000018026966027/1.live.flv","ws_flv": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.flv","wss_flv": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.flv","fmp4": "http://apollo.aovx.com:8088/00000000018026966027/1.live.mp4","https_fmp4": "https://apollo.aovx.com:18443/00000000018026966027/1.live.mp4","ws_fmp4": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.mp4","wss_fmp4": "wss://apollo.aovx.com:18443/00000000018026966027/1.live.mp4","hls": "http://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8","https_hls": "https://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8","ws_hls": "ws://apollo.aovx.com:8088/00000000018026966027/1/hls.m3u8","wss_hls": "wss://apollo.aovx.com:18443/00000000018026966027/1/hls.m3u8","ts": "http://apollo.aovx.com:8088/00000000018026966027/1.live.ts","https_ts": "https://apollo.aovx.com:18443/00000000018026966027/1.live.ts","ws_ts": "ws://apollo.aovx.com:8088/00000000018026966027/1.live.ts","rtmp": "rtmp://apollo.aovx.com:8935/00000000018026966027/1","rtsp": "rtsp://apollo.aovx.com:8554/00000000018026966027/1","rtsps": "rtsps://apollo.aovx.com:8332/00000000018026966027/1",
5.6.历史视频回放拉流控制
历史视频回放拉流控制采用的是:0x9202命令
指令示例:
7e92020009138110121350f7b90102002404180000003f7e
示例解释:
7e
9202 --进行历史视频回放控制命令ID
0009 --消息体属性
138110121350 --设备ID,不足12位前面补0,如果是2019的协议,不足20位前面补0
f7b9 --消息流水号
01 --视频通道号
02 --回放控制类型(0:开始回放;1:暂停回放;2:结束回放;3:快进回放;4:关键帧快退回放;5:拖动回放;6:关键帧播放)
00 --如果是快进或者快退(快进或者快退倍数;0:无效;1:1倍;2:2倍;3:4倍;4:8倍;5:16倍)
240418000000 --如果是拖动回放,则是拖动到的时间(yyMMddHHmmss)
3f --校验码
7e
5.7.设备应答控制指令
设备对视频回放控制采用的是通用应答:0x0001消息进行应答
6.结语
对接过程中有很多的坑,特别是双向对讲,如果采集音频并通过流媒体抓发给设备,还有设备使用的那种编码格式,如何兼容海思头等等,如有兴趣的朋友可以一起交流沟通。