Nginx学习之配备RTMP模块搭建推流服务

写在伊始

小程序升级实时音视频录制及广播能力,开放 Wi-Fi、NFC(HCE)
等硬件连接功能。同时提供按需加载、自定义组件和越来越多访问层级等新特征,增强了第三方平台的力量,以满意日益丰盛的事情须要。

为更飞速地延续用户与信用社,小程序提供了实时音摄像录制及广播组件。符合类目须要的小程序自助开通后,可自建或选取云服务,已毕单向、双向甚至多向的音摄像效能,如在线授课、远程咨询、视频客服,以及多个人集会等。

2017-12-26微信小程序推送了那样一条音信,文档,代码也是概括的一笔带过,用户要求自建或行使云服务,已毕单向、双向甚至多向的音摄像功用。近日仅援助flv, rtmp 格式。

本篇博客通过介绍使用nginx的rtmp模块来使nginx服务支撑rtmp协议,可以成功推流和播发的成效。

DDD理论学习系列——案例及目录

付出环境

Linux (centos7),Nginx (openresty),nginx-rtmp-module


安装

由于事先已经安装过了openresty,详见博文。那里大家只须求设置nginx-rtmp-module模块即可。

下载并解压模块:

wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip  master.zip

停下原来的Nginx服务:

nginx -s stop

布署并编制:

./configure --add-module=/home/nginx-rtmp-module-master
make

复制Nginx:

## 路径根据自己软件路径自行配置
cp /home/openresty/build/nginx-1.11.2/objs/nginx /usr/local/openresty/nginx/sbin

配置rtmp服务:

rtmp {                #RTMP服务
    server {
       listen 1935;  #//服务端口
       chunk_size 4096;   #//数据传输块的大小
       application vod {
           play /opt/video; #//视频文件存放位置。
       }
       application live{ #直播
           live on;
       }
   }
}

反省并启动服务:

nginx -t
nginx

1. 引言

Module,即模块,是指提供一定功用的相对独立的单元。提到模块,你肯定就会想到模块化设计思想,也就是效益的表达和构成。对于简易难点,可以一向创设单一模块的程序。而对于复杂难点,则足以先创立若干个较小的模块,然后将它们组装、链接在一道,从而构成复杂的软件系统。

在DDD中,模块的用处也是那样,通过分解领域模型为不一致的模块,以减低领域模型的复杂,进步世界模型的可读性。

播放

上传一个摄像文件test.flv至/opt/video目录。

下载一个VLC media
player,工具栏-媒体-打开网络串流-网络,然后偶输入互联网URL(rtmp://ip:port/vod/test.flv),点击播放。

图片 1

2. DDD中的模块

模块是一个暧昧的定义,相比较广泛,为了科学发挥模块的威力,通晓模块的概念就老大主要。上面大家从切实的难题初阶,来尝试表明模块的定义。

哪些对在线商城的买主举办建模?

对此顾客来说,一般要求尊敬消费者的个人音信、收货地址、支付方式。那个信息是环环相扣相关的,不可独立存在。大家得以抽象出多个简单的集合CustomerAddressBook
Wallet。那这几个类该怎么存放呢?是为每一个会面创制一个文件夹存放依旧放在同一个文书夹?我想答案昭昭。
这四个会聚就是一个模块,一个客户模块。通过定义一个Customer文本夹,来将相关联的小圈子对象组合起来。而这些文件夹展现在C#中就是命名空间的概念。
图片 2

再来看一个难点,怎样规划在线商城的支付作用?

付出是在线商城中那么些重中之重的一个环节,设计的优劣直接影响项目标输赢。一般的话,针对于开发环节,大家应有单独置于支付子域中去处理,以尊崇世界的不变性,支付环节对应支付上下文,在付出上下文下,一些世界概念才能更明显。为了进步支付体验,大家一定要帮助五种开销办法,比如支付宝支付、微信支付、其余银行卡支付。在连接某一种支付办法时,大家就应当为其定义单独的模块,保险支付办法的独立性。同样,大家可以采纳经过命名空间来促成模块化,也可以接近NopCommerce制造单独的花色来插件化开发集成每一种支付方式。同样,我们也足以将全体支付作用拧出一个独立的支出模块,以便在其它序列中开展公共。

怎么着集成第三方SDK?

咱俩精晓开源的一大便宜是,大牛们分享了一多级高效、实用库或软件,也就是豪门常说的“轮子”,比如Hangfire、RabbitMQ、Dapper、Redis等等,大家得以从来开箱即用。但只要项目中融为一体很多的第三方SDK,假如不加以社团整理,项目的构培养会比较混乱,代码的可读性就大大下跌。那些时候我们就足以考虑模块化的去集成第三方SDK,通过对第三方SDK的再封装,来宏观代码的集体结构,以高达项目中的统一调用。Abp框架就是通过那种措施来集成相比较盛行第三方SDK。

图片 3

经过上述的举例表明,大家可以看来模块可大可小,每个模块都是对峙独立的效率单元。在C#中大家可以用命名空间或单独的档次来贯彻模块。通过模块来公司和包裹相关概念,来表明领域模型,以简化领域模型的繁杂。

但并非将模块与子域和边界上下文混淆。在千丝万缕的园地模型中,为了对世界模型中举行规范建模,要求将世界模型拆分成七个子域,每个子域对应一个或多少个边界上下文。在边际上下文中,可以将限界上下文中切实的领域概念分解成不相同的模块。所以,从子域到分界上下文再到模块,应该是逐一包含关系。
图片 4

回看

实时重放视频服务器的安排:

events {
    use epoll;# 选择epoll模型可以达到最佳的IO性能
    worker_connections  1024;
}

rtmp {                #RTMP服务
    server {
       listen 1935;  #//服务端口
       chunk_size 4096;   #//数据传输块的大小
       application vod {
           play /opt/video; #//视频文件存放位置。
       }
       application live{ #直播
           live on;
           hls on; #这个参数把直播服务器改造成实时回放服务器。
           wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
           hls_path /opt/video/hls; #切片视频文件存放位置。
           hls_fragment  600s;     #设置HLS片段长度。
           hls_playlist_length 10m;  #设置HLS播放列表长度,这里设置的是10分钟。
           hls_continuous on; #连续模式。
           hls_cleanup on;    #对多余的切片进行删除。
           hls_nested on;     #嵌套模式。
       }
   }
}

HTTP服务:

server {
        listen       80;
        server_name  rtmp.52itstyle.com;

        location /stat {
          rtmp_stat all;
           rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /home/nginx-rtmp-module-master/;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /live {  #这里也是需要添加的字段。
            types {  
               application/vnd.apple.mpegurl m3u8;  
               video/mp2t ts;  
            }
            alias /opt/video/hls;
            expires -1;
            add_header Cache-Control no-cache; 
            add_header Access-Control-Allow-Origin *;
        }  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

3. 模块设计的规格

模块的规划是按照领域模型的,要吻合通用语言的抒发。其次,模块的设计要适合高内聚低耦合的布署思想。

微信推流

<live-pusher webviewId="push" url="rtmp://ip:port/live/itstyle" 
    mode="HD" 
    autopush ="true"
    bindstatechange="statechange" 
    beauty = "10"
    whiteness="10"
    style="width: 300px; height: 225px;" />

手机打开小程序页面,进行视频推流服务,稍后我们会在/opt/video/hls/itstyle
目录下发现有的ts文件和index.m3u8文件。

留意 url中的itstyle能够不管定义,相当于一个房间标识。

3.1. 根据世界来协会模块

模块应该由世界的定义来公司,而不是依照通用的零部件类型和方式来创设模块。若是将具备的聚集、服务、工厂分别位居独立的模块中,就会恰恰相反DDD的安插基准,同时还会限制我们创制富有行为的天地模型。那样设计的模块的关怀点是在近期的零件和方式上,而不是在天地上。每个模块都应当有适量的类来建模领域的一定地方的概念和效益。

PC推流

PC 直播是在 PC(windows/mac)上敬重安装的推流软件 OBS(推荐)或者 XSplit
向RTMP摄像云的推流地址,推送经过压缩编码现场活动、教学、投影或者游戏等镜头,同时观众可以通过和推流地址相对应的播音地址收看实时画面。

图片 5

PC 直播流程相当不难,主要步骤:

  • 由此RTMP自定义一个推流地址,解决往哪推流的标题;
  • 动用第三方的推流软件,设置推流音摄像源以及编码参数,解决推什么内容的难题;
  • 观众就足以采纳大家提供的 RTMP DEMO
    通过设置播放地址即可举办探望,解决内容触达到观众那里的标题。

图片 6

推荐阅读:其三方推流工具使用指南

3.2. 根据通用语言

品种中的通用语言除了用于率领实体,值对象、领域服务和领域事件的的命名外,也适用于模块的命名。使用通用语言来为模块命名,能够清晰的浮现领域中的概念,且可以显然模块职务。例如,领域中地位验证的定义,大家就足以以Identity来定名那些模块。

推介的模块命名规范是:集团名称.项目名称.架构分层.限界上下文.组件类型
比如对腾讯微信产品的仇敌圈模块的园地层可以按以下方式命名:

Tencent.Weixin.Domain.Moment.Models 
Tencent.Weixin.Domain.Moment.Repositories
Tencent.Weixin.Domain.Moment.Services
Tencent.Weixin.Domain.Moment.Factories

说到此处,你恐怕会想到mvc的品类布局也是基于模块的沉思,比如Models、Views、Controllers、css、js都是位于独立的文本夹中,那实则也是关切点分离的思辨,通过模块的撤并来落成关切点分离。

Web播放

xiaozhibo.html:

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no">
        <title>小直播</title>
        <meta name="keywords" content="">
        <meta name="description" content="小直播——直播分享">
        <meta name="format-detection" content="telephone=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <meta name="msapplication-tap-highlight" content="no">
        <script src="//imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.2.1.js" charset="utf-8"></script>
    </head>
    <body>
        <div id="id_test_video" style="width:100%; height:auto;"></div>
        <script type="text/javascript">
           var player =  new TcPlayer('id_test_video', {
                "m3u8": "http://rtmp.52itstyle.com/live/itstyle002/index.m3u8",
                "autoplay" : true,//iOS下safari浏览器,以及大部分移动端浏览器是不开放视频自动播放这个能力的
                "coverpic" : "https://blog.52itstyle.com/usr/uploads/2017/12/2652725976.jpg",
                "width" :  '480',//视频的显示宽度,请尽量使用视频分辨率宽度
                "height" : '320'//视频的显示高度,请尽量使用视频分辨率高度
            });
        </script>
    </body>
</html>

跨域难题crossdomain.xml放置在网站根目录:

<cross-domain-policy>
  <allow-access-from domain="*.qq.com" secure="false"/>
</cross-domain-policy>

测试访问地址:http://rtmp.52itstyle.com/xiaozhibo.html

参考文档:

http://www.cnblogs.com/zx-admin/p/5783523.html

https://cloud.tencent.com/document/product/267

https://github.com/arut/nginx-rtmp-module/wiki/Directives#rtmp

作者: 小柒

出处: https://blog.52itstyle.com

分享是喜欢的,也见证了个人成长历程,文章大都都是办事经验总计以及平常上学积累,基于自身认知不足之处在所难免,也请我们指正,共同进步。

3.3. 高内聚低耦合

高内聚低耦合是模块设计的要害思想,模块内高内聚,模块间低耦合。
一个完好无缺的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让种种模块,尽可能的单独完结某个特定的子功用。模块与模块之间的接口,尽量的少而简易。如若某多个模块间的涉嫌相比复杂的话,最好第一考虑越来越的模块划分,那样便于修改和重组。

4. 总结

模块是对世界模型进行表明后的产物,是相对独立的成效单元,由一层层高内聚的小圈子对象组成,相对聚合、实体和值对象的话是更高一层的抽象。

模块化的思念大大简化了世界模型的复杂性,即便于大家统筹出高内聚低耦合的系统,也方便我们明白系统的设计。

而有关模块的落到实处,大家既可以由此命名空间来进行分离,也可以使用单独的体系来兑现。

参考资料

What are Modules in Domain Driven
Design?