#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. javascript立刻执行函数

    一般常见的立刻执行函数推荐如下两种: (function(a){ console.log(a); })("kk"); (function(a){ console.log(a) }( ...

  2. 让超出DIV宽度范围的文字自动显示省略号...

    关键是:text-overflow: ellipsis; div.titleholder { font-family: ms sans serif, arial; font-size: 8pt; wi ...

  3. CSS Transform / Transition / Animation 属性的区别

    back21 Jun 2011 Category: tech Tags: css 最近想UI的动画转到css3能吃进3d加速的属性上面来以加强动画的连贯性.只是对于css几个新加的属性不太熟悉,常常容 ...

  4. IDEA中如何配置Tomcat和项目?

    IDEA是我用的挺多的一款java代码编辑工具,对于刚接触这款软件的新手来说,配置项目是很麻烦的了,更别说配置服务器Tomcat了,那么通过我的教程大家一定觉得配置IDEA项目也是很轻松的事了.   ...

  5. 第二百零九节,jQuery EasyUI,Pagination(分页)组件

    jQuery EasyUI,Pagination(分页)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Pagination(分页)组件的使 ...

  6. 框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口

    框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口. 与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局. package TomAwt; im ...

  7. 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据

    1:跨域请求handler一般处理程序 using System; using System.Collections.Generic; using System.Web; using System.W ...

  8. mac os下android 通过battery-historian进行电量分析

    简单介绍下如何用battery-historian进行电量分析,因为battery-hostorian是基于go语言的框架,所以需要安装go 1.安装go 2.配置go环境变量到.bash_profi ...

  9. 【BZOJ】3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3410 太神了.... 按末端点排序然后贪心取即可. QAQ #include <cstdio& ...

  10. 【BZOJ】3401: [Usaco2009 Mar]Look Up 仰望(单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3401 还能更裸一些吗.. 维护一个递减的单调栈 #include <cstdio> #i ...