RTSP协议,wireshark使用,RTCP(RFC),linux系统调用可以看ORTP库源码(51CTO有介绍这个库视频)

推流和拉流的区别?

推流指的是把采集阶段封包好的内容传输到服务器的过程。拉流指的是播放器从服务器拉取视频资源进行解码等操作进行资源播放。

RTSP拉流和推流建立流程:(rfc文档部分翻译)

最小 RTSP 实现

D.1 客户端

客户端实现【必须】能够做到如下几点:

*生成下列请求:SETUP, TEARDOWN, 和 PLAY (意即, 一个最小回放客户端) 或

RECORD (意即, 一个最小录制客户端)。如果 RECORD 被实现,ANNOUNCE【必须】

也被实现。

*在请求中包含下列头部:CSeq, Connection, Session, Transport。如果

ANNOUNCE 被实现,也应该实现包含 Content-Language, Content-Encoding,

Content-Length, 及 Content-Type 头部的能力。

*解析并理解下列响应中的头部:CSeq,Connection, Session, Transport,

Content-Language, Content-Encoding, Content-Length, Content-Type。如果

实现了 RECORD,则也必须理解 Location 头部。RTP-compliant(RTP 适用的)实

现应该再实现 RTP-Info。*如果收到一个型别为 4xx 或 5xx 的错误代码,理解所收到错误代码的型别并

通知最终用户。如果最终用户明确指出不想要一个或所有状态码的产生条件,则

可以不进行通知。

*期待并回复服务器的异步请求,例如 ANNOUNCE。这并不是说它一定要实现

ANNOUNCE 方法,而只是【必须】对收到的任何服务器请求作出肯定或否定响应。

 

服务器

最小服务器实现【必须】能够做到:*实现下列方法:SETUP, TEARDOWN, OPTIONS 以及 PLAY (对于最小回放服务器)

or RECORD (对于最小录制服务器)。如果实现 RECORD, ANNOUNCE 也应该实现。

*包含下列头部:Connection, Content-Length, Content-Type,

Content-Language, Content-Encoding, Transport, Public。如果实现 RECORD

方法,也应实现包含 Location 头部的能力。RTP-compliant(RTP 适应的)实

现还应该实现 RTP-info 域。

*正确解析及响应请求中的下列头部:Connection, Session, Transport,

Require。

虽然不是必需,但为了便于实际中同早期实现协同工作且/或成为“好市民”,

在发布时仍强烈推荐实现下述功能。

* 实现 RTP/AVP/UDP ,使其成为有效 transport。

* 包含 Server 头部。

* 实现 DESCRIBE 方法。

* 按附录 C 中的定义生成 SDP 会话描述。

 

预研RTSP的时候,重点分析和验证下以下几点
1. RTSP客户端的SETUP和PLAY信令是否可以和DESCRIBE在不同的TCP连接上发过去?
2. RTSP客户端是不是不能指定媒体传输的IP地址,只能指定端口,IP地址是不是必须和发送SETUP的IP地址?
3. RTSP服务端是否可以支持媒体传输地址和端口,与信令地址不同

 

模拟客户端,TCP连接服务端,用RTSP的请求消息组包发过去,收到服务端的回复,注意send过去的包,那个字符串后面不能有\0,所以send参数是strlen(buf)  发过去包的大小,不是sizeof(buf)或strlen(buf) +1,不然用wireshark抓包查看时它解析不出包裹。

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#define TCP_PORT 8554
int main(int argc,char *argv[])
{
    int sockfd;
    struct sockaddr_in peer;
    char buf[1024] = {0};
    char method[20] = {0};
    int CSEQ = 1;
    int t = 10;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_36973999

你的鼓励是我对你的帮助的回报

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值