Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Nginx-RTMP 搭建简单的流媒体服务器

使用 Nginx-RTMP 搭建简单的流媒体服务器

原创
作者头像
青橙.
修改于 2023-02-02 10:45:37
修改于 2023-02-02 10:45:37
8.4K0
举报
文章被收录于专栏:橙、橙、

安装

有的时候会遇到类似的场景:

  • 需要分享屏幕(仅仅是屏幕分享)给小伙伴,也许希望分析的是工作软件、视频甚至游戏,在尝试了 市面上能找到的几乎全部的屏幕分享、在线会议工具后发现流畅和清晰不可兼得,而且往往既不流畅也不清晰;
  • 需要转发其他来源的流媒体,例如有选择低转发不具有外网访问能力的摄像头的流数据,或者部分设 备不支持需要的流媒体格式,需要进行转码;

这时候就会思考,有没有能既清晰又流畅的进行屏幕、视频流的分享呢?很显然直播满足了这一系列条件。所以这里有这么些解决方案:

  1. 使用第三方直播平台进行直播
  2. 选择现有的直播服务(如腾讯云的 标准直播 LVB )
  3. 如果手上有闲置的服务器,可以使用自己的服务器进行推流

前两种方案都很简单,三方直播平台开播也很容易,现有的直播服务价格相比按量计费的服务器来说并不贵。

本文讨论最后一种情况,有自己的服务器,希望利用它实现简单的直播推流。

环境

部署的环境选择往往会决定最终的使用体验,本次使用了 Lighthouse 轻量应用服务器中国大陆数据中心的服务器进行,目前在售的最低配置提供了 2 虚拟 CPU, 2 GB 内存和 4 MB 下行带宽。

通常来说,该配置的 CPU 和内存是足够了,带宽取决于希望分享的内容和同时拉流的人数。

如果使用 4000 KBps 码率的直播推流,不进行码率转换和压缩,则可以供另外一个小伙伴进行观看,若使用 2000 KBps 码率进行直播推流,

需要多高的码率和内容、编码方式有较大关联,举个例子顺带吐槽一下 该视频 提供的 “1080P 高码率” 的码率仅仅只有 1000 KBps,其中视频码率只有 825 KBps,大家看的不也很开心吗(

总之,本文使用下配置环境进行配置:

  1. 腾讯云 Lighthouse 广州 bundle2022_gen_01(2 核 2 G 内存 4 M 带宽 300 G 流量 )
  2. 操作系统:Ubuntu 22.04

快速安装

通过网络搜索 Nginx-RTMP,可以获得大量的编译安装的说明,不过其实目前来说并不需要在这么麻烦,直接利用 apt 包管理器就可以了,通过 search 找到需要安装的软件包:

apt search nginx rtmp 结果
apt search nginx rtmp 结果

安装 Nginx 和 Nginx-RTMP,为了方便转码,再额外安装 ffmpeg

代码语言:shell
AI代码解释
复制
# 更新软件源
apt update
# apt upgrade -y

# 安装
apt install nginx libnginx-mod-rtmp -y

# ffmpeg (如需转码)
apt install ffmpeg -y

配置

在 GitHub 上查看项目

配置文件

Nginx-RTMP 的配置需写在 nginx.conf 文件中,当前环境下位于 /etc/nginx/nginx.conf

大部分配置在该配置文件中新建 rtmp 模块并写入,少部分配置需要写入该配置文件的 http 模块中。

完整配置参考:https://github.com/arut/nginx-rtmp-module/wiki/Directives

配置示例

视频点播服务

代码语言:json
AI代码解释
复制
rtmp {
    server {
        listen 1935;
        application vod {
            play /var/document/vedios;
        }
    }
}

直播

代码语言:json
AI代码解释
复制
rtmp {
    server {
        listen 1935;
        application live {
            live on;
        }
    }
}

该配置下,推流地址为 rtmp://IP_ OR_DOMAIN/live/,当使用 live 为推流码进行推流时,播放地址为 rtmp://IP_ OR_DOMAIN/live/live

转发流

代码语言:json
AI代码解释
复制
rtmp {
 server{
     listen 1935;
     chunk_size 4096;
     application live {
           live on;
           record off;
           push rtmp://target;
          }
    }
} 

设置不同码率限制或转码

利用 ffmpeg 可进行转码操作

代码语言:json
AI代码解释
复制
rtmp {
    server {
        listen 1935;
    
        application src {
            live on;

            exec ffmpeg -i rtmp://localhost/src/$name
              -c:a aac -b:a 32k  -c:v libx264 -b:v 128K -f flv rtmp://localhost/hls/$name_low
              -c:a aac -b:a 64k  -c:v libx264 -b:v 256k -f flv rtmp://localhost/hls/$name_mid
              -c:a aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi;
        }

        application hls {
            live on;

            hls on;
            hls_path /tmp/hls;
            hls_nested on;

            hls_variant _low BANDWIDTH=160000;
            hls_variant _mid BANDWIDTH=320000;
            hls_variant _hi  BANDWIDTH=640000;
        }
    }
}

推流、播放

推流

推流可以使用 OBS、ffmpeg 等工具进行

注:x11grab 在新版的 ffmpeg 中已被移除,给出ffmpeg推流示例:

代码语言:shell
AI代码解释
复制
./ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264\_nvenc -qp 0 -acodec aac -f flv rtmp://IP_OR_DOMAIN:1935/live/live

播放

播放可以采用多种方式,如 ffplay、网页、第三方客户端(如 PotPlayer)等

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
发布于 2018-05-25 13:24 更新于 2018-06-02 01:26
walterlv
2018/09/18
1.5K0
Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
Java 中的屠龙之术:如何修改语法树?
来源:https://my.oschina.net/u/4030990/blog/3211858
程序员黄小斜
2021/11/24
1.2K0
[深入解析C#] 泛型
使用泛型(generic),可以编写在编译时类型安全的通用代码,无须事先知道要使用的具体类型,即可在不同位置表示相同类型。在引入之初,泛型主要用于集合。如今,泛型已经广泛应用于C#的各个领域,其中用得较多的有如下几项:
科控物联
2022/03/29
1.7K0
[深入解析C#] 泛型
C# 发展历史及版本新功能介绍
C# 1.0 版 回想起来,C# 1.0 版非常像 Java。 在 ECMA 制定的设计目标中,它旨在成为一种“简单、现代、面向对象的常规用途语言”。 当时,它和 Java 类似,说明已经实现了上述早
程序你好
2018/07/20
4.4K0
基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器 Analyzer 和修改器 CodeFixProvider
Roslyn 是 .NET 平台下十分强大的编译器,其提供的 API 也非常丰富好用。本文将基于 Roslyn 开发一个 C# 代码分析器,你不止可以将分析器作为 Visual Studio 代码分析和重构插件发布,还可以作为 NuGet 包发布。不管哪一种,都可以让我们编写的 C# 代码分析器工作起来并真正起到代码建议和重构的作用。
walterlv
2023/10/23
9300
基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器 Analyzer 和修改器 CodeFixProvider
Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
发布于 2018-03-18 12:45 更新于 2018-06-02 01:26
walterlv
2018/09/18
1.9K0
Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
Roslyn 节点的 Span 和 FullSpan 有什么区别 准备创建语法树访问语法树访问方法访问表达式不同
本文告诉大家在使用 Roslyn 分析代码时,使用的 Span 和 FullSpan 有什么区别
林德熙
2018/09/19
9230
Roslyn 节点的 Span 和  FullSpan 有什么区别
            准备创建语法树访问语法树访问方法访问表达式不同
在 Roslyn 分析语法树时添加条件编译符号的支持
我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。
walterlv
2020/01/21
1.1K0
在 Roslyn 分析语法树时添加条件编译符号的支持
抽象语法树(AST)全流程示例解析
以下以表达式 3 + 5 * 2 为例,贯穿从代码输入到最终应用的全流程,说明AST的核心概念和作用。
用户2755790
2025/05/12
3600
CSharp委托与匿名函数
面对事件处理,我们通常会通过定义某一个通用接口,在该接口中定义方法,然后在框架代码中,调用实现该接口的类实例的方法来实现函数的回调。可能这样来说有些抽象,那我们提供一个具体的情形来实现这一情形。
w4ngzhen
2023/10/16
2500
C++11——引入的新关键字
auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用。在C++11中被赋予了新的含义和作用,用于类型推断。
恋喵大鲤鱼
2018/08/03
1.5K0
生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型
发布于 2018-01-31 05:38 更新于 2018-05-25 12:33
walterlv
2018/09/18
1.5K0
生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型
.Net 编译器平台 --- Roslyn
最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码):
Niuery Diary
2023/10/22
4660
.Net 编译器平台 --- Roslyn
动手写编译器:手动构造语法树,驱动中间代码生成
在前面章节中我们给出了语法解析树对应节点的设计,这些节点能够针对其内容完成中间代码的输出,这一节我们继续完善必要节点的设计,然后手动构造语法树,并驱动语法树实现中间代码生成。
望月从良
2022/04/27
3820
动手写编译器:手动构造语法树,驱动中间代码生成
Go 泛型之泛型约束
虽然泛型是开发人员表达“通用代码”的一种重要方式,但这并不意味着所有泛型代码对所有类型都适用。更多的时候,我们需要对泛型函数的类型参数以及泛型函数中的实现代码设置限制。泛型函数调用者只能传递满足限制条件的类型实参,泛型函数内部也只能以类型参数允许的方式使用这些类型实参值。在 Go 泛型语法中,我们使用类型参数约束(type parameter constraint)(以下简称约束)来表达这种限制条件。
贾维斯Echo
2023/12/29
7270
Go 泛型之泛型约束
C#历代版本新特性——面试题常用
掌握一门语言,当然要掌握它的特性,而随着C#历代版本的迭代更替,C#语言也日趋完善,在C#2.0~C#4.0版本所带来的新的语法特性格外重要。C#的新特性,其本质都是“语法糖”,目的是提升开发效率,在编译时会被编译器转成原始语法。下面按照版本顺序依次介绍其中在日常开发中比较常用的部分。 C# 1.0 特性 第1个版本,编程语言最基础的特性。 Classes:面向对象特性,支持类类型 Structs:结构 Interfaces:接口 Events:事件 Properties:属性,类的成员,提供访问字段
李郑
2018/03/06
2K0
C++模板总结
模板(Template)指 C++ 程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如 STL 以及 IO Stream。模板是 C++ 支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
C语言与CPP编程
2021/12/10
1.3K0
C++模板总结
C#历来语法特性总结
C# 11已与.NET 7一起发布,本文按照.NET的发布顺序,根据微软官方文档整理C#中一些有趣的语法特性。
郑子铭
2023/09/19
6751
C#历来语法特性总结
【JDK1.8 新特性】方法引用,构造器引用
方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
CODER-V
2023/03/08
3220
.net题库第1-9章
第一章 单项选择题 第1题 C#程序的执行过程是( ) 从程序的Main方法开始,到最后一个方法结束 (答案) 从程序的第一个方法开始,到最后一个方法结束 从程序的Main方法开始,到Main方法结束 从程序的第一个方法开始,到Main方法结束 得分: 0.0 /10.0 第2题 C#语言源代码文件的后缀名为( )。 .csP .cs (答案) .C .C# 得分: 10.0 /10.0 第3题 下面对Write()和WriteLine()方法的描述,( )是正确的。 WriteLine()方法在输出字符串的后面添加换行符 (答案) 使用Write()和WriteLine()方法输出数值变量时,必须要先把数值变量转换成字符串 使用不带参数的WriteLine()方法时,将不会产生任何输出 使用Write()输出字符串时,光标将会位于字符串的下一行 得分: 10.0 /10.0 第4题 C#语言经编译后得到的是( )。 机器指令 Microsoft中间语言指令 (答案) 本机指令 汇编指令 得分: 10.0 /10.0 第5题 C#中导入某一命名空间的关键字是( )。 include import using (答案) use 得分: 10.0 /10.0 第6题 在C#中不可作为注释的选项是( ) ‘ (答案) /// /和/ // 得分: 10.0 /10.0 第7题 Console标准的输入设备是( )。 打印机 屏幕 键盘 (答案) 鼠标 得分: 10.0 /10.0 第8题 下面对Read()和ReadLine()方法的描述,( )是错误的。 ReadLine()方法读取的字符不包含回车和换行符 使用Read()方法读取的字符包含回车和换行符 (答案) 只有当用户按下Enter键时,Read()和ReadLine()方法才会返回 Read()方法一次只能从输入流中读取一个字符 得分: 0.0 /10.0 第9题 CLR是一种( )。 API编程接口 开发环境 运行环境 (答案) 程序设计语言 得分: 10.0 /10.0 第10题 下列( )选项不是.NET框架可以创建的应用程序类型。 Windows应用 Web服务 控制台应用 MIS系统 (答案)
用户8224910
2022/08/30
1.1K0
相关推荐
Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档