Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网页全终端视频流媒体播放器EasyPlayer之使用 nginx 和 rtmp 插件

网页全终端视频流媒体播放器EasyPlayer之使用 nginx 和 rtmp 插件

作者头像
EasyNVR
发布于 2020-05-20 15:10:51
发布于 2020-05-20 15:10:51
2.5K00
代码可运行
举报
文章被收录于专栏:EasyNVREasyNVR
运行总次数:0
代码可运行

使用 nginx 和 rtmp 模块 ,可以很容易地搭建一个视频直播和点播服务器出来。下面我们来看一下具体实施步骤:

1. 安装 nginx 和 rtmp 模块

有关 nginx 的编译和安装比较简单,这里就不介绍了,看参考文献。这里提示以下几点:

(1) 安装好 nginx 后,配置文件在这里:

/usr/local/nginx/conf/nginx.conf (2) 启动 nginx 的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo /usr/local/nginx/sbin/nginx -s stop
$ sudo /usr/local/nginx/sbin/nginx

2. 配置 nginx 视频直播和点播服务

先看一下完整的 nginx 配置文件里有关视频点播和直播的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		application live {
			live on;
			record off;
		}
		application live2 {
			live on;
			record off;
		}
		# video on demand
		application vod {
			play /var/flvs;
		}
		application vod_http {
			play http://192.168.31.185/vod;
		}
		application hls {
			live on;
			hls on;
			hls_path /tmp/hls;
		}
	}
}
# HTTP can be used for accessing RTMP stats
http {
    server {
	listen      8080;
	# This URL provides RTMP statistics in XML
	location /stat {
	    rtmp_stat all;
	    # Use this stylesheet to view XML as web page
	    # in browser
	    rtmp_stat_stylesheet stat.xsl;
	}
	location /stat.xsl {
	    # XML stylesheet to view RTMP stats.
	    # Copy stat.xsl wherever you want
	    # and put the full directory path here
	    root /path/to/stat.xsl/;
	}
	location /hls {
	    # Serve HLS fragments
	    types {
		application/vnd.apple.mpegurl m3u8;
		video/mp2t ts;
	    }
	    root /tmp;
	    add_header Cache-Control no-cache;
	}
	location /dash {
	    # Serve DASH fragments
	    root /tmp;
	    add_header Cache-Control no-cache;
	}
    }
}

现在来解释一下里面各行代码的含义。对于视频直播服务,如果需要支持多路流输入的话,很简单,在 nginx 配置文件里多配几个 Application 就只可以了,像下面这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
application live {
	live on;
	record off;
}
application live2 {
	live on;
	record off;
}

这样就可以通过下面的地址来推送直播流,其它观众端也可以通过下面的地址来访问直播流:

rtmp://192.168.31.185/live/test rtmp://192.168.31.185/live2/test 后面紧跟的 test 关键字,可以随便更换,只要你的推送流和访问流的地址一样就可以了。

rtmp 模块也可以直接支持 VOD 这种视频点播服务 ,只需要在配置文件里添加如下内容即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# video on demand
application vod {
    play /var/flvs;
}

application vod_http {
    play http://myserver.com/vod;
}

然后把一个 mp4 或是 flv 文件扔到 /var/flvs 目录下,对于 /var/flvs/dir/file.flv 这个视频文件,就可以通过下面的网址来访问了:

http://myserver.com/vod//dir/file.flv

这样直接在浏览器里就可以通过网页观看视频。对于 mp4 文件,也可以实现 VOD 服务,不过需要的是采用 H.264 和 AAC 格式编码的 mp4 文件。

3. HLS 直播流的配置

如果需要使用 HLS 来视频直播,可以直接像配置文件那样,写上下面这一段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
application hls {
        live on;
        hls on;
        hls_path /tmp/hls;
}

同时把后面有关 http 访问的内容写上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# HTTP can be used for accessing RTMP stats
http {
	server {
		listen	  8080;
		# This URL provides RTMP statistics in XML
		location /stat {
			rtmp_stat all;
			# Use this stylesheet to view XML as web page
			# in browser
			rtmp_stat_stylesheet stat.xsl;
		}
		location /stat.xsl {
			# XML stylesheet to view RTMP stats.
			# Copy stat.xsl wherever you want
			# and put the full directory path here
			root /path/to/stat.xsl/;
		}
		location /hls {
			# Serve HLS fragments
			types {
				application/vnd.apple.mpegurl m3u8;
				video/mp2t ts;
			}
			root /tmp;
			add_header Cache-Control no-cache;
		}
		location /dash {
			# Serve DASH fragments
			root /tmp;
			add_header Cache-Control no-cache;
		}
	}
}

配好以后,推流可以使用下面的地址:

rtmp://192.168.31.185/hls/movie movie 关键字可以任何替换。对于观众端来说,可以有几种播放方式:

(1) 用 rtmp:

rtmp://192.168.31.185/hls/movie (2) 用 hls 播放:

http://192.168.31.185:8080/hls/movie.m3u8 这样就可以看到主播端推出来的流。注意,如果使用 http 方式,则是监听的 8080 端口,这个是在配置文件里写的。

4. 网页播放器播放

在第二步里,除了可以直接在浏览器里打开网址来观看视频,还可以写一个网页,实现像优酷那样的视频点播业务。通过使用第三方的播放器,在网页里植入该播放器来实现这个功能,比如说使用 EasyPlayer播放器。

EasyPlayer是一款流媒体播放器系列项目, 支持RTSP、RTMP、HTTP、HLS、UDPRTP、File等多种流媒体协议播放、 支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放、 倍数播放等多种功能特性,核心基于ffmpeg,稳定、高效、可靠、可控。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
解析SwiftUI布局细节(一)
在前面的文章中谈了谈对SwiftUI的基本的认识,以及用我们最常见的TB+NA的方式搭建了一个很基本的场景来帮助认识了一下SwiftUI,具体的文章可以在SwiftUI分类部分查找,这篇我准备在写UI的时候从SwiftUI角度我们具体的应该怎样去做,或者说是用SwiftUI我们该从什么角度去解析一个页面。以及对SwiftUI里面的其中一些细节知识做一下分析总结。
Mr.RisingSun
2020/12/21
2.6K0
解析SwiftUI布局细节(一)
ViewBuilder 研究(上)—— 掌握 Result builders
作为一个严重依赖 SwiftUI 的开发者,同视图打交道是最平常不过的事情了。从第一次接触 SwiftUI 的声明式编程方式开始,我便喜欢上了这种写代码的感觉。但接触地越多,碰到的问题也越多。起初,我单纯地将很多问题称之为灵异现象,认为大概率是由于 SwiftUI 的不成熟导致的。随着不断地学习和探索,发现其中有相当部分的问题还是因为自己的认知不够所导致的,完全可以改善或避免。
东坡肘子
2022/07/28
3.2K0
ViewBuilder 研究(上)—— 掌握 Result builders
SwiftUI-自定义与扩展
在SwiftUI中,尽管Apple提供了大量现成的UI组件和样式,但在实际开发中,我们经常需要进行更灵活的控制和个性化设计。SwiftUI鼓励开发者通过“协议+组合”的方式自定义视图行为和样式,从而构建更加丰富和高度可复用的用户界面。本文将通过多个示例,介绍SwiftUI中几种常见的自定义方式,包括样式(Style)、视图修改器(ViewModifier)、自定义视图(Custom View)与视图扩展(View Extension),帮助你构建出更具辨识度的UI组件。
YungFan
2025/06/13
1230
SwiftUI-自定义与扩展
干货 | 关于SwiftUI,看这一篇就够了
梁启健,携程金融支付中心开发工程师,主要负责支付iOS端的开发与优化工作,喜欢研究大前端和跨平台技术。
携程技术
2019/09/23
12.4K0
干货 | 关于SwiftUI,看这一篇就够了
SwiftUI 布局 —— 尺寸( 下 )
在 上篇[3] 中,我们对 SwiftUI 布局过程中涉及的众多尺寸概念进行了说明。本篇中,我们将通过对视图修饰器 frame 和 offset 的仿制进一步加深对 SwiftUI 布局机制的理解,并通过一些示例展示在布局时需要注意的问题。
东坡肘子
2022/07/28
2.9K0
SwiftUI 布局 —— 尺寸( 下 )
SwiftUI 布局 —— 尺寸( 上 )
在 SwiftUI 中,尺寸这一布局中极为重要的概念,似乎变得有些神秘。无论是设置尺寸还是获取尺寸都不是那么地符合直觉。本文将从布局的角度入手,为你揭开盖在 SwiftUI 尺寸概念上面纱,了解并掌握 SwiftUI 中众多尺寸的含义与用法;并通过创建符合 Layout 协议的 frame 和 fixedSize 视图修饰器的复制品,让你对 SwiftUI 的布局机制有更加深入地理解。
东坡肘子
2022/07/28
5.2K0
SwiftUI 布局 —— 尺寸( 上 )
Swift 5.6到5.10新特性整理
当你编写涉及共享状态的代码时,如果你不确保这个共享状态在跨线程使用时是安全的,你就会在许多地方遇到数据竞争的问题。
小刀c
2024/04/03
2.6K0
Swift 5.6到5.10新特性整理
从用SwiftUI搭建项目说起
后续这个SwiftUI分类的文章全部都是针对SwiftUI的日常学习和理解写的,自己利用Swift写的第二个项目也顺利上线后续的需求也不是特着急,最近正好有空就利用这段时间补一下自己对SwiftUI的理解,这个过程当中正好把整个学习过程记录下来,方便自己查阅,也希望能给需要的同学一点点的帮助。由于自己还欠着RxSwift的帐,这次也是想着先放弃别的账务(欠的的确挺多的)先全心全意的把这两块的帐给补补,希望补上这笔账之后自己对Swift的理解也能上一个台阶,对Siwft的理解自认为还是感觉欠缺的,不算是真的深入的掌握,我对SwiftUI也是在学习当中,现在能查阅的关于SwiftUI的资料很多是需要收费的,遇到问题只能想办法努力解决,有写的不钟意的地方,希望多加指正!
Mr.RisingSun
2020/12/16
5K0
从用SwiftUI搭建项目说起
GeometryReader :好东西还是坏东西?
GeometryReader 自 SwiftUI 诞生之初就存在,它在许多场景中扮演着重要的角色。然而,从一开始就有开发者对其持负面态度,认为应尽量避免使用。特别是在最近几次 SwiftUI 更新中新增了一些可以替代 GeometryReader 的 API 后,这种观点进一步加强。本文将对 GeometryReader 的“常见问题”进行剖析,看看它是否真的如此不堪,以及那些被批评为“不符预期”的表现,是否其实是因为开发者的“预期”本身存在问题。
东坡肘子
2023/11/13
1.1K0
GeometryReader :好东西还是坏东西?
SwiftUI案例:天气
在工作区的项目文件夹下创建名为 SpriteFiles 的 Group 并在其中依次导入 RainFall.sks RainFallLanding.sks
DioxideCN
2022/08/05
5.2K0
SwiftUI案例:天气
SwiftUI 的动画机制
大多初学者都会在第一时间惊叹于 SwiftUI 轻松实现各种动画效果的能力,但经过一段时间的使用后,他们会发现 SwiftUI 的动画并非像表面上看起来那样容易驾驭。开发者经常需要面对:如何动、怎么动、什么能动、为什么不动、为什么这么动、如何不让它动等等困扰。对 SwiftUI 的动画处理逻辑了解的不够深入是造成上述困扰的主要原因。本文将尝试对 SwiftUI 的动画机制做以介绍,以帮助大家更好地学习、掌握 SwiftUI 的动画,制作出满意的交互效果。
东坡肘子
2022/07/28
15.4K0
SwiftUI 的动画机制
ObservableObject研究
我是在去年阅读王巍写的《SwiftUI 与 Combine 编程》才第一次接触到单一数据源这一概念的。
东坡肘子
2022/07/28
2.6K0
ObservableObject研究
高级 SwiftUI 动画 — Part 3:AnimatableModifier
之前的两篇文章animating paths 和 transform matrices 对 Animatable 协议使用做了介绍,今天这篇文章将为大家介绍 AnimatableModifier,使用它可以完成更多的动画工作。
Swift社区
2022/04/04
1.5K0
高级 SwiftUI 动画 — Part 3:AnimatableModifier
掌握 SwiftUI 的 task 修饰器
随着 Swift 5.5 引入了 async/await 特性,苹果也为 SwiftUI 添加了 task 视图修饰器,以方便开发者在视图中使用基于 async/await 的异步代码。本文将对 task 视图修饰器的特点、用法、注意事项等内容做以介绍,并提供了将其移植到老版本 SwiftUI 的方法。
东坡肘子
2022/08/10
3.9K0
掌握 SwiftUI 的 task 修饰器
Swift 5.4 新特性
Swift 5.4 带来了一些巨大的编译改进,包括表达式中具有错误的更好的代码完成和增量编译的大幅度提高。但是,它也增加了一些重要的新功能和改进,因此让我们在这里进行深入研究...
逆锋起笔
2021/03/17
1.8K0
在 SwiftUI 下定制手势
不同于众多的内置控件,SwiftUI 没有采用对 UIGestureRecognizer(或 NSGestureRecognizer)进行包装的形式,而是重构了自己的手势体系。SwiftUI 手势在某种程度上降低了使用门槛,但由于缺乏提供底层数据的 API,严重制约了开发者的深度定制能力。在 SwiftUI 下,我们无法拥有类似构建全新 UIGestureRecongnizer 的能力。所谓的自定义手势,其实只是对系统预置手势的重构而已。本文将通过几个示例,演示如何使用 SwiftUI 提供的原生手段定制所需手势。
东坡肘子
2022/07/28
3K0
在 SwiftUI 下定制手势
酷我音乐iOS小组件适配开发实践
本文来自TME腾讯音乐娱乐-酷我音乐团队,迈腾大队长投稿,本文仅作为个人学习记录使用,也欢迎在许可协议范围内转载或使用,请尊重版权并且保留原文链接,谢谢您的理解合作. 如果您觉得本文章对您能有帮助,您可以使用关注此公众号,感谢支持.
QQ音乐技术团队
2023/12/15
1.4K0
酷我音乐iOS小组件适配开发实践
Swift 5.4 新特性
在 UIKit 和 SwiftUI 中设置颜色时,无法直接通过.的方式进行颜色的书写,必须带上前缀UIColor或者Color,因为无法根据上下文进行成员推测,Swift 5.4 中改进了这个语法,可以省去前缀且支持链式调用。
YungFan
2021/05/18
1.1K0
如何判断 ScrollView、List 是否正在滚动中
判断一个可滚动控件( ScrollView、List )是否处于滚动状态在某些场景下具有重要的作用。比如在 SwipeCell[3] 中,需要在可滚动组件开始滚动时,自动关闭已经打开的侧滑菜单。遗憾的是,SwiftUI 并没有提供这方面的 API 。本文将介绍几种在 SwiftUI 中获取当前滚动状态的方法,每种方法都有各自的优势和局限性。
东坡肘子
2022/12/16
4.3K0
如何判断 ScrollView、List 是否正在滚动中
@State 研究
我在去年底使用了SwiftUI写了第一个 iOS app 健康笔记,这是我第一次接触响应式编程概念。在有了些基本的认识和尝试后,深深的被这种编程的思路所打动。不过,我在使用中也发现了一些奇怪的问题。我发现在视图(View)数量达到一定程度,随着数据量的增加,整个app的响应有些开始迟钝,变得有粘滞感、不跟手。app响应出现了问题一方面肯定和我的代码效率、数据结构设计欠佳有关;不过随着继续分析,发现其中也有很大部分原因来自于SwiftUI中所使用的响应式的实现方式。不恰当的使用,可能导致响应速度会随着数据量及View量的增加而大幅下降。通过一段时间的研究和分析,我打算用两篇文章来阐述这方面的问题,并尝试提供一个现阶段的使用思路。
东坡肘子
2022/07/28
3.3K0
@State 研究
相关推荐
解析SwiftUI布局细节(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验