H264云台型网络摄像机学习.doc_第1页
H264云台型网络摄像机学习.doc_第2页
H264云台型网络摄像机学习.doc_第3页
H264云台型网络摄像机学习.doc_第4页
H264云台型网络摄像机学习.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

H264云台型网络摄像机学习RTSP交互过程C表示rtsp客户端,S表示rtsp服务端1.C-S:OPTIONrequest /询问S有哪些方法可用1.S-C:OPTION response /S回应信息中包括提供的所有可用方法2.C-S:DESCRIBErequest /要求得到S提供的媒体初始化描述信息2.S-C:DESCRIBE response /S回应媒体初始化描述信息,主要是sdp3.C-S:SETUPrequest /设置会话的属性,以及传输模式,提醒S建立会话3.S-C:SETUP response /S建立会话,返回会话标识符,以及会话相关信息4.C-S:PLAYrequest /C请求播放4.S-C:PLAY response /S回应该请求的信息S-C:发送流媒体数据5.C-S:TEARDOWNrequest /C请求关闭会话5.S-C:TEARDOWN response /S回应该请求RTSP连接、断开、视频播放、停止的工具类文件/* * RTSPVideoUtil.h * * Created on: 2012-10-4 */#include#include#include#include#include#includeinclude/rtppackage.h#includeinclude/type.h#includeinclude/DecodeFrame.h/全局变量JNIEnv *env_play;int rtsp_Socket = -1;int size = 1024;int mWidth = 352, mHeight = 288;/显示视频屏幕大小char Session100;uint8_t videoDecodeData352 * 288 * 2;/视频数据缓冲,使其与mWidth、mHeight相同jbyteArray jarrayVideo;char *IP;int Port;/* * RTSP连接 * 返回0,连接失败;返回1,连接成功 */int getConnectRTSP(char *ip, int port) /LOGD(begin to connect rtspn); char szResponse1024; char szSendBuf1024; int nRet = 0; int nTimeOut = 5000; IP = ip; Port = port; setsockopt(rtsp_Socket, SOL_SOCKET, SO_RCVTIMEO, (char*) &nTimeOut, sizeof(nTimeOut); rtsp_Socket = socket(AF_INET, SOCK_STREAM, 0);/创建socket if (rtsp_Socket 0) /告诉Java创建Sock失败 return 0; /Socket连接 struct sockaddr_in addrSrv; addrSrv.sin_addr.s_addr = inet_addr(ip); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port); if (-1 = connect(rtsp_Socket, (struct sockaddr*) &addrSrv, sizeof(struct sockaddr) /告诉Java创建Sock失败 LOGD(Connect失败n); close(rtsp_Socket); rtsp_Socket = -1; return 0; /OPTIONS方法 char lstrOptions1024 = OPTIONS rtsp:/%s:%d/H264 RTSP/1.0rn CSeq: 1rn rn; sprintf(szSendBuf, lstrOptions, ip, port); nRet = send(rtsp_Socket, szSendBuf, 1024, 0); if (nRet = -1) return 0; LOGD(send1 nRet=%d,buf=%s, nRet, szSendBuf); memset(szResponse, 0, sizeof(szResponse); nRet = recv(rtsp_Socket, &szResponse0, 1024, 0); LOGD(recv1 nRet=%d,response=%s, nRet, szResponse); if (nRet = -1) return 0; /DESCRIBE方法 char lstrDescribe1024 = DESCRIBE rtsp:/%s:%d/H264 RTSP/1.0rn CSeq: 2rn Content-Length: 0rn rn; memset(szSendBuf, 0, sizeof(szSendBuf); sprintf(szSendBuf, lstrDescribe, ip, port); nRet = send(rtsp_Socket, szSendBuf, 1024, 0); if (nRet = -1) return 0; /LOGD(send2 nRet=%d,buf=%s, nRet, szSendBuf); memset(szResponse, 0, sizeof(szResponse); nRet = recv(rtsp_Socket, &szResponse0, 1024, 0); if (nRet = -1) return 0; /LOGD(recv2 nRet=%d,response=%s, nRet, szResponse); /SETUP方法 char lstrSetup1024 = SETUP rtsp:/%s:%d/H264 RTSP/1.0rn CSeq: 3rn Transport: RTP/AVP;unicast;client_port=6666-6667rn rn; memset(szSendBuf, 0, sizeof(szSendBuf); sprintf(szSendBuf, lstrSetup, ip, port); nRet = send(rtsp_Socket, szSendBuf, 1024, 0); if (nRet = -1) return 0; /LOGD(send3 nRet=%d,buf=%s, nRet, szSendBuf); memset(szResponse, 0, sizeof(szResponse); nRet = recv(rtsp_Socket, &szResponse0, 1024, 0); if (nRet = -1) return 0; /LOGD(recv3 nRet=%d,response=%s, nRet, szResponse); /获取Session的内容 int i = 0, j = 0; for (; i ReleaseByteArrayElements(jarrayVideo, (jbyte*) videoDecodeData, 0);/* *RTSP断开连接 */int DisconnectRTSP() char szResponse1024; char szSendBuf1024; int nRet; /TEARDOWN方法 char teardown1024 = TEARDOWN rtsp:/%s:%d/H264 RTSP/1.0rn CSeq: 5rn Session: %srn rn; sprintf(szSendBuf, teardown, IP, Port, Session); nRet = send(rtsp_Socket, szSendBuf, 1024, 0); if (nRet = -1) return 0; /LOGD(send1 nRet=%d,buf=%s, nRet, szSendBuf); memset(szResponse, 0, sizeof(szResponse); nRet = recv(rtsp_Socket, &szResponse0, 1024, 0); /LOGD(recv1 nRet=%d,response=%s, nRet, szResponse); if (nRet = -1) return 0; releaseResource(); return 1;/* * 调用Android的SurfaceView进行播放 */void displayVideo(int status, char *pRGBBuf, int nWidth, int nHeight, int nDepth) /创建子线程 (jvm_save)-AttachCurrentThread(&env_play, NULL); jarrayVideo = (env_play)-NewByteArray(nWidth * nHeight * 2); /将解码完的数据转成byte数组jarrayVideo (env_play)-SetByteArrayRegion(jarrayVideo, 0, nWidth * nHeight * 2, (const jbyte *) pRGBBuf); /调用SurfaceView的方法进行播放,displayVideo_methodId方法需要在JniHelp.cpp中实例化 (env_play)-CallStaticVoidMethod(cls_save, displayVideo_methodId, status, jarrayVideo, nWidth, nHeight, nDepth); /释放jarrayVideo、videoVideoData内存 (env_play)-ReleaseByteArrayElements(jarrayVideo, (jbyte*) videoDecodeData, 0); (jvm_save)-DetachCurrentThread();/* * 接收数据、拼帧、解码、播放 */void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t client) int hr, n, outSize = 0; int isFindIFrame = 0; CH264_RTP_UNPACK *unpack = new CH264_RTP_UNPACK(hr); socklen_t len = client; unsigned char mesg20480; long timebase = 0; InitDecoder(mWidth, mHeight); while (true) /* waiting for receive data */ memset(mesg, 0, sizeof(mesg); n = recvfrom(sockfd, mesg, 2048, 0, pcliaddr, &len); outSize = 0; /接受到视频数据开始拼桢 BYTE *pFrame = unpack-Parse_RTP_Packet(mesg, n, &outSize); if (timebase = 0 | timebase m_RTP_Header.ts) timebase = unpack-m_RTP_Header.ts; else continue; if (pFrame != NULL) if (isFindIFrame = 0) if (outSize 1456) isFindIFrame = 1; else continue; int outLen = outSize; /解码播放 if (DecoderNal(pFrame, outLen, videoDecodeData) 0) displayVideo(0, (char *) videoDecodeData, c-width, c-height, 0); /释放变量 UninitDecoder();/* * 接收处理数据线程 */void *recvThread(void *lpParam) int sockfd; struct sockaddr_in servaddr, cliaddr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */ /* init servaddr */ bzero(&servaddr, sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666);/绑定1024后的端口 /* bind address and port to socket */ if (bind(sockfd, (struct sock

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论