[FFMPEG]代码分析:rtsp客户端

news/2024/7/10 20:36:56 标签: ffmpeg

1.代码

libavformat/rtspdec.c 
libavformat/rtsp.c 

2.说明

RTSP具有独立于传输的特性,它本身并不传输流,只是做一个“网络遥控”的作用。在FFMPEG中认为RTSP是一种封装格式,而不是一种协议。

3.RTSP和HTTP的区别

  • RTSP引入了很多新方法并且有不同的协议标识符。
  • RTSP服务器在绝大多数默认情况下需要维持状态,而HTTP是无状态协议
  • RTSP客户机和服务器都可以发出请求,而HTTP只能由客户端发起请求
  • 数据由信带外的另一个协议传送(TCP,UDP,HTTP等)
  • RTSP使用IS 10646(UTF-8) 而不是IS 8859-1,以配合当前HTML的国际化。
  • RTSP的URI包含绝对URI,而HTTP/1.0请求包含的是相对路径,HTTP/1.1请求包含绝对路径,把主机名放入单独的头部域中。

4.代码分析

rtsp_probe:主要是实现对rtsp或rtsps的格式探测;
rtsp_read_header:主要是实现建立以及完成部分(OPTIONS,DESCRIBE,SETUP,PLAY)会话;
ff_rtsp_connect(以负载使用UDP协议):
    1.打开RTSP的会话TCP连接;
    2.OPTIONS会话
    3.DESCRIBE会话:并解析SDP文件(ff_sdp_parse)
    4.SETUP会话:设置默认超时为1分钟,计算本地端口,创建RTP/RTCP连接,发送SETUP请求
    5.初始化RTSP的状态为RTSP_STATE_IDLE(空闲);
 rtsp_read_play 
    1.发送punch包:分别通过RTP和RTCP连接发送各自的头版本信息 
    2.PLAY会话
    3.设置RTSP的状态为RTSP_STATE_STREAMING
    当负载使用UDP协议时,端口机制为使用默认范围5000~65000之间的一对随机数;
    当回复的status_code大于400时,认为失败
    默认使用的RTSP版本为1.0
rtsp_read_packet:主要是实现包数据的读取;
    1.读包数据:将RTP和RTCP加入poll,先尝试RTCP,再读RTP
    2.发送心跳:若支持GET_PARAMETER,则优先使用;否则使用OPTIONS作为心跳包;默认心跳超时为30秒
rtsp_read_close:主要是实现关闭会话;
    1.TEARDOWN会话
rtsp_read_seek:主要是实现seek跳转功能;
    1.RTSP状态机机制(IDLE->STREAMING->[SEEKING]->STREAMING)
    2.当RTSP状态机为STREAMING,先发送PAUSE命令,然后将seek的时间设置到PLAY的“Range: npt=”字段,然后发送PLAY命令
    3.当RTSP状态机为PAUSED时,将状态设置为IDLE
rtsp_read_play:主要是实现流播放会话;
    1.当RTSP状态机为PAUSED时,直接发送PLAY指令,不需要“Range: npt=”字段,否则发送带“Range: npt=”字段的指令;
rtsp_read_pause:主要是实现流暂停会话;
    1.PAUSE会话

5.RTCP

RTCP和 RTP一起工作的控制协议,主要功能是为应用程序提供会话质量或者广播性能质量的信息。


http://www.niftyadmin.cn/n/1336021.html

相关文章

[IJKPLAYER]编译与DEMO运行

前言 系统:UBUNTU 16.04桌面版 编译步骤,主要还是参考README.md中Build Android的描述 Android/iOS video player based on FFmpeg n3.2, with MediaCodec, VideoToolbox support. 优势: 基于 FFmpeg,表明几乎支持任何的协议 基…

SQL经典实例(七)数值处理

计算平均值 需要注意null值的问题。例如考虑如下表: create table t2(sal integer); insert into t2 values(10); insert into t2 values(20); insert into t2 values(null); 如果采用如下查询: select avg(sal) from t2; 得到: avg()函数会忽…

spring-boot-2.0.3源码篇 - filter的注册,值得一看

前言  开心一刻 过年女婿来岳父家走亲戚,当时小舅子主就问:姐夫,你什么时候能给我姐幸福,让我姐好好享受生活的美好。你们这辈子不准备买一套大点的房子吗?姐夫说:现在没钱啊!不过我有一个美丽…

UBUNTU服务器网络操作

#背景 作者一直是ubuntu服务器的忠实拥护者,关于UBUNTU系统的很多配置都能通过脚本在软件包中一键部署,但关于网络配置则需要根据现场环境变动,因此本文的目的在于指导ubuntu服务器的常用的网络部署。 #1.网络配置 ubuntu的网络配置文件和其…

TCP畅谈

#背景 本文是基于对以太网帧(FRAME)的研究,其中又对TCP的报文进行了ACK应答,丢包重传机制的补充,本文将对这些技术做一个大概的阐述。另外本文将用到wireshark抓包工具,具体使用细节由读者自己研究。 系统&…

SpringBoot系列: url重定向和转发

Web UI项目中, 很多 Spring controller 视图函数直接返回 html 页面, 还有一些视图函数是要重定向或转发到其他的 url 上. redirect 和 forward的区别: 重定向 redirect: 完整的重定向包含两次request-response过程, 第一次是访问原始url, 第二次是服务器通知客户端访问重定向后…

SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry)。关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘。下面是他的正文。 *大家好,我是来自SAP成都研究院C4C开发…

[bash]判断三角形类型、计算数学表达式、计算N个整数的指定精度的平均值

2019独角兽企业重金招聘Python工程师标准>>> 判断三角形为等边三角形、等腰三角形或不等边三角形 #!/bin/bash #https://www.hackerrank.com/challenges/bash-tutorials---more-on-conditionals/problem read a read b read c if [[ $a -eq $b && $b -eq …