目录
前段时间大概地学习了一下流媒体开源库Live555,今天给大家详细介绍一下Live555相关的一些内容,以供参考。

Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它使用了RTP/RTCP、RTSP、SIP开放标准协议,实现了标准流媒体传输。Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG,H.265,H.264,H.263 +,DV或JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。
使用Live555可以开发客户端拉取远端的音视频流(比如使用VLC播放远端的视频流),也可以开发提供音视频流资源的Live555流媒体服务器。Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer。当前盛行的网络直播,也大量地使用到了Live555的流媒体技术。
Live555的目录结构:

1)BasicUsageEnvironment
该目录中定义了UsageEnvironment类的基本实现(即子类),用于简单的控制台应用程序,利用select 实现事件获取和处理。这个库利用Unix 或者Windows 的控制台作为输入输出,可以用来开发简单的控制台应用程序。2)UsageEnvironment
该目录中定义了UsageEnvironment和TaskScheduler抽象类,用于调度延迟事件,为异步读取事件分配处理程序以及输出错误/警告消息。另外其中还有HashTable类定义了通用散列表的接口。3)groupsock
该目录是对网络接口的封装,用于收发数据包。groupsock 主要是面向多播数据的收发的,它也同时支持单播数据的收发。4)liveMedia
该目录中有一系列类,基类是Medium,这些类针对不同的流媒体类型和编码,这是Live555的核心部分。
5)testProgs
该目录实现一些使用BasicUsageEnvironment的简单程序来演示如何使用这些库开发应用程序。
6)proxyServer
是一个基于Live555的流媒体代理服务器,只要支持Onvif协议的摄像机都能接入,适用于将局域网内摄像机加入到代理服务器中从而提高对外服务性能同时,只需要开放默认554端口,可以有效保护内网摄像机安全。
7)WindowsAudioInputDevice
这是liveMedia库的AudioInputDevice抽象类的实现。这可以由Windows应用程序用于从输入设备读取PCM音频样本。
1)Source和Sink
Source是生产数据的对象,例如从RTP读取数据。MediaSource是所有Source的基类。
Sink是消费数据的对象,例如把接受到的数据存储到文件中。MediaSink是所有Sink的基类。
2)数据流
Source -> Source(filters) -> Sink
从其它Source 接收数据的source 也叫做filters。Module是一个filters或Sink,数据接收的终点是Sink 类,Sink 类实现对数据的处理是通过实现纯虚函数continuePlaying(),通常情况下,continuePlaying 调用getNextFrame 来为Source 设置数据缓冲区,处理数据的回调函数等。不通常的情况下调用processBuffer,从接下来的socket writable或incoming data处理数据。
3)基于liveMedia的应用程序的控制流程
基于liveMedia的应用程序是事件驱动的,使用如下方式的循环:
while(1)
{
//查找度网络句柄的列表和延迟队列,发现需要完成的任务;
//完成任务
}
对于每个sink,在进入这个循环之前,应用程序通常调用下面的方法来启动需要做的生成任务: SinkObject->startPlaying()。任何时候,一个Module 需要获取数据都通过调用刚好在它之前的那个Module 的getNextFrame() 方法。
RTSP(实时流媒体协议,Real Time Streaming Protocol),是由Real network 和Netscape共同提出的如何有效地在IP 网络上传输流媒体数据的应用层协议。
RTSP 提供一种可扩展的框架,使能够提供能控制的,按需传输实时数据,比如音频和视频文件。源数据可以包括现场数据的反馈和存贮的文件。rtsp 对流媒体提供了诸如暂停,快进等控制,而它本身并不传输数据,rtsp 作用相当于流媒体服务器的远程控制。传输数据可以通过传输层的tcp,udp协议,rtsp 也提供了基于rtp 传输机制的一些有效的方法。
RTSP 中常用方法有:OPTION 、DESCRIBE 、SETUP 、PLAY 和TEARDOWN 。
OPTION:目的是得到服务器提供的可用方法。服务器回应可用的方法,例如:
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE。
DESCRIBE:为了得到会话描述信息(具体见附录SDP格式)。
SETUP:客户端提醒服务器建立会话,并确定传输模式,其中Transport 参数设置了传输模式。
PLAY:播放请求。
TEARDOWN:关闭请求。
客户端和服务端简单的交互流程如下:

RTSPServer 类用于构建一个RTSP 服务器,该类同时在其内部定义了RTSPClientSession类,用于处理单独的客户会话。相关流程如下:
1)首先创建RTSP 服务器,在创建过程中,先建立Socket(ourSocket) 在TCP 的554 端口进行监听;
2)把连接处理函数句柄(RTSPServer::incomingConnectionHandler)和socket 句柄传给任务调度器(taskScheduler)。
3)任务调度器把socket 句柄放入后面select 调用中用到的socket 句柄集(fReadSet)中,同时将socket 句柄和incomingConnectionHandler 句柄关联起来。
4)主程序开始进入任务调度器的主循环(doEventLoop),在主循环中调用系统函数select 阻塞,等待网络连接。
5)RTSP 客户端输入(rtsp://192.168.2.20/live)连接服务器;
6)select 返回对应的scoket,进而根据前面保存的对应关系, 可找到对应处理函数句柄;
7)在incomingConnectionHandler 中创建RTSPClientSession,开始对这个客户端的会话进行处理。
RTSP 服务器收到客户端的DESCRIBE 请求后,根据请求URL(rtsp://192.168.2.20/1.mpg),找到对应的流媒体资源, 返回响应消息。live555中的ServerMediaSession 类用来处理会话中描述,它包含多个(音频或视频)的子会话描述(ServerMediaSubsession)。相关处理流程如下:
1)服务器收到请求,主循环中的select调用返回,根据socket 句柄找到对应的incomingRequestHandler;
2)进行消息的解析,如果发现请求是DESCRIBE 则进入handleCmd_DESCRIBE 函数;
3)根据客户端请求URL 的后缀(例如是.mpg), 调用成员函数DynamicRTSPServer::lookupServerMediaSession查找对应的流媒信息ServerMediaSession;
4)如果ServerMediaSession 不存在,但是本地存在live文件,则创建一个新的ServerMediaSession;
5)在创建ServerMediaSession 过程中,根据文件后缀.mpg,创建媒体MPEG-1or2的解复用器(MPEG1or2FileServerDemux);
6)由MPEG1or2FileServerDemux 创建一个子会话描述
MPEG1or2DemuxedServerMediaSubsession;
7)由ServerMediaSession 完成组装响应消息中的SDP 信息;
8)返回响应消息给客户端,完成DESCRIBE消息交互。
RTSPClientSession类, 用于处理单独的客户会话。其类成员函数handleCmd_SETUP()处理客户端的SETUP 请求。调用parseTransportHeader()对SETUP 请求的传输头解析,调用子会话(实现类OnDemandServerMediaSubsession)的getStreamParameters()函数获取流媒体发送传输参数。将这些参数组装成响应消息,返回给客户端。
获取发送传输参数的过程:
1)调用子会话( 具体实现类MPEG1or2DemuxedServerMediaSubsession) 的createNewStreamSource() 创建MPEG1or2VideoStreamFramer,选择发送传输参数;
2)并调用子会话的createNewRTPSink()创建MPEG1or2VideoRTPSink。同时将这些信息保存在StreamState 类对象中,用于记录流的状态。
客户端发送两个SETUP 请求,分别用于建立音频和视频的RTP 接收。PLAY 请求消息处理过程如下:
1)RTSPClientSession 类成员函数handleCmd_PLAY()处理客户端的播放请求。2)调用子会话的startStream(), 在一系列调用中的buildAndSendPacke 内部先设置RTP 包头;
3)内部再调用MultiFramedRTPSink::packFrame()填充编码帧数据;
4)packFrame 内部通过一系列繁琐调用,发送RTP 数据包;
5)计算下一个数据包发送时间,把MultiFramedRTPSink::sendNext()函数句柄传给任务调度器, 作为一个延时事件调度;
6)在主循环中, 当MultiFramedRTPSink::sendNext() 被调度时, 又开始调用MultiFramedRTPSink::buildAndSendPacket()开始新的发送数据过程,这样客户端可以源源不断的收到服务器传来的RTP 包了。
通过Live555的学习可以搭建简单的RTSP服务器和客户端播放器,理解Live555的基本流程和原理。本文只是简单的介绍,Live555的功能很强大,支持的协议很多,支持的多媒体流构建的视频播放器非常强大,值得相关开发人员去深入学习。
其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我目前正在试验ActionController::Live,但我不知道如何正确地测试它。在我的Controller中,我写了这个response.stream.write("event:#{event}\n")response.stream.write("data:#{post.to_json}\n\n")但是当我在rspec测试中检查对象时,我看到了这个(rdb:1)response.stream.instance_variable_get(:@buf)["event:event\n"]当我将“数据”写入流时,我不明白为什么它没有出现在数组中。当我删除第一个response.stre
问题你能用thin吗?与ActionController::Live实现服务器端事件(SSE)和长轮询?如果是,怎么办?上下文虽然标题是HowtogetRails4ActionController::LivestreamingworkingwithThinandRuby2?AndhowdoThinandPumascalewithlivestreaming?的重复,OP通过问两个问题混淆了水域,这个问题从未得到回答。许多其他帖子建议您可以使用thin对于服务器端事件(sse),如果您通过execthinstart--threaded启动它:DoesHerokusupportActionC
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭6年前。Improvethisquestion是否有任何用Ruby或Python编写的生产就绪的开源Twitter克隆?我对功能丰富的实现更感兴趣,而不仅仅是简单的Twitter消息(例如:API、FBconnect、通知等)谢谢!
目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装
文章目录写在前面1、下载与安装(windows)1.1、idea中配置gradle2、基础知识(Gradle6.9为例)2.1、Gradle脚本语法2.1.1、dependsOn2.1.2、创建动态任务2.1.3、增加任务行为2.1.4、参数2.1.5、Ant任务2.1.6、方法2.1.7、默认任务2.1.6、依赖任务的不同输出3、java项目中使用3.1、在已有项目中构建gradle3.2、在新建项目时构建gradle(idea)3.3、gradle项目目录结构3.4、build.gradle3.4.1、plugins3.4.2、repositories3.4.3、dependencies3