#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. 设置VMware随系统开机自动启动并引导虚拟机操作系统

    设置VMware随系统开机自动启动并引导虚拟机操作系统 转载 2012年03月15日 19:50:53 标签: vmware / 虚拟机 / windows / parameters / tools  ...

  2. root权限NPM全局安装(-g)仍会权限不够,认识下参数 --unsafe-perm

    环境说明 ganiks@ganiks-ubuntu-trusty-64:/ganiks/parse-server$ npm -v 6.5.0 ganiks@ganiks-ubuntu-trusty-6 ...

  3. UVALive 7721 K - 2-ME Set 集合dp,所有数的位或来表示状态。

    /** 题目:UVALive 7721 K - 2-ME Set 链接:https://vjudge.net/problem/UVALive-7721 题意:给定n个数,从中取出一个集合,至少包含两个 ...

  4. angular 输入属性@Input , 输出属性@Output , 中间人模式

    1 输入属性 通常用于父组件向子组件传递信息 举个栗子:我们在父组件向子组件传递股票代码,这里的子组件我们叫它app-order 首先在app.order.component.ts中声明需要由父组件传 ...

  5. 【BZOJ】2021: [Usaco2010 Jan]Cheese Towers(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2021 噗,自己太弱想不到. 原来是2次背包. 由于只要有一个大于k的高度的,而且这个必须放在最顶,那 ...

  6. Dynamics CRM 系统自己定义部分的语言翻译

    Dynamics CRM 自带语言切换功能,在官网下载所需语言包安装后,在设置语言中就能看到你所加入的语言.勾选要启用的语言应用就可以.再打开系统设置--语言就能看到可更改用户界面语言的显示了. wa ...

  7. [LAMP]安装-Debian

    sudo apt-get install build-essential sudo apt-get install mysql-server sudo apt-get install apache2 ...

  8. DataContract 和 DataMember

    数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被 ...

  9. 【Ubuntu 16.04.3 LTS】apt-get 安装MariaDB

    一.Mysql背景信息 Mysql在互联网早期就流行了,追求速度.简单.坚持开源.几乎支持所有操作系统.完全支持多用户.多线程,支持海量数据存储,采用MyISAM.InnoDB两大存储引擎优势互补.但 ...

  10. sql server数据库,禁用启用触发器各种情况!

    一.禁用和启用单个触发器 禁用: ALTER TABLE trig_example DISABLE TRIGGER trig1 GO 恢复: ALTER TABLE trig_example ENAB ...