NGINX MPEG-TS Live Module & Dash JS

直播流程

  • 视频直播:采集、前处理、编码、传输、解码、渲染

  • 采集: 一般是由客户端(IOS、安卓、PC或其它工具,如OBS)完成的,iOS是比较简单的,Android则要做些机型适配工作,PC最麻烦各种奇葩摄像头驱动。

  • 前期处理: 主要是处理直播美颜,美颜算法需要用到GPU编程,需要懂图像处理算法的人,没有好的开源实现,要自己参考论文去研究。难点不在于美颜效果,而在于GPU占用和美颜效果之间找平衡。

  • 编码: 要采用硬编码,软编码720p完全没希望,勉强能编码也会导致CPU过热烫到摄像头。编码要在分辨率,帧率,码率,GOP等参数设计上找到最佳平衡点。

  • 传输: 一般交给了CDN服务商,如:阿里云、腾讯云。

  • 解码: 是对之前编码的操作,进行解码,在 web 里需要解码是hls。

  • 渲染: 主要用播放器来解决,web中常用到的播放器有video.js,更多:html5-dash-hls-rtmp

    下面是腾讯云直播方案的整个流程图:

    流媒体直播功能

  • 支持的直播流输入协议是

    • RTMP 用于拉取和发布的流

    • RTSP 为拉和宣布的流

    • 用于HTTP和UDP流的 MPEG-TS

    • SRT 用于听,拉和集合模式

    • UDT 用于听,拉和集合模式

    • HLS 为拉流

  • 单路路实时编码流传递(RTMP)

  • 多路实时编码流传递(RTMP)

环境搭建

  • 服务与模块

    • 1、Openresty下载

      https://openresty.org/download/openresty-1.11.2.3.tar.gz
    • 2、nginx-ts-module下载

      git clone https://github.com/arut/nginx-ts-module.git
    • 3、ffmpeg 下载安装

  • 动态编译安装

    • (1)nginx-rtmp-module下载

      git clone https://github.com/arut/nginx-rtmp-module.git

    • (2)和安装nginx-ts-module模块一样动态编译安装既可以,最后别忘记了的在配置文件load nginx-rtmp-module.so文件

    • (3)按照这个顺序:OBS => nginx-rtmp => nginx-ts推流,OBS也可以是别的网络推流设备

    • (4)通过以上我们可以不直接使用ffmpeg 去推流了,而是在Windows端口可以通过OBS很简单的去推流了

    • (5)使用VLC播放器测试,结果OK!

    • nginx.conf

      # vim /opt/openresty/nginx/conf/nginx.conferror_log  logs/error.log;pid        logs/nginx.pid;load_module "/opt/openresty/nginx/modules/ngx_http_ts_module.so"; # 加载模块events {}http {    server {        listen 8000;        location / {            root html;        }        location /publish/ {            ts;            ts_hls path=/var/media/hls segment=10s;            ts_dash path=/var/media/dash segment=10s;            client_max_body_size 0;        }        location /play/ {            add_header Cache-Control no-cache;            add_header 'Access-Control-Allow-Origin' '*' always;            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';            add_header 'Access-Control-Allow-Headers' 'Range';            types {                application/x-mpegURL m3u8;                application/dash+xml mpd;                video/MP2T ts;                video/mp4 mp4;            }            alias /var/media/;        }    }}
    • 流媒体存放文件夹建立

    • 1、Openresty环境配置

      apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential
    • 2、动态编译安装

      ./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module --add-dynamic-module=/root/nginx-ts-module...make -j4...sudo make install
    • 3、配置文件

      cd /var & makedir media  cd media & makedir hls & makedir dash
    • 4、FFmpeg推流

      ffmpeg -re -i rtmp://live.hkstv.hk.lxdns.com/live/hks -bsf:v h264_mp4toannexb -c copy -f mpegts http://127.0.0.1:8000/publish/sintel
    • 5、客户端播放

      <script src="http://cdn.dashjs.org/latest/dash.all.min.js"></script><style>    video {        width: 640px;        height: 360px;    }</style><div>    <video data-dashjs-player autoplay src="http://1127.0.0.1:8000/play/dash/sintel/index.mpd"         controls></video></div>
    • 6、如果不使用 ffmpeg 直接拉流到http://127.0.0.1:8000/publish/sintel 服务的解决方案?

    • 7、总结,一切顺利通过。

  • 通过SSL加密和公开HLS媒体的来源(HLS)

NGINX-RTMP-TS-DASH 直播方案

  • HLS、MPEG-DASH多路输入/输出流(HLS、MPEG-DASH)

  • 编译安装

    • 1、下载nginx-rtmp-module模块:

      git clone https://github.com/arut/nginx-rtmp-module.git
    • 2、配置 --with-http_xslt_module 时提示 the HTTP XSLT module requires the libxml2/libxslt libraries,安装以下:

      sudo apt-get install libxml2 libxml2-dev libxslt-devsudo apt-get install libgd2-xpm libgd2-xpm-dev
    • 3、通过configure命令生成Makefile文件,为下一步的编译做准备:

      ./configure --prefix=/opt/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module \ --with-http_stub_status_module --with-http_xslt_module --add-dynamic-module=/root/nginx-ts-module --add-dynamic-module=/root/nginx-rtmp-module
    • 4、如果报下面的错误

      platform: linux (linux)    you need to have ldconfig in your PATH env when enabling luajit.

      是因为找不到命令ldconfig, 这个命令一般是在/sbin/目录下的,所以先执行export PATH=$PATH:/sbin

    • 5、如果出现:./configure: error: the HTTP XSLT module requires the libxml2/libxslt 错误,安装以下:

      sudo apt-get install libxml2 libxml2-dev libxslt-dev
  • nginx.conf 配置

    # vim /opt/openresty/nginx/conf/nginx.confuser  www;worker_processes  1;error_log  logs/error.log;pid        logs/nginx.pid;load_module "/opt/openresty/nginx/modules/ngx_http_ts_module.so";load_module "/opt/openresty/nginx/modules/ngx_rtmp_module.so";events {    worker_connections  1024;}  http {     server {         listen 8000;          # This URL provides RTMP statistics in XML         location /stat {            rtmp_stat all;            rtmp_stat_stylesheet stat.xsl;         }          location /stat.xsl {            root html;         }          location /hls {             # Serve HLS fragments            add_header Cache-Control no-cache;            add_header 'Access-Control-Allow-Origin' '*' always;            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';            add_header 'Access-Control-Allow-Headers' 'Range';                    types {                application/vnd.apple.mpegurl m3u8;                video/mp2t ts;            }                    root /tmp;         }         location /dash {             # Serve DASH fragments             add_header Cache-Control no-cache;             add_header 'Access-Control-Allow-Origin' '*' always;             add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';             add_header 'Access-Control-Allow-Headers' 'Range';              types {                 application/dash+xml mpd;                 video/mp4 mp4;             }             root /tmp;         }     } } rtmp {     listen 1935;     chunk_size 4000;     idle_streams off;     ping 30s;     notify_method get;     server {         listen 1935;         chunk_size 4000;          drop_idle_publisher 10s;         idle_streams off;                 application live {             live on;         }          application hls {             live on;             hls on;             hls_path /tmp/hls;         }          # MPEG-DASH is similar to HLS         application dash {             live on;             dash on;             dash_path /tmp/dash;         }     } }
  • 拷贝xml文件:cp /root/nginx-rtmp-module/stat.xsl /opt/openresty/nginx/html

  • 流状态查看:http://127.0.0.1:8000/stat

  • OBS推流地址:rtmp://127.0.0.1/dash/123

  • VLC观看RTMP直播流:rtmp://127.0.0.1/dash/123

  • DASH格式HTTP播放

    <script src="http://cdn.dashjs.org/latest/dash.all.min.js"></script><style>    video {        width: 640px;        height: 360px;    }</style><div>    <video data-dashjs-player autoplay src="http://127.0.0.1:8000/dash/123.mpd" controls></video></div>
  • 功能特点
    支持RTMP、HTTP-FLV、HLS、HTML5等协议,面向Windows、iOS、Android等终端提供稳定流畅的视频直播、点播服务,支持微信直播和微信点播, 可部署在局域网和互联网,实现私有云和公有云应用,单设备高并发。

    • 多屏播放 支持Flash、HTML5播放,兼容Windows、Android、iOS、Mac等操作系统;

    • 转码、上传 转码、上传一体化设计,使视频资源转码后可立即面向互联网进行发布;

    • 嵌入、分享 上传视频后一键生成视频地址,以供用户分享、嵌入到网站、软件系统中;

    • 丰富接口 提供编程语言无关化的RESTful API接口,可以很简单的进行二次开发;

  • 强大的WEB管理系统
    采用业界优秀的流媒体框架模式设计,服务运行轻量、高效、稳定、可靠、易维护,是移动互联网时代贴近企业点播、直播需求的一款流媒体方案,可以形成一套完整的视频直播、录播解决方案,满足用户在各种行业场景的流媒体业务需求。

    • 1、视频上传

    • 2、点播管理

    • 3、直播流管理

    • 4、正在直播

    • 5、分享集成

    • 6、接口在线调试

  • 应用场景
    视频门户网站、会议活动现场直播、网络电视台、远程监控、在线实时课堂、 科研方向等。

(0)

相关推荐

  • 音视频开发——通信直播协议和视频推流丨RTMP-RTSP

    近年来直播已成为互联网行业的大热话题,直播答题.游戏直播.竞赛直播,抖音直播,直播教育等层出不穷,直播早已成为人们耳熟能详的技术.事实上直播的兴起不仅与新时代人们要求为自己代言的心理有关,同时也得益于 ...

  • SAP Spartacus 定义在app.module.ts里的providers依赖注入元数据何时得到处理

    我基于 SAP Spartacus library创建了一个自定义的Storefront实现.在其app.module.ts里,我采用自定义的MyCurrentProductService,去替换 S ...

  • NGINX MPEG-TS Live Module

    Features receives MPEG-TS over HTTP produces and manages live HLS produces and manages live MPEG-DAS ...

  • TS vs JS基础类型

    布尔值 ts:let isDone:boolean = false; js:var isDone = false; 数字 和JavaScript一样,TypeScript里的所有数字都是浮点数. 这些 ...

  • JS/TS 对数组中的对象按对象的值进行去重

    举个例子:对以下数组按 lastName 的值进行去重 let listData = [ { firstName: "Rick", lastName: "Sanchez& ...

  • JS/TS 对数组中的对象按相同值进行分组

    举个例子:对以下数组按 lastName 的值进行分组分类 const listData = [ { firstName: "Rick", lastName: "Sanc ...

  • 【课文 单词mp3】外研版九下Module 1

    对话音频: [对话翻译] 玲玲:欢迎归来,各位! 贝蒂:你好,玲玲!你的假期怎么样? 玲玲:还不错!我去看望了在河南省的祖父母.火车里挤满了人,我不得不站了3个多小时! 贝蒂:真倒霉.为什么在冬天旅行 ...

  • 【课文 单词mp3】外研版八下Module 10

    对话音频: [对话翻译] 陈欢:嗨,大家好.我是北京广播电台新闻部的主任. 玲玲:感谢您带我们参观 陈欢:不客气!现在,这边请.看那个红灯.当它亮时,表示我们 正在广播.在背景中我们应该避免制造任何噪 ...

  • 【课文 单词mp3】外研版八下Module 9

    对话音频: [对话翻译] 服务热线:你好,友谊服务热线.请问您是哪位? 玲玲:你好,我是玲玲. 服务热线:你好,玲玲!我可以为你做些什么? 玲玲:我和我最好的朋友之间有点问题.她叫-- 服务热线:不, ...

  • 【课文 单词mp3】外研版八下Module 8

    对话音频: [对话翻译] 玲玲:我们到了.欢迎来到北海公园. 托尼:哇!这里如此安静以至于我甚至能听见鸟儿在歌唱!我几乎不能相信我们在市中心. 玲玲:这个公园因为它的湖.桥和山上的古建筑而闻名.湖占据 ...