Android向EasyN摄像头发送http get请求获取媒体数据响应包

一.描述

Android实现获取网络摄像头的视频流并且播放,以便实现手机实时监控。

网络摄像头:EsayN(普顺达)。

网络:内网。外网应该也也一样,没有测试。

协议文档:ipCamera视音频访问协议。

此文档主要是实现协议文档中发送httpget请求到网络摄像头,获取媒体数据响应包。

代码中摄像头的IP和端口分别是192.168.10.25381。

二.发送httpget请求包

1.使用Socket建立与摄像头的连接。

2.获得socket的OutputStream流。

3.StringBuffer中写要发送的请求包的内容。

4.OutputStream对象writeStringBuffer中的数据。

三.获取媒体数据响应数据

1.获得socket的InputStream流。

2.根据InputStream流获取BufferedReader对象。

3.读取响应数据。

四.代码如下:

<span style="font-family:Microsoft YaHei;font-size:18px;">Socket socket = new Socket("192.168.10.253", 81);OutputStream out = socket.getOutputStream();InputStream in = socket.getInputStream();StringBuffer sb = new StringBuffer();sb.append("GET :81/livestream/11?action=play&media=video_audio_data HTTP/1.1\r\n");sb.append("User-Agent: HiIpcam/V100R003 VodClient/1.0.0\r\n");sb.append("Connection: Keep-Alive\r\n");sb.append("Cache-Control: no-cache\r\n");sb.append("Authorization: admin admin\r\n");sb.append("Content-Length: 57\r\n");sb.append("Cseq: 1\r\n");sb.append("Transport:RTP/AVP/TCP;unicast;interleaved=0-1\r\n");sb.append("\r\n");out.write(sb.toString().getBytes());out.flush();BufferedReader reader = new BufferedReader(new InputStreamReader(in));String tmp = "";System.out.println("response:\r\n");/*for(int i = 0;i<20;i++){tmp = reader.readLine();System.out.println(tmp);}*/while ((tmp = reader.readLine()) != null) {System.out.println(tmp);}socket.close();</span>

五.问题

1.发送请求包之后响应包一直为空,获取不到数据。

原因:Authorization:adminadmin,账号,也就是第一个admin之前必须要有空格。

2.针对上述代码在使用Juit测试的时候被卡死。

原因:查看Logcat发现一直在输出数据,不是在http包结束之后就停止输出了。,在http包之后输出的数据应该就是视频流数据。

六.总结

看到文档时的第一思路就是首先要获取响应包,但是在获取响应包之后不知道该怎么做,怎么处理获得的视频流,最后发现EasyN支持rtsp获得视频流,视频流地址格式为rtsp://[account]:[password]@[ip][port]/11

account:账号

Password密码

Ip网络摄像头的ip

Portrtsp端口。默认是554

11代表主码流,12代表次码流。

例如:rtsp://admin:admin@192.168.10.253:554/11一定要注意端口。

七. ip Camera视音频访问协议文档

IP Camera 视音频访问协议此文档描述了如何获取网络摄像机的视音频及其他媒体数据。网络摄像机支持公用通信协议和私有通信协议,此文档主要描述私有协议的内容和协议的实现方式。1. 公用通信协议 RTSP Over HttpQuicktime 支持此协议。详细请参考RTSP 协议,RTP 协议和http 协议。2. 公用通信协议 RTSP Over UDPQuicktime, VLC 支持此协议。详细请参考RTSP 协议,RTP 协议。3. 私有通信协议通过此协议实现获取媒体数据。媒体数据包括,视频数据,音频数据,移动检测报警数据,外置报警数据。此协议建立在 TCP/IP 之上。3.1 通信协议工作流程1). 媒体数据接收流程发送媒体数据请求包循环接收媒体数据关闭 TCP 连接接收响应包建立 TCP 连接3.2 通信协议详细说明1). 媒体数据a.媒体数据请求包GET [IP]:[port]/livestream/[number]?action=play&media=[type] HTTP/1.1\r\nUser-Agent: HiIpcam/V100R003 VodClient/1.0.0\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nAuthorization: [username] [password] \r\nContent-Length: [length] \r\n\r\nCseq: 1\r\nTransport: RTP/AVP/TCP;unicast;interleaved=0-1\r\n\r\n字段说明IP设备IP地址。port设备端口号。number码流号。11: 第一通道主码流。12: 第一通道次码流。21: 第二通道主码流。22: 第二通道次码流。注意:目前设备只有第一个通道type请求数据类型video 仅视频数据audio 仅音频数据data 仅报警数据(目前不支持)video_audio 音视频数据video_data 视频报警数据audio_data 音频报警数据video_audio_data 音视频,报警数据username用户名password密码length该字段以后数据的长度(从Cseq开始的字节数),可以使用strlen()函数示例:GET :80/livestream/11?action=play&media=video_audio_data HTTP/1.1\r\nUser-Agent: HiIpcam/V100R003 VodClient/1.0.0\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nAuthorization: guest guest\r\nContent-Length: 57\r\nCseq: 1\r\nTransport: RTP/AVP/TCP;unicast;interleaved=0-1\r\n\r\n\b. 媒体数据响应包1). 用户名密码校验错误示例:HTTP/1.1 401 Unauthorized\r\nHost: 192.168.1.88\r\nConnection: Keep-Alive\r\n2). 权限校验成功,返回音视频类型HTTP/1.1 200 OK\r\n Host: [IP]\r\n Connection: Keep-Alive\r\n Server: HiIpcam/V100R003 VodServer/1.0.0\r\n Cache-Control: no-cache\r\n Accept-Ranges: Bytes\r\n Content-Type: application/octet-stream\r\n Connection: close\r\n\r\nSession: 15547656\r\nCseq: 1\r\nm=video 96 H264/90000/[Width]/[Height]\r\nm=audio 97 G726/8000/1\r\nTransport: RTP/AVP/TCP;unicast;hisiinterleaved=0-1;ssrc=614fd4a1\r\n\r\n字段说明videoWidth:视频宽。Height:视频高。视频只有H264audio97 G7268 G711a所有音频,都是单声道,8K采样,16位宽。G711a码流64kbpsG726 码流16kbps示例:HTTP/1.1 200 OK\r\n Host: 192.168.1.88\r\n Connection: Keep-Alive\r\n Server: HiIpcam/V100R003 VodServer/1.0.0\r\n Cache-Control: no-cache\r\n Accept-Ranges: Bytes\r\n Content-Type: application/octet-stream\r\n Connection: close\r\n\r\nSession: 15547656\r\nCseq: 1\r\nm=video 96 H264/90000/704/576\r\nm=audio 97 G726/8000/1\r\nTransport: RTP/AVP/TCP;unicast;hisiinterleaved=0-1;ssrc=614fd4a1\r\n\r\n注意:一定按照HTTP协议判断HTTP包结束。c. 媒体数据包内容1). 数据包头结构图1. RTSP数据包头格式:typedef struct{Unsigned char daollar; /*8, $:dollar sign(24 decimal)*/Unsigned char channelid; /*8, channel id*/Unsigned short resv; /*16, reseved*/Unsigned int payloadLen; /*32, payload length*/RTP_HDR_S rtpHead; /*rtp head*/}RTSP_ITLEAVED_HDR_S;字段说明payloadLen代表后面的RTP数据包的长度(包括RTP_HDR_S头的长度)注意:该字段为网络字节序其他值可暂时不处理2. RTP数据包头格式:typedef struct{/* byte 0 */Unsigned short cc :4; /* CSRC count */Unsigned short x :1; /* header extension flag */Unsigned short p :1; /* padding flag */Unsigned short version :2; /* protocol version *//* byte 1 */Unsigned short pt :7; /* payload type */Unsigned short marker :1; /* marker bit *//* bytes 2, 3 */Unsigned short seqno :16; /* sequence number *//* bytes 4-7 */Unsigned int ts; /* timestamp in ms *//* bytes 8-11 */Unsigned int ssrc; /* synchronization source */} RTP_HDR_S;字段说明音频编码数据或视频编码数据或报警数据RTP数据包头RTSP数据包头pt96 H.26497 G.7268 G.711a100 报警数据ts时间戳,单位为毫秒注意:该字段为网络字节序其他值可暂时不处理3. 视频编码数据每次收到的视频数据为H.264的一个Nalu包。它可能是一个完整帧也可能不是.当要多个Nalu包组成一个完整帧时,,就要进行组帧操作。有一个简便的方法可以组帧,判断时间戳,时间戳相同为一帧。4. 音频编码数据音频数据解码时,要先去掉4字节的私有数据头。5. 报警数据移动检测数据内容当4个报警区域都有报警时如下:“MDName1-x-y-width-height| MDName2-x-y-width-height| MDName3-x-y-width-height|MDName4-x-y-width-height|”字段说明MDName移动检测区域名称(值:1, 2, 3, 4)xX坐标yY坐标width宽度height高度“|”数据分隔符示例:1-10-10-20-20|外置报警数据内容alarmin:1

失败是成功的亲娘,没有失败哪来的成功呢?诺贝尔如果不经历千万次的失败,

Android向EasyN摄像头发送http get请求获取媒体数据响应包

相关文章:

你感兴趣的文章:

标签云: