Live555 Streaming Media学习(一)——openRTSP分析

基于Live555与C++自研RTSP服务器:从协议原理到工程实践 RTSP(实时流媒体协议)是音视频传输领域的核心控制协议,负责建立、管理和终止媒体会话。其工作原理基于客户端-服务器模型,通过DESCRIBE、SETUP、PLAY、TEARDOWN等指令序列实现流媒体的点播与直播控制。该协议的技术价值在于为安防监控、视频会议、直播推流等场景提供了标准化的流媒体控制框架,实现了跨平台的互操作性。在应用层面,开发者常使用现成的流媒体服务器,但对于需要深度定制、嵌入式集成或底层协议学习的场景,自研服务器成为必要选择。本文聚焦于如何利用Live555这一开源C++库,从零构建一个 阅读详情

live555是一个开源的流媒体库,支持RTP/RTCP,RTSP,SIP。它提供了一套可供开发调用的库,同时还提供了很多例子,在testProgs文件夹下。开发人员只需要依葫芦画瓢,就可以写出自己的代码。要想学习live555的代码,最好也以这些例子为入口,去分析live555的代码结构。

本文就分析下openRTSP这个例子。在切入主题之前,有一些基础知识需要准备。

select()

select()是一个系统调用,它可以使进程检测同时等待多个I/O设备。当没有设备准备好时,select()阻塞,当任一设备准备好时,select()就返回。其中I/O设备以文件描述符来表示。它的调用形式:

#include<sys/select.h>

#include<sys/time.h>

intselect(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, conststruct timeval *timeout);

 

参数:

maxfd:文件描述符集中要被检测的比特数,这个值必须至少比待检测的最大文件描述符大1。

readfds:被读监控的文件描述符集。

writefds:被写监控的文件描述符集。

exceptfds:被例外条件监控的文件描述符集。

timeout:定时器,到了指定时间,无论是否有设备准备好,都返回调用。

 

timeout取不同的值,该调用就表现不同的性质:

1.    timeout为0,调用立即返回;

2.    timeout为NULL,select()调用就阻塞,直到有文件描述符就绪;

3.    timeout为正整数,就是一般的定时器。

select调用返回时,除了那些已经就绪的描述符外,select将清除readfds、writefds和exceptfds中的所有没有就绪的描述符。

select的返回值有如下情况:

1.正常情况下返回就绪的文件描述符个数;

2.经过了timeout时长后仍无设备准备好,返回值为0;

3.如果select被某个信号中断,它将返回-1并设置errno为EINTR。

4.如果出错,返回-1并设置相应的errno

 

上面多次提到文件描述符,socket也是可以用文件描述符来表示的,所以select才可以用在网络通信中,判断哪个socket准备好了,有数据可写或可读。所谓文件描述符集,故名思议,就是文件描述符的集合,但是他的元素却不是文件描述符。一个文件描述符(后面以fd代替)对应文件描述符集(后面以fdset代替)中的一位,0代表没有准备好,1代表准备好了。系统提供了四个宏对文件描述符集进行操作:

 

void FD_SET(int fd, fd_set *fdset); // 设置fd_set中对应fd的位(置为1)

void FD_CLR(int fd, fd_set *fdset); // 清除fd_set中对应fd的位(置为0)

void FD_ISSET(int fd, fd_set *fdset); //检测fd_set中对应fd的位是否被设置

void FD_ZERO(fd_set *fdset); // 设置所有位为0

 

到这里,select()的工作机制就好理解了。它等待fd_set中的某一位被置1,说明该位对应的socket可读(readfds被置位)or可写(writefds被置位)或出现异常(exceptfds被置位)。然后返回,用户就可以根据被置位的情况去做相应的处理。

REF:
http://hi.baidu.com/bimufo/item/139700e4d880cba1c00d755c

rtsp协议

RTSP是由Realnetwork 和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议。他是建立在其他传输协议之上的,它的流传输可能使用RTP协议,控制信息的传输可能使用RTCP协议。具体传输协议可以灵活设置,因为RTSP并不依赖具体的传输机制。

REF:
http://www.cnblogs.com/Jimmly/archive/2009/07/27/1531999.html

http://www.cnblogs.com/wyqfighting/archive/2013/01/24/2874958.html

live555:openRTSP

live555官网:http://www.live555.com/liveMedia/

live555代码包含以下几个库:

  Groupsock: 封装了网络接口和套接字,还封装了用于多播的接口。

  liveMedia:以”Medium”类为基类,完成了各种流媒体的编解码。

  UsageEnvironment&TaskScheduler: 提供了一套消息机制,用于分发事件,安排处理函数。

BasicUsageEnvironment:UsageEnvironment&TaskScheduler的实现类,使用select()来读取和处理事件,实现简单的控制台程序。

 

openRTSP是testProgs中一个例子,它从头到尾都是一个单线程。它的入口在playCommon::main()中 。它的流程:

1.       create BasicUsageEnvironmentand BasicTaskScheculer

2.       处理输入参数,初始化环境变量

3.       CreateClient

4.       调用continueAfterClientCreation1() à getOption()à sendOptionsCommand()à sendRequest()à 发送OPTIONS消息,把回调加到事件队列中,同时把对应的socket加到文集描述符集中。

5.       调用taskScheduler().doEventLoop(),进入消息循环。

6.       doEventLoop()的处理函数在singleStep()中,它调用select()进入阻塞,等待有socket准备好。一旦文件描述符集中有socket可读或者可写,就调用该socket对应的回调函数。在客户端开始接收视频流之前,所有的回调最终都是做了两件事a) sendRequest, b) 把回调加到事件对列中。之后又进入select()阻塞状态,等待下一个socket准备好。

整个事件驱动机制就是在doEventLoop()中完成的。在发完OPTIONS消息之后,客户端的流程是这样的:

1.       call getOption()to send OPTIONS request. Callback is continueAfterOPTIONS().

2.       Receive OPTIONSresponse, call  continueAfterOPTIONS().  This callback call getSDPDescribe() to send DESCRIBErequest.  Callback iscontinueAfterDESCRIBE().

3.       Receive DESCRIBEresponse, call continueAfterDESCRIBE() to create Media session and subsession.Then call setupStream(), send SETUP message to setup each subsession.  Callback is continueAfterSETUP().

4.       ReceiveSETUP response, call setupStream() again. If there’s subsession havn’t beensetup,  send SETUP message to setupanother subsession until there no subsession left.

5.       Then createoutput file(the sink) which will be used to save streaming data. CallStartPlayingSession() , send PLAY message. Callback is continueAfterPLAY().

6.       Recevie PLAYresponse, call continueAfterPLAY() to save streaming data, waiting for nextframe coming, call continueAfterPLAY…

基本流程就是遵循RTSP协议,发送OPTIONS消息,server端响应 à 发送DESCRIBE消息,server端响应  à  发送SETUP消息,server端响应  à  发送PLAY 消息,server端响应 à开始接收streaming data.

这里有几个问题比较不容易理解:

1.       一般的消息循环机制是一个线程处理queue中的消息,其他线程往queue里面发送消息。但是openRTSP中从头到尾都只有一个线程,所以他的消息机制有点特别。它使用select()等待有socket准备好,一旦有可读或者可写的socket,他不是把处理函数扔给其他线程去处理,而是自己去处理,处理完了之后,再回到select()去等待。由于RTSP协议的特点,允许这个消息机制正确运行,但是,如果客户端cpu的处理能力不够,这种机制很容易导致丢包现象的发生。

2.       一次singleStep()循环负责处理三种类型的事件,HandlerSet中的事件(通过BasicTaskScheduler::setBackgroundHandling()加入的),fTriggeredEventHandlers中的事件,以及DelayQueue中的事件。

 

Windows平台下的openRTSP工具实践指南 实时流协议(Real Time Streaming Protocol,RTSP)是一种网络控制协议,设计用于娱乐和通信系统来控制流媒体服务器。它允许客户端(如流媒体播放器)在流媒体服务器上建立、控制以及播放流媒体内容。openRTSP 是一个用于控制 RTSP 客户端的开源工具,它广泛应用于流媒体传输场景中。这一章节将详细介绍 openRTSP 的界面布局、操作概览以及其强大的功能特点。随着网络技术的发展,RTSP协议在流媒体领域的应用越来越广泛。 阅读详情

相关推荐

openRTSP 利用rtsp 得到摄像头的录像mp4文件

openRTSP 利用rtsp 得到摄像头的录像mp4文件 工程中有openRTSP的windows 重新 编译的exe

LIVE555再学习 -- OpenRTSP 源码分析

看了很多东西,感觉有点杂。源码分析部分也看了,讲的也就那样。现在有点不知道从哪讲起了。参看:nkmnkm的专栏-流媒体参看:smilestone322的专栏-live555

不积跬步,无以至千里 6796

openRTSP使用流程解析

详细介绍live555中openRTSP例子的一些具体细节,适合新人阅读。

openRTSP 使用

from :  1:  编译    (1):  ./genMakefiles           linux    (2):  make 2: 服务器环境     服务器端是一个支持RTSP server的H.264的摄像头; 3: 运行 openRTSP     ./openRTSP  -d  20   -f  20  -w 640

occupy8的专栏 5469

openRTSP.exe

windows下编译的live555命令行程序 代码是live.2010.07.29.tar.gz

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

LIVE555 Streaming Media简介和框架

Live555 简介 概述 •Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目 特点 •针对流媒体处理的C++库的集合 •跨平台:Unix, linux, Mac OS X, Windows, QNX and other POSIX-compliant systems •使用开源标准协议:RTP/RTCP, RTSP, SIP •用于音视频数据的流化、接收 •处理...

weixin_30915951的博客 169

华为开发岗暑期实习笔试(2025年4月16日)

第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需数据结构及相关操作较多。

csy031117的博客 3663

Darwin Streaming Server 并发测试

关于 DSS 的安装说明网络上有许多,

496

GitHub与GitLab中的Fork操作:从个人仓库到团队协作的完整指南

本文详细介绍了GitHub与GitLab中的Fork操作,从个人仓库到团队协作的完整指南。通过Fork操作,开发者可以在权限隔离的环境下自由实验,并通过合并请求机制保证代码质量。文章涵盖了Fork的具体步骤、本地开发环境配置、代码同步方法以及高级协作技巧,帮助团队高效管理代码仓库。

weixin_28829325的博客 306

DeFi核心协议代码解析

本文解析了DeFi两大核心协议Uniswap V2和Compound的智能合约架构与关键代码。Uniswap V2采用恒定乘积公式(x*y=k)实现自动做市,核心合约包括Factory、Pair和Router,具备流动性铸造、代币兑换和TWAP预言机功能。Compound借贷协议通过cToken合约管理存款和借款,采用动态利率模型和抵押率机制,包含资金利用率计算、清算触发等核心算法。两协议均采用模块化设计,通过智能合约实现去中心化金融服务的核心逻辑。

闲人编程的博客 935

openRTSP分析1

openrtsp是live555里面作为rtsp客户端的一个例子程序。默认是接收rtsp流并保存为文件,里面对多种格式进行了处理。网上也有很多对openrtsp的分析的文章,但是个人感觉都不是太详细,一般都只有个大概的流程。这里再给这个过程捋一捋。 主要是一些重要的线路,细节部分就不予讨论。 在playCommon.cpp中是从main开始执行的。 开始是 TaskScheduler

huguohu2006的专栏 1万+

Oracle EBS R12.2.X JSP部署、编译和配置相关操作。

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 背景 在某项目上,需要开发JSP相关程序,比如单点登陆、打印二维条码。当前把JSP部署编译以后,访问提示错误:Requested resource or page is not allowed in this site, 通过查SR发现Oracle EBS R12.2.X版本对客制化JSP进行权限控限,需要设置某些配置文件。 实例操作步骤 上传JSP文件 通常上传到$OA_HTML目录或其子目

陈显平的专栏-Oracle EBS 1912

流媒体-RTSP协议-live555学习-打开RTSP流(一)

文章目录live555源码编译安装LIVE555 Streaming Media[官网及说明](http://www.live555.com/liveMedia/)编译live555可执行文件及动态库库及可执行文件说明LiveMedia库UsageEnvironment库BasicUsageEnvironment库:GroupSock库MediaServer 服务器程序其他测试DemoRTSP协议解析打开HIKViso网络摄像头RTSP流SDP格式参考文献 live555源码编译安装 LIVE555 Str

bwangk的博客 1749

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码)

本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 103

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2811

流媒体Live555(五)——openRTSP流程分析

openRTSP是对RTSPClient的实现,与服务器对应的客户端功能 1、初始化 BasicTaskschedular::createNew() BasicUsageEnvironment::createNew() 解析输入streamURL ourClient= createClient(streamURL) \_ourRTSPClient = RTSPC

liuhongxian的专栏 1584

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

live555中openRTSP用法

openRTSP  A command-line RTSP client openRTSP是一个命令行程序,它可以用来打开,流化,接收并且录制指定的RTSP视频链接媒体流(如rtsp://开头的URL) (一个相关的程序“playSIP”可以用来播放或者录制一个SIP会话)   本文将要介绍如下内容     Basic operation  基本操作 Playing without rece...

weixin_34019929的博客 355

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OpenRTSP分析一

通过分析live库提供的例子程序OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注 意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协议只负责接收数据,而RTCP协议除了接收服务器的 消息之外,还要向服务器反馈。 A.        main函数流程 main(int argc,char *argv[]) { 1.

vishtvro的专栏 3937

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

live555之openRTSP-----流程分析

流程分析也可参照 http://blog.youkuaiyun.com/xu_fu/article/details/9318905 ,这篇博客的排版很清晰。 下面是我自己总结的内容:(我这个rtsp客户端实现结果,不是获取视频保存到本地文件,而是直接解码播放)int main(int argc,char *argv[]){ BasicTaskschedular::createNew(); Ba

sstya的专栏 1335

简单完整的一个 rtsp 交互过程 live555-openRTSP

// rtsp D:\openRTSP rtsp://127.0.0.1/slamtv60.264 Opening connection to 127.0.0.1, port 554... ...remote connection opened Sending request: OPTIONS rtsp://127.0.0.1/slamtv60.264 RTSP/1.0 CSeq: 2

medal2004的专栏 1753

实时流媒体传输开源库——Live555

Live555(LiveMedia Libraries)是一个开源的多媒体流处理库,主要用于实现基于标准网络协议的实时流媒体传输。Live555提供了一套 C++ 类库,可以用于开发支持 RTP/RTCP、RTSP、SIP 等协议的流媒体服务器和客户端应用程序。它广泛用于视频监控、视频会议、音视频直播等流媒体传输领域。

qq_42241500的博客 2758

live555客户端程序openrtsp程序流程详细分析

程序从rtsp_player_task 这个线程开始进入进入到 live555 的客户端。 1: char *argv[5]={"openRTSP", "-b", "80000", "-t", ""}; 这是输入参数。 b 代表 FileSink 的大小具体值为 80000. T 代表用 tcp   run_live_rtsp(int argc, char **argv)  这个函数来处理

vishtvro的专栏 2568

live555 分析—— OpenRtsp

通过分析live库提供的例子程序 OpenRTSP,可以清晰地了解客户端接收来自网络上媒体数据的过程。注意,RTP协议和RTCP协议接收的数据分别是视音频数据和发送/接收状况的相关信息,其中,RTP协议只负责接收数据,而RTCP协议除了接收服务器的 消息之外,还要向服务器反馈。 main函数流程 void main(int argc,char *argv[]) { 1. 创建BasicTaskS...

雷霄骅(leixiaohua1020)的专栏 980
上一篇: 我的2013
下一篇: Effective C++读书笔记——(一)Prefer consts, enums, and inlines to #defines
zhhx310
博客等级 码龄18年 2粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值