#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h> #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> #include <sys/select.h>
#include <sys/time.h> #include <stdlib.h> #define SERVER_IP "192.168.1.163"
#define SERVER_PORT 8557
#define CMD_LEN 1024*2
#define RTSP_URL "rtsp://192.168.1.163:8557/PSIA/Streaming/channels/2?videoCodecType=H.264" #define RECV_LEN 1460 #define BYTE_FILE "source.264" //生成rtsp发送命令
char * GetRTSPCmd(const char *);
//发送命令数据
long SendRTSPCmd(int sock, const char *cmd, const char *szparam);
//读取数据
long ReadSocket(int sock, char *buf, int len, int timeout ); int main(){ struct sockaddr_in addr_server;
char buf[CMD_LEN];
char rbuf[RECV_LEN]; int sock_fd=socket(AF_INET,SOCK_STREAM,);
if(sock_fd==-){
printf("create the socket failed.\n");
return ;
} memset(&addr_server,,sizeof(struct sockaddr_in));
addr_server.sin_family=AF_INET;
addr_server.sin_addr.s_addr=inet_addr(SERVER_IP);
addr_server.sin_port=htons(SERVER_PORT);
if(connect(sock_fd,(struct sockaddr*)&addr_server,sizeof(struct sockaddr))==-){
printf("connect the server failed./n");
return ;
} memset(buf,,CMD_LEN);
sprintf(buf,GetRTSPCmd("OPTIONS"),RTSP_URL,,"","");
SendRTSPCmd(sock_fd, "OPTIONS",buf);
ReadSocket(sock_fd,buf,CMD_LEN,); memset(buf,,CMD_LEN);
sprintf(buf,GetRTSPCmd("DESCRIBE"),RTSP_URL,,"","","");
SendRTSPCmd(sock_fd, "DESCRIBE", buf);
ReadSocket(sock_fd,buf,CMD_LEN,); //connet to the video
memset(buf,,CMD_LEN);
sprintf(buf,
"SETUP rtsp://%s:%d/PSIA/Streaming/channels/2?videoCodecType=H.264/track1 RTSP/1.0\r\n"
"CSeq: 1\r\n"
"Transport: RTP/AVP;unicast;client_port=57102-57103\r\n\r\n",SERVER_IP,SERVER_PORT);
SendRTSPCmd(sock_fd, "SETUP", buf);
ReadSocket(sock_fd,buf,CMD_LEN,); /*
//connect to the audio
memset(buf,0,CMD_LEN);
sprintf(buf,
"SETUP rtsp://%s:%d/PSIA/Streaming/channels/2?videoCodecType=H.264/track2 RTSP/1.0\r\n"
"CSeq: 1\r\n"
"Transport: RTP/AVP;unicast;client_port=57104-57105\r\n\r\n",SERVER_IP,SERVER_PORT);
SendRTSPCmd(sock_fd, "SETUP", buf);
ReadSocket(sock_fd,buf,CMD_LEN,10);*/ //get the session and server port
char psession[],pserverport[];
char* ptr;
memset(psession,,);memset(pserverport,,);
ptr=strstr(buf,"Session:");
if(ptr==){
printf("cannot find the session.\n");
return ;
}
memcpy(psession,ptr+strlen("Session:"),strstr(ptr,"\r\n")-ptr-strlen("Session:"));
printf("Session:%s\n",psession);
ptr=strstr(buf,"server_port=");
memcpy(pserverport,ptr+strlen("server_port="),strstr(ptr,"-")-ptr-strlen("server_port="));
printf("Server port: %s\n",pserverport);
printf("\n"); memset(buf,,CMD_LEN);
sprintf(buf,GetRTSPCmd("PLAY"),RTSP_URL,,psession,"Range: npt=0.000-\r\n","","","");
SendRTSPCmd(sock_fd, "PLAY", buf);
ReadSocket(sock_fd,buf,CMD_LEN,); int save_fd=open(BYTE_FILE,O_CREAT|O_WRONLY);
struct sockaddr_in addr_stream;
struct sockaddr_in addr_local;
int recv_fd=socket(AF_INET,SOCK_DGRAM,);
if(recv_fd==-){
printf("create the stream socket failed.\n");
return ;
}
addr_local.sin_family=AF_INET;
addr_local.sin_addr.s_addr=inet_addr("192.168.1.199");
addr_local.sin_port=htons();
if(bind(recv_fd,(struct sockaddr*)&addr_local,sizeof(struct sockaddr))==-){
printf("bind the local stream socket failed.\n");
return ;
}
addr_stream.sin_family=AF_INET;
addr_stream.sin_addr.s_addr=inet_addr(SERVER_IP);
addr_stream.sin_port=htons(atoi(pserverport));
int len_recv;
int len_addr=sizeof(addr_stream);
while(){
memset(rbuf,,RECV_LEN);
len_recv=recvfrom(recv_fd,rbuf,RECV_LEN,,(struct sockaddr*)&addr_stream,&len_addr);
if(len_recv==-){
printf("recvfrom the stream failed.\n");
return ;
}
write(save_fd,rbuf,len_recv);
printf("recvfrom:%d\n",len_recv);
}
close(recv_fd); close(save_fd); return ;
} char * GetRTSPCmd( const char * szName)
{
char *str = NULL;
char const* cmdFmt = NULL;
if(!strcmp(szName, "OPTIONS"))
{
cmdFmt =
"OPTIONS %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"%s"
"%s"
"\r\n";
}
else if(!strcmp(szName, "ANNOUNCE"))
{
cmdFmt =
"ANNOUNCE %s RTSP/1.0\r\n"
"CSeq: %d/r/n"
"Content-Type: application/sdp\r\n"
"%s"
"Content-length: %d\r\n\r\n"
"%s";
}
else if(!strcmp(szName, "PLAY"))
{
cmdFmt =
"PLAY %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"%s"
"%s"
"%s"
"%s"
"\r\n"; }
else if(!strcmp(szName, "PAUSE"))
{
cmdFmt =
"PAUSE %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"%s"
"%s"
"/r/n";
}
else if(!strcmp(szName, "RECORD"))
{
cmdFmt =
"RECORD %s%s%s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"Range: npt=0-\r\n"
"%s"
"%s"
"\r\n";
}
else if(!strcmp(szName, "SET_PARAMETER"))
{
cmdFmt =
"SET_PARAMETER %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"%s"
"%s"
"Content-length: %d\r\n\r\n"
"%s: %s\r\n";
}
else if(!strcmp(szName, "GET_PARAMETER"))
{
cmdFmt =
"GET_PARAMETER %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"%s"
"%s"
"Content-type: text/parameters\r\n"
"Content-length: %d\r\n\r\n"
"%s\r\n";
}
else if(!strcmp(szName, "TEARDOWN"))
{
cmdFmt =
"TEARDOWN %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Session: %s\r\n"
"%s"
"%s"
"\r\n";
}
else if(!strcmp(szName, "DESCRIBE"))
{
cmdFmt =
"DESCRIBE %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"%s"
"%s"
"%s"
"\r\n";
}
else if(!strcmp(szName, "ANNOUNCE"))
{
cmdFmt =
"ANNOUNCE %s RTSP/1.0\r\n"
"CSeq: %d\r\n"
"Content-Type: application/sdp\r\n"
"%s"
"Content-length: %d\r\n\r\n"
"%s";
}
else if(!strcmp(szName, "SETUP"))
{
cmdFmt =
"%s"
"CSeq: %d\r\n"
"%s"
"%s"
"%s"
"%s"
"\r\n";
}
str = (char*)cmdFmt;
return str;
} long ReadSocket(int sock, char *buf, int len, int timeout )
{
long lret ;
int iret;
fd_set fr;
struct timeval tm;
tm.tv_sec = timeout;
tm.tv_usec = ; FD_ZERO(&fr);
FD_SET(sock,&fr); lret = select(sock+, &fr, NULL, NULL, &tm); if(FD_ISSET(sock,&fr))//if(lret > 0)
{
lret = recv(sock, buf, len, );
if(lret == -)
{
printf("recv failed./n");
}
else if(lret > )
{
printf("%s\n",buf);
}
} return lret;
} long SendRTSPCmd( int sock, const char *cmd, const char *szparam )
{
long lret;
int ilen;
ilen = strlen(szparam);
lret = send(sock, szparam, ilen,);
if(lret == -)
{
printf("send %s failed.\n",cmd);
}
return lret;
}

rtsp over udp的更多相关文章

  1. 流媒体协议(RTMP、RTSP、UDP、HTTP、MMS)转换小工具(RTSP转成RTMP案例展示)(转)

    源: 流媒体协议(RTMP.RTSP.UDP.HTTP.MMS)转换小工具(RTSP转成RTMP案例展示)

  2. send/receive h264/aac file/data by rtp/rtsp over udp/tcp

    一.安装一些必要的调试工具 1.vlc安装sudo apt-get install vlcsudo apt-get install vlc-nox 2.ffmpeg安装,带ffplay,ffplay依 ...

  3. FFmpeg RTSP流通过UDP传输问题

    我自己在使用SRS服务的Ingest功能时发现在读取一个网络摄像头的RTSP流时一直不成功, 具体分析后发现SRS在调用FFmpeg时出了问题: /usr/local/ffmpeg/bin/ffmpe ...

  4. rtsp 流媒体服务器,播放器

    https://github.com/EasyDSS/EasyPlayer-RTSP-Android EasyPlayer EasyPlayer RTSP Android 播放器是由紫鲸团队开发和维护 ...

  5. Managed Media Aggregation using Rtsp and Rtp

    his article was written almost 2 years ago, it's content may not reflect the latest state of the cod ...

  6. RTSP Windows专用播放器EasyPlayer : 稳定、兼容、高效、超低延时

    EasyPlayer RTSP Windows专用播放器 EasyPlayer RTSP Windows 播放器是由EasyDarwin团队开发和维护的一个完善的RTSP流媒体播放器项目,视频编码支持 ...

  7. Darwin Streaming Server 6.0.3安装、订制、插件或模块

    How to setup Darwin Streaming Server 6.0.3 on 32 or 64 bit Linux platforms, add custom functionality ...

  8. 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)

    http://blog.csdn.net/leixiaohua1020/article/details/43936415 ======================================= ...

  9. iOS使用ffmpeg播放rstp实时监控视频数据流

    一.编译针对iOS平台的ffmpeg库(kxmovie) 最近有一个项目.须要播放各种格式的音频.视频以及网络摄像头实时监控的视频流数据,经过多种折腾之后,最后选择了kxmovie,kxmovie项目 ...

随机推荐

  1. RabbitMQ系列一

    1.http://www.erlang.org/downloads 下载一个比教新的版本(otp_win64_20.2.exe) 2.http://www.rabbitmq.com/install-w ...

  2. jQuery 实战读书笔记之第四章:使用特性、属性和数据

    使用属性 /* 每个元素都有一或多个特性,,这些特性的用途是给出相应元素或其内容的附加信息.(出自 JavaScript 高级程序设计) */ /* 特性是固有的 JavaScript 对象 属性指的 ...

  3. 利用RPM和YUM安装软件

    安装软件事root的事,所以必须要以root身份登录! 假设我要安装一个文件名为rp-pppoe-3.5-32.1.i386.rpm的文件, 那么我们可以这样: rpm安装软件 rpm -ivh pa ...

  4. Ubuntu安装新版本nodejs的5种姿势

    引言: 写这篇文章之前,关于ubuntu14.04(Trusty)默认安装的NodeJS版本是0.10.25百思不解(什么鬼,哪一年的NodeJS) 写这篇文章之时,NodeJS的LTS版本号都已经1 ...

  5. MapReduce实战(一)自定义类型

    需求: 处理以下流量数据,第1列是手机号,第7列是上行流量,第8列是下行流量.将手机号一样的用户进行合并,上行流量汇总,下行流量也汇总,并相加求得总流量. 1363157985066 13726230 ...

  6. 解决微信小程序中Date.parse()获取时间戳IOS不兼容的问题(IOS为NaN的问题)

    前端同事在做微信小程序时发现IOS获取的时间戳为空的问题,后来通过跟踪发现,原来是因为IOS系统不支持2017-01-01格式的时间导致的, var mydata = '2017-01-01 11:0 ...

  7. tomocat解决乱码问题

    使用Tomcat进行JSP开发最头疼的莫过于中文乱码问题了,总结Tomcat乱码问题出现的原因必须明白以下几点: 1.Tomcat一般总是默认使用ISO-8859-1作为字符编码方式的.所以,除非你在 ...

  8. 再谈Unity调用Android的Activity

    这段时间在研究Unity4.3开发环境下.怎样调用由Android SDK4.4.2写的Activity.參考了非常多网上的博客.百度出了几十篇大部分都是转载雨松MOMO的,这里必须向雨松MOMO表示 ...

  9. CSS样式设置

    转载来自:http://www.imooc.com/article/2067水平居中设置-行内元素 水平居中 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align: ...

  10. [Go语言]从Docker源码学习Go——结构和函数的定义

    Docker在最近很火,而作为Docker的开发语言-Go也再次被大家提到. 已经使用Docker一段时间了,但是对于源码,尤其是其开发语言Go却一直是一知半解. 最近准备利用空余时间从Docker源 ...