ubuntu部署srs流媒体服务

以下内容摘抄自官网地址:http://ossrs.net/lts/zh-cn/docs/v4/doc/getting-started-build

 

直播是SRS的典型场景,支持推直播流后多种观看方式。

下载源码,推荐用Ubuntu20:

git clone -b 4.0release http://gitee.com/ossrs/srs.git

编译,注意需要切换到srs/trunk目录:
cd srs/trunk
./configure
make

启动服务器:

./objs/srs -c conf/srs.conf

检查SRS是否成功启动,可以打开 http://localhost:8080/ ,或者执行命令:

# 查看SRS的状态
./etc/init.d/srs status

# 或者看SRS的日志
tail -n 30 -f ./objs/srs.log

例如,下面的命令显示SRS正在运行:

MB0:trunk $ ./etc/init.d/srs status
SRS(pid 90408) is running. [ OK ]

MB0:trunk $ tail -n 30 -f ./objs/srs.log
[2021-08-13 10:30:36.634][Trace][90408][12c97232] Hybrid cpu=0.00%,0MB, cid=1,1, timer=61,0,0, clock=0,22,25,0,0,0,0,1,0

使用 FFmpeg(点击下载) 或 OBS(点击下载) 推流:

ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream

Note: 实例文件./doc/source.flv在SRS的源代码目录中有。

打开下面的页面播放流(若SRS不在本机,请将localhost更换成服务器IP):

  • RTMP (by VLC): rtmp://localhost/live/livestream
  • H5(HTTP-FLV): http://localhost:8080/live/livestream.flv
  • H5(HLS): http://localhost:8080/live/livestream.m3u8

WebRTC​

SRS支持WebRTC,可以做会议或视频聊天。

下载源码,推荐用Ubuntu20:

git clone -b 4.0release http://gitee.com/ossrs/srs.git

编译,注意需要切换到srs/trunk目录:

cd srs/trunk
./configure
make

启动服务器:

CANDIDATE="192.168.1.10"
./objs/srs -c conf/srs.conf

Note: 请将IP换成你的SRS的IP地址。

Note: 请将CANDIDATE设置为服务器的外网地址,详细请阅读WebRTC: CANDIDATE。

检查SRS是否成功启动,可以打开 http://localhost:8080/ ,或者执行命令:

# 查看SRS的状态
./etc/init.d/srs status

# 或者看SRS的日志
tail -n 30 -f ./objs/srs.log

例如,下面的命令显示SRS正在运行:

MB0:trunk $ ./etc/init.d/srs status
SRS(pid 90408) is running. [ OK ]

MB0:trunk $ tail -n 30 -f ./objs/srs.log
[2021-08-13 10:30:36.634][Trace][90408][12c97232] Hybrid cpu=0.00%,0MB, cid=1,1, timer=61,0,0, clock=0,22,25,0,0,0,0,1,0

使用WebRTC推流到SRS:WebRTC: Publish

打开页面观看WebRTC流:WebRTC: Play

Note: 可以打开不同的页面,推拉不同的流,就可以实现视频聊天了。

WebRTC for Live Streaming​

SRS支持直播转WebRTC,推直播流,使用WebRTC观看。

下载源码,推荐用Ubuntu20:

git clone -b 4.0release http://gitee.com/ossrs/srs.git

编译,注意需要切换到srs/trunk目录:

cd srs/trunk
./configure
make

启动服务器:

CANDIDATE="192.168.1.10"
./objs/srs -c conf/rtmp2rtc.conf

Note: 请将IP换成你的SRS的IP地址。

Note: 请将CANDIDATE设置为服务器的外网地址,详细请阅读WebRTC: CANDIDATE。

Note: 注意如果RTMP转WebRTC流播放,必须使用配置文件rtmp2rtc.conf

使用 FFmpeg(点击下载) 或 OBS(点击下载) 推流:

ffmpeg -re -i ./doc/source.flv -c copy -f flv rtmp://localhost/live/livestream

Note: 实例文件./doc/source.flv在SRS的源代码目录中有。

打开下面的页面播放流(若SRS不在本机,请将localhost更换成服务器IP):

  • WebRTC: webrtc://localhost/live/livestream
  • H5(HTTP-FLV): http://localhost:8080/live/livestream.flv
  • H5(HLS): http://localhost:8080/live/livestream.m3u8

WebRTC using HTTPS​

若需要在非本机使用WebRTC,比如SRS运行在远程服务器,在笔记本或者手机上使用WebRTC,则需要开启HTTPS API。

下载源码,推荐用Ubuntu20:

git clone -b 4.0release http://gitee.com/ossrs/srs.git

编译,注意需要切换到srs/trunk目录:

cd srs/trunk
./configure
make

启动服务器:

CANDIDATE="192.168.1.10"
./objs/srs -c conf/http.rtc.conf

Note: 请将IP换成你的SRS的IP地址。

Note: 请将CANDIDATE设置为服务器的外网地址,详细请阅读WebRTC: CANDIDATE。

Remark: 请使用你的证书文件,代替上面配置中的key和cert,请参考 HTTPS API 以及 HTTPS Callback 以及 HTTPS Live Streaming, 当然了HTTPS的反向代理也能和SRS工作很好,比如Nginx代理到SRS。

使用WebRTC推流到SRS:WebRTC: Publish

打开页面观看WebRTC流:WebRTC: Play

注意:自签名证书,在空白处输入thisisunsafe(注意没空格)。

Note: 可以打开不同的页面,推拉不同的流,就可以实现视频聊天了。

本文转载于网络 如有侵权请联系删除

相关文章

  • 接口测试平台代码实现91: 全局请求头-6

    本节我们按照前面成功把公共请求头安装进接口库的方法,把其插入到多用例中。首先打开我们的多用例模块,看到现在的步骤详情页是这样的:我们打开P_cases.html,直接找到这个header后面的html,给它加上倒三角按钮。注意上图,因为要放在同一行,所以要缩短input的宽度给留出空间。图中的宽度高度都是我调过的,可以放心使用,效果如下: 然后我们去复制承载请求头的那个div放在下面:虽然它现在是none的我们看不到效果,但是我们继续去开发即可。现在我们在下面js的那一堆上加一个script,专门用来写公共请求头的:大家如果代码和我没有太大的变化,可以对照左侧的行标来确定位置。现在我们可以知道,这个用例库依然看不到任何请求头,那是因我们后端函数并没有给它返回这个请求头数据,所以我们去views.py中去增加:重启服务,刷新页面,看看效果:可以看到,点击了倒三角后,成功显示出来了项目当前的俩个请求头。接下来我们要处理的是,在选择/切换顶层的仓库接口的时候,下面请求头能跟得上更新。首先找到这个ready样子的,不用看,这就是监听。监听的什么事件?就是下面写的,id=apis的那个输入框的内

  • 成功开发了一个SaaS项目,技术栈是这样的

    作者|Anthony译者|王坤祥策划|万佳作为一名忠于内心的工程师,每当我看到一家公司发布有关它们技术栈的文章时,我都会泡一杯咖啡,坐下来耐心阅读,看看有没有新的发现。了解其他公司业务背后隐藏的一些技术十分有趣。就像娱乐八卦一样,只不过这是技术层面的探索。几个月前,我开始开发另一个SaaS,该项目经历无数次迭代。幸运的是,尽管项目仍处于早期阶段,但是很多网站已经对其进行了集成。作为一个自负盈亏的独立创业者,我相信正是由于专注于自动化,才让我能为来自80多个国家和地区的客户提供可靠服务,并且每周持续提供新功能。当我想要了解服务的运行情况或者其他方面的信息时,我会尝试利用我熟悉的工具。当然,我也明白,在一些特殊情况下这些工具并不会帮到我。现在,我简要地介绍下平时使用的一些工具。非常重要的一点是,虽然工具列表看起来很长,并且有一些是非常规且不常用的选项,但实际上我在基础架构上花费的时间很少,如果有的话,每个月平均下来也就是几个小时。还有一点就是个人推荐就像是开处方一样,我认为对我非常有用的一些工具,可能并不适合你。一定要考虑自己的实际情况,并利用好当下你熟悉的工具。1编程语言多年来,我学习和

  • Spring Cloud Alibaba 系列之 Sentinel @SentinelResource 注解

    1.1简介1.1.1概述  我们可以发现在之前的Sentinel资源名都是请求路径,我们可以使用@SentinelResource注解的value属性来自定义资源名称。第二个我们也发现我们没有写兜底方法,但是在违反Sentinel配置规则时,依然会有兜底方法,这个是Sentinel默认的。我们可以使用@SentinelResource注解的blockHandler属性来指定配置规则的兜底方法。第三个就是方法在抛出异常且未违反配置规则要求时,是不会熔断降级而是直接抛出异常,我们可以使用@SentinelResource注解的fallback属性来给异常加一个兜底方法。 1.1.2相关属性属性描述value资源名称,必需项(不能为空)blockHandler/blockHandlerClassblockHandler对应处理BlockException的函数名称,可选项。♞blockHandler函数访问范围需要是public;♞返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException。♞blockHandler函数默认需要和原方法

  • P1466 集合 Subset Sums 搜索+递推+背包三种做法

    题目描述 对于从1到N(1<=N<=39)的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3}和{1,2}这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的:{1,6,7}和{2,3,4,5}{注1+6+7=2+3+4+5} {2,5,7}和{1,3,4,6} {3,4,7}和{1,2,5,6} {1,2,4,7}和{3,5,6} 给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。程序不能预存结果直接输出(不能打表)。 输入输出格式 输入格式: 输入文件只有一行,且只有一个整数N输出格式: 输出划分方案总数,如果不存在则输出0。输入输出样例 输入样例#1: 7 输出样例#1: 4 说明 翻译来自NOCOWUSACO2.2先是搜索,已经确认了当大于28的时候就超时了,所以搜索算是一种方法,不过可以用搜索打表。然后是

  • 神器工具:新一代多系统启动 U 盘装机解决方案

    大家好,我是JackTian。在平时的工作中,比如我们需要重新安装一个windows操作系统,得通过第三方软件刻录镜像,随后将刻录好的镜像文件放置到U盘里面,通过启动设备并结合一些相关的配置进行以USB的方式启动。一个U盘里面往往只能制作成一个新系统的启动盘,当你要想增加其他系统时,只能通过重新刻录,每次都需要反复这样的操作,是非常花费时间的。那么,今天给大家推荐一种新的可启动USB的解决方案:多合一启动盘制作工具——Ventoy。什么是Ventoy?Ventoy是一个免费制作可启动U盘的开源工具,有了Ventoy就无需反复格式化U盘,只需把ISO文件拷贝到U盘里面就可以启动了,无需其他操作。可一次性拷贝多个不同类型的ISO文件,在启动Ventoy时,将显示一个菜单来进行选择,无差异支持LegacyBIOS和UEFI模式。Ventoy特点开源、使用简单、快速直接从ISO文件启动,无需解开支持Legacy+UEFI模式(UEFI模式支持安全启动)支持持久化支持直接启动WIM文件支持自动安装部署支持超过4GB的ISO文件支持保留ISO原始的启动菜单支持多种常见的操作系统(Windows、L

  • RPO漏洞深入剖析与利用

    简介PRO的全称为“RelativePathOverwrite”,也就是相对路径覆盖。利用浏览器和服务器对资源加载设置的差异,通过某些方法和技巧,在相对路径处,引入我们可控的js/css文件,甚至引入非js/css文件,并按照js/css的语法执行,从而实现攻击。Fuckthe“Shareyourmind”这是18-03-24强网杯的一道题,也是从这里开始接触RPO这个漏洞,以下简单介绍一下这道题的做法:首先就是一个登录界面简单测试后可以发现并没有SQL注入或者XSS漏洞,之后注册一个账号,登录进去。测试各个页面,还是没有发现SQL注入在做比赛的小伙伴可能会对以下这个页面很熟悉:没错,就是这个“脸上”写着“这里有FLAG”的页面,而且如果在Reports框里输入http://39.107.33.96:20000/<scriptsrc=http://VPSIP></script>,它真的会访问我们自己的VPS,结合第一个提示:再联想到i春秋的一篇文章通过反调PhantomJSXSSbot把XSS漏洞升级为SSRF/LFR惊不惊喜?意不意外?是不是感觉从此拿到FLA

  • Ian Goodfellow 生成对抗网络GAN论文解析

    原文:GenerativeAdversarialNets https://dzone.com/articles/generative-adversarial-nets-adit-deshpande-cs-unde 作者:AditDeshpande 编译:KK4SBB 欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.netYannLeCun大神曾经说过,“对抗训练是近些年来机器学习领域中最炫酷的想法”。没错,对抗训练已经在深度学习的圈子里掀起了不小的涟漪。本文将介绍三篇基于IanGoodfellow开创性工作https://arxiv.org/pdf/1406.2661v1.pdf论文。GAN简介笔者曾在一篇博文中简单提过IanGoodfellow的生成对抗网络论文https://arxiv.org/pdf/1406.2661v1.pdf,《九篇深度学习好文》https://adeshpande3.github.io/adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.

  • Python实现栈

    #!usr/bin/envpython #-*-coding:utf-8-*- """ @author:yzk13 @time:2018/04/19 栈 """ classStack(object): """ 栈 """ def__init__(self): """ 初始化 """ self.items=[] defis_empty(self): """ 栈是否为空 :return: """ returnself.items==[] defpeek(self): """ 返回栈顶元素 :return: """ returnself.items[-1] defsize(self): """ 返回栈的大小 :return: ""&quo

  • 钉钉H5w微应用鉴权

        1/////<summary> 2/////登录获取签名 3/////</summary> 4/////<paramname="url">获取的url</param> 5/////<returns>成功时,返回签名信息</returns>      //引用system.web 6publicsignResultObjectDDGetSign(stringurl) 7{ 8try 9{ 10StringjsTicket=get_jsapi_ticket(); 11if(jsTicket!="") 12{ 13Stringnoncestr=GetRandomString(20,true,true,true,false,""); 14StringjsUrl=HttpUtility.UrlDecode(url);//http://www.test.com/DDh5/index.html 15inttimeStamp=Convert.ToInt32((DateTime.UtcNow-newDa

  • The specified type member &#39;Date&#39; is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties

    出现这个错误提示可以用 DbFunctions.TruncateTime将Linq中entity的DateTime转化一下再使用,如下所示: varanyCalls=_db.CallLogs.Where(x=>DbFunctions.TruncateTime(x.DateTime)==callDateTime.Date).ToList();复制 更多详细解答请看如下链接: http://stackoverflow.com/questions/14601676/the-specified-type-member-date-is-not-supported-in-linq-to-entities-only-init    DatevsDateTime http://stackoverflow.com/questions/798121/date-vs-datetime   

  • 值类型和引用类型

    假如我有一份报纸,我觉得上面的新闻很好看,想让我朋友也看看,我就复印了一份给了他,就是值类型,他在报纸上的涂涂画画不会响应到我的报纸上 假如我做了个网站,我想让我朋友也能访问,就把网站地址给了他,这就是引用类型,我修改了网站之后的效果,也会响应到他看到的网站上 类class是引用类型, 结构struct是值类型, 数组是引用类型,(int[]) 枚举是值类型(enum) 委托和接口时引用类型 引用类型都在堆上,但是值类型不一定都在栈上(有特殊情况) 假如类里有个int型的实体变量,这个值就会和这个对象一直绑定在堆上面

  • shell 脚本 交互 expect

    zz https://www.cnblogs.com/lixigang/articles/4849527.html 一、概述        我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。       expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。 二、expect的安装 expect是在Tcl基础上创建起来的,所以在安装expect前我们应该先安装Tcl。 (一)Tcl安装 主页: http://www.tcl.tk下载地址: http:/

  • 安装和配置nginx

       修改配置文件后执行命令重新加载配置(根据自己的安装目录):   /usr/local/nginx/sbin/nginx-sreload #下载(root用户安装)wgethttp://nginx.org/download/nginx-1.16.1.tar.gz##解压 tar-zxvfnginx-1.16.1.tar.gz ##进入nginx目录 cdnginx-1.16.1 ##配置 ./configure--prefix=/usr/local/nginx #make make makeinstall复制 #cd到刚才配置的安装目录/usr/loca/nginx/./sbin/nginx-t#启动nginx复制 ./sbin/nginxstart外网访问http://ip:80验证是否启动成功如果不行的话可以添加防火墙端口开放复制 开端口命令:firewall-cmd--zone=public--add-port=80/tcp--permanent重启防火墙:systemctlrestartfirewalld.servic

  • 11月获得融资的区块链企业汇总

        11月,比特币跌破4000美元,币圈哀鸿一片,但是仍有不少优秀的区块链企业获得了投行的青睐,下面是千氪专栏作者链视界整理的11月获得融资的15个区块链企业,他们分别是:   项目名称:Propine   融资轮次:种子轮   融资金额:120万美元   项目介绍:Propine是一家新加坡区块链资产安全初创公司,对于基于区块链的数字资产而言,Propine扮演了一个托管人的角色,其离线解决方案允许客户在任何地方都能安全地授权交易,从而避免资产被黑客或恶意攻击者窃取。   投资机构:DecacornCapital(领投)、SGInnovate等      项目名称:BHex   融资轮次:战略融资   融资金额:1500万美元   项目介绍:BHex是一个金融级去中心化数字资产托管交易平台,基于自主研发的BlueHelix技术,为区块链代币交易用户提供资产的可信、托管清算等服务及业务、技术和监管能力,同时还通过虚拟券商模式服务于合作伙伴。   投资机构:GenesisCapital、OKExLabs、火币网      项目名称:AztecProtocol   融资轮次:

  • 2.3 连续型随机变量及其分布 + 2.4 正态分布

             

  • SpringBoot+Mybatis+Sharding-JDBC实现分库分表

      项目里面一直用Sharding-JDBC,今天整理一下,就当温故而知新了,也是稳固而知新了。 一、整体介绍 项目采用的框架是SpringBoot+Mybatis+Sharding-JDBC,采用的是properties的形式; 分为两个数据库sharding_0,sharding_1。每个库三个表,t_user_00,t_user_01,t_user_02; 分库策略:age%2=0的数据存储到sharding_0,为1的数据存储到sharding_1; 分表策略:user_id%3=0的数据存储到t_user_00,为1的数据存储到t_user_01,为2的数据存储到t_user_02; Sharding-JDBC官网 二、数据库文件   分别在sharding_0,sharding_1两个数据库中执行下列脚本。 SETNAMESutf8mb4; SETFOREIGN_KEY_CHECKS=0; ------------------------------ --Tablestructurefort_user_00 -----------------------------

  • EXCEL批量导入PowerDesigner

    背景公司需要我们把字段到powerdesigner中。于是我开始搜如何将数据库建表语句逆向导入到powerdesigner中,方法倒是有,需要连接oracle数据库。可是我本地还没配oracle环境。冥思苦想突然发现,原来前人早就有从excel批量导入powerdesigner的方法。 方案vbs脚本! 步骤 第一步:复制下面的代码,在桌面建一个txt文件,粘贴代码。 OptionExplicit PrivateCURRENT_MODEL_NAME PrivateCURRENT_MODEL PrivateTABLES PrivateEXCEL_APP PrivateFILE_PATH CURRENT_MODEL_NAME="model名" SetEXCEL_APP=CreateObject("Excel.Application") FILE_PATH="F:\xx\ZhuoMian\456.xlsx"'文件的绝对路径 'FILE_PATH="F:\xx\ZhuoMian\456.xlsx"'文件的绝对路径 '检查文件是否存在 IfCheckFileExsistence()Then

  • Leetcode: 旋转数组

    题目:给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。 示例1: 输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右旋转1步:[7,1,2,3,4,5,6]向右旋转2步:[6,7,1,2,3,4,5]向右旋转3步:[5,6,7,1,2,3,4] 示例2: 输入:nums=[-1,-100,3,99],k=2输出:[3,99,-1,-100]解释:向右旋转1步:[99,-1,-100,3]向右旋转2步:[3,99,-1,-100] 提示: 1<=nums.length<=2*104-231<=nums[i]<=231-10<=k<=105 思路:cur位置=(i+k)%nassign(),格式化数组元素为新元素。 voidrotate(vector<int>&nums,intk) { intn=nums.size(); vector<int>vec(n); for(inti=0;i<n;++i) { vec[(

  • ueditor1_4_3-utf8-net使用笔记

    1.下载下来 下载适合自己编码的下载包,比如我的网页编码是utf-8,加入用的是gbk编码在ueditor的工具栏里就会乱码。 2.将net里面的Newonsoft.Json.dll加载至bin里。 3.将dialogs>image>image.html的面的编码“<metacharset="UTF-8">”改成“<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/>”否则image.html乱码,会导致上传图片界面不显示。  此版本只支持.net4.0   -------------------------------------------------------------------------- 1.对于同一个ID控件多次解析成编辑器,应在下一次解析之前先注销原来的编辑器。 myDialog=$.dialog({ title:“demo”, content:$("#baiduEditor").html(), lock:true, opacity

  • 织梦CMS收费,现在还有什么新的CMS免费

    织梦CMS开始收费了,一般用免费的CMS很少,除非自己写页面,不用内容管理系统,做大量的单页面,看到一个方舱垃圾桶就是单页面的。 从界面上来说,界面简洁一目了然,比较符合现在的用户习惯,扁平化的设计还是比较吸引用户的。从功能上来说,MetInfo功能基本齐全,常用的内容管理、多语言等基本功能都配备了。从使用上来说,一些版块的设计不是很人性化,藏得比较深,所以在使用的过程中会经常找不到,比较花时间。不过熟悉之后就好很多了。整体来说相对让我觉得系统比较出色的应该就是SEO这块,可设置的内容还是比较多的,seo效果也比较明显。总的来说,简单的界面设计还是很适合新手的。 主要的缺点就是虽然说免费,但是有两个核心文件被加密了!MetInfo的代码结构比较混乱,代码书写不规范。 wordpress做个人博客是首选,做国内的企业站蝉知是首选。

  • Spring系列(四):Spring AOP详解

    一、AOP是什么   AOP(面向切面编程),可以说是一种编程思想,其中的SpringAOP和AspectJ都是现实了这种编程思想。相对OOP(面向过程编程)来说,提供了另外一种编程方式,对于OOP过程中产生的横切性问题,这些横切性与业务无关,可以通过预编译方式和运行期动态代理来实现。比如可以应用在:日志记录、性能监控、事务管理等。 二、AOP的基本概念   Aspect(切面):通常来说是一个类,里面定义了切点和通知,SpringAOP中可以用@AspectJ来标注这个类是切面;   Joinpoint(连接点):可以理解成目标对象中的方法,该方法是要被增强的方法,也就是我们要作用的一个切入点;   Pointcut(切点):切点可以理解成连接点的集合;   Targetobject(目标对象):被代理的对象,也就是目标对象;   AOPproxy(代理对象):把被代理的对象织入了增强后的对象;   Weaving(织入):把增强也就是代理逻辑加入到目标对象上的过程;   Advice(通知):用于指定在特定连接点上的增强的位置;     ① Beforeadvice(前置

相关推荐

推荐阅读