流媒体服务器之nginx的RTMP集成FFmpeg转码

简介:

1 理论知识

1.1 RTMP的简介

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。

1.2 集成FFmpeg目的

Nginx的RTMP模块提供的流媒体功能不足之处就是对很多媒体格式不支持,故需要借助FFmpeg功能来补充。

1.3 FFmpeg官方架构介绍

wKiom1kL9TnwcVK5AAFa9IKE2x8539.png

- 流媒体广播服务器(FFserver),对多个输入源进行转码、重映射、广播

- 输入源(FFmpeg),将音频或视频发送给流媒体播放器

- 媒体播放器

注:官方声明FFserver已经被放弃,本文将使用Nginx的RTMP模块代替

1.4 FFmpeg官方工作模型

wKioL1kMCDGSxk2oAAB6NBOK0v4281.png

- I(Input Sources)输入源,将音频或视频发送到流媒体服务器

- F(Feeds)馈送,接收输入的音频视频源,将单个输入源与多个输出流相关联

- S(Streams)流,为流媒体播放器提供链接点(频道),每个连接点可同时处理多个流媒体播放请求

- P(Media Players)媒体播放器

2 环境

2.1 环境信息

IP Address=10.168.0.51

HostName=rtmp.cmdschool.org

OS=CentOS 7.3

2.2 yum源配置

1
2
3
yum -y  install  gcc gcc-c++  make  expat-devel 
yum -y  install  rpm-build
yum -y  install  http: //download1 .rpmfusion.org /free/el/rpmfusion-free-release-7 .noarch.rpm

2.3 创建构建用户

useradd -u 1001 builder

2.4 关闭selinux

1
2
setenforce 0
sed  -i  's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config

3 构建rpm包部分

3.1 下载安装包

1
2
3
4
su  - builder
cd  ~
wget http: //nginx .org /packages/centos/7/SRPMS/nginx-1 .8.1-1.el7.ngx.src.rpm
wget -O nginx-rtmp-module-master.zip https: //codeload .github.com /arut/nginx-rtmp-module/zip/master

3.2 解压并测试构建环境

3.2.1 构建环境和测试

1
2
rpm -ivh nginx-1.8.1-1.el7.ngx.src.rpm
rpmbuild -bb rpmbuild /SPECS/nginx .spec

3.2.2 异常情况

如果看到类似提示:

1
2
3
4
5
6
7
8
9
warning: bogus  date  in  %changelog: Thu Aug  5 2014 Sergey Budnevitch <sb@nginx.com>
warning: bogus  date  in  %changelog: Thu Jul 12 2014 Sergey Budnevitch <sb@nginx.com>
warning: bogus  date  in  %changelog: Tue Jul 17 2013 Sergey Budnevitch <sb@nginx.com>
warning: bogus  date  in  %changelog: Tue May  6 2013 Sergey Budnevitch <sb@nginx.com>
warning: bogus  date  in  %changelog: Tue Aug 10 2011 Sergey Budnevitch
error: Failed build dependencies:
         openssl-devel >= 1.0.1 is needed by nginx-1:1.8.1-1.el7.centos.ngx.x86_64
         zlib-devel is needed by nginx-1:1.8.1-1.el7.centos.ngx.x86_64
         pcre-devel is needed by nginx-1:1.8.1-1.el7.centos.ngx.x86_64

请先决绝包的依赖关系然后重试:

1
2
exit
yum  install  -y openssl-devel zlib-devel pcre-devel

3.2.3 正常情况

如果末尾类似的提示表示构建环境测试通过或称重新打包完成:

1
2
3
4
5
umask  022
cd  /home/builder/rpmbuild/BUILD
cd  nginx-1.8.1
/bin/rm  -rf  /home/builder/rpmbuild/BUILDROOT/nginx-1 .8.1-1.el6.ngx.x86_64
exit  0

3.3 配置增加模块的源文件

1
2
3
4
unzip nginx-rtmp-module-master.zip
cp  -a nginx-rtmp-module-master nginx-rtmp-module
tar  zcvf nginx-rtmp-module. tar .gz nginx-rtmp-module
cp  nginx-rtmp-module. tar .gz rpmbuild /SOURCES/

3.4 修改构建文件

3.4.1 创建配置文件副本

1
cp  rpmbuild /SPECS/nginx .spec rpmbuild /SPECS/nginx .spec.default

3.4.2 修改配置文件参数

1
vim rpmbuild /SPECS/nginx .spec

修改如下参数:

1
2
3
4
5
6
7
8
9
10
11
Source10: nginx.suse.logrotate
Source11: nginx-rtmp-module. tar .gz
[..]
%setup -q
%setup -T -D -b 11
 
%build
[..]
         --add-module=.. /nginx-rtmp-module
                 $*
make  %{?_smp_mflags}

注:增加第2,5,9行

3.5 重新构建rpm包

1
2
rpmbuild -bb rpmbuild /SPECS/nginx .spec
exit

4 配置RTMP服务

4.1 安装nginx包

1
2
cd  /home/builder/rpmbuild/RPMS/x86_64/
yum -y  install  nginx-1.8.1-1.el7.centos.ngx.x86_64.rpm

注:以上包可拷贝到其他CentOS7.3的机器上安装

4.2 确认模块启用

1
nginx -V

显示如下:

1
2
3
4
5
nginx version: nginx /1 .8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix= /etc/nginx  --sbin-path= /usr/sbin/nginx  --conf-path= /etc/nginx/nginx .conf --error-log-path= /var/log/nginx/error .log --http-log-path= /var/log/nginx/access .log --pid-path= /var/run/nginx .pid --lock-path= /var/run/nginx .lock --http-client-body-temp-path= /var/cache/nginx/client_temp  --http-proxy-temp-path= /var/cache/nginx/proxy_temp  --http-fastcgi-temp-path= /var/cache/nginx/fastcgi_temp  --http-uwsgi-temp-path= /var/cache/nginx/uwsgi_temp  --http-scgi-temp-path= /var/cache/nginx/scgi_temp  --user=nginx --group=nginx --add-module=.. /nginx-rtmp-module  --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with- file -aio --with-ipv6 --with-http_spdy_module --with-cc-opt= '-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

可见配置的参数后面有加载模块:

1
--add-module=.. /nginx-rtmp-module

4.3 程序数据目录

1
2
3
mkdir  -p  /var/www/html
chown  nginx:nginx  /var/www/html
chmod  700  /var/www/html

4.4 创建配置文件

1
vim  /etc/nginx/nginx .conf

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
worker_processes 1;
 
events {
  worker_connections 1024;
}
 
rtmp {
   server {
     listen 1935;
     chunk_size 4096;
     application myapp {       # 定义一个频道myapp
       live on;
       play  /var/www/html ;    # 定义频道的根目录
     }
   }
}
 
http {
  server {
    listen 80;
    location  /stat  {            # 定义状态的访问URI
      rtmp_stat all;
      rtmp_stat_stylesheet stat.xsl;
    }
 
    location  /stat .xsl {        # 定义状态文件路径
      root  /var/www/html ;
    }
    
    location / {                # 定义播放器网页访问的URI和根目录
      root  /var/www/html ;
    }
    
  }
}

4.5 重启服务并配置服务默认启动

1
2
systemctl restart nginx
systemctl  enable  nginx

4.6 配置防火墙

1
2
3
4
firewall-cmd --permanent --add-port 1935 /tcp
firewall-cmd --permanent --add-service http
firewall-cmd --reload
firewall-cmd --list-all

4.7 上传测试文件

拍一个手机视频(MP4文件)上传到频道定义目录“/var/www/html”用于测试(笔者上传的是“1431308733062.mp4”)。

注:由于Nginx的rtmp模块一个简单的流媒体服务器,故对编码格式支持有限,他需要“ffmpeg”来补充。

5 客户端配置

5.1 下载客户端并解压

1
2
3
cd  /var/www/html
wget https: //ssl .p.jwpcdn.com /player/download/jwplayer-7 .10.7.zip
unzip jwplayer-7.10.7.zip

注:下载前要先在官网注册账号

5.2 使用代码加载播放器

1
vim  /var/www/html/index .html

输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
     < head >
         <script src= './jwplayer-7.10.7/jwplayer.js' >< /script >
         <script>jwplayer.key= '******XCUoBbOY0Xq+PLboip3jP7gEy4******==' ;< /script >
     < /head >
     <body>
         <div  id = "player" >Loading the player...< /div >
         <script>
             //  Setup the player
             const player = jwplayer( 'player' ).setup({
                 file 'rtmp://10.168.0.51/myapp/01'
              });
 
             //  Listen to an event
             player.on( 'pause' , (event) => {
                 alert( 'Why did my user pause their video instead of watching it?' );
             });
 
             //  Call the API
             const bumpIt = () => {
                 const vol = player.getVolume();
                 player.setVolume(vol + 10);
             }
             bumpIt();
         < /script >
     < /body >
< /html >

注:修改第3,4,11行,其中第3行是播放器的解压位置,第4行是播放器的SN,第11行是流媒体的绝对路径。

5.3 测试播放

1
http: //10 .168.0.51

wKioL1kJjPSgfaREAAQpdY6gWqU499.png

5.4 监视播放状态

1
http: //10 .168.0.51 /stat

wKioL1kJjQbwxBukAABEvsumakQ658.png

6 增加频道

6.1 修改配置文件

1
vim  /etc/nginx/nginx .conf

修改内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
worker_processes 1;
 
events {
  worker_connections 1024;
}
 
rtmp {
   server {
     listen 1935;
     chunk_size 4096;
     application myapp {       # 定义一个频道myapp
       live on;
       play  /var/www/html ;    # 定义频道的根目录
     }
     application myapp2 {       # 增加一个频道myapp2
       live on;
     }
   }
}
 
http {
  server {
    listen 80;
    location  /stat  {            # 定义状态的访问URI
      rtmp_stat all;
      rtmp_stat_stylesheet stat.xsl;
    }
 
    location  /stat .xsl {        # 定义状态文件路径
      root  /var/www/html ;
    }
    
    location / {                # 定义播放器网页访问的URI和根目录
      root  /var/www/html ;
    }
    
  }
}

6.2 重启服务并配置服务默认启动

1
systemctl restart nginx

7 配置FFmpeg

7.1 安装FFmpeg的包

1
yum -y  install  ffmpeg ffmpeg-devel

7.2 测试FFmpeg视频转换

1
ffmpeg -i 01. rm  01.mp4

注:请自行下载测试文件,如遇到如下错误:

1
The encoder  'aac'  is experimental but experimental codecs are not enabled, add  '-strict -2'  if  you want to use it.

可如此处理:

1
ffmpeg -i 01. rm  -strict -2 01.mp4

7.3 手动测试推送

1
ffmpeg -re -i  /var/www/html/1431308733062 .mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp: //127 .0.0.1:1935 /myapp2/01 ;



参阅资料

=====================================

RTMP参阅资料

-----------------------------------

http://nginx.org/en/docs/

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

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

https://github.com/jwplayer/jwplayer

http://www.tuicool.com/articles/iauQNr

http://www.cuplayer.com/player/PlayerCode/Nginx/2016/0509/2375.html

https://wenku.baidu.com/view/1bb9e587ad51f01dc381f13b.html

https://wenku.baidu.com/view/1bb9e587ad51f01dc381f13b.html

http://blog.sina.com.cn/s/blog_704836f40102wlmh.html

http://www.linuxidc.com/Linux/2015-08/121324.htm


FFmpeg参阅资料

----------------------------------

官方地址:

http://ffmpeg.org/


YUM源地址:

https://rpmfusion.org/

http://download1.rpmfusion.org/free/el/


FFmpeg的安装方法:

https://trac.ffmpeg.org/wiki/CompilationGuide

https://trac.ffmpeg.org/wiki/CompilationGuide/Centos


Nginx的RTMP触发转码:

http://blog.csdn.net/wutong_login/article/details/42292787

http://www.linuxidc.com/Linux/2015-01/111182p2.htm

PHP触发转码:

http://www.cnblogs.com/georgelu/p/6430475.html


推送流的实现方式:

http://www.jb51.net/article/107405.htm

http://blog.csdn.net/redstarofsleep/article/details/45092147


http://www.cnblogs.com/lidabo/p/5233642.html


整体架构资料

-----------------------------------

https://trac.ffmpeg.org/wiki/ffserver










本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1921637,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
编解码 移动开发 安全
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
自互联网普及以来,流媒体技术特别是视频直播技术不断进步,出现了多种传输协议。早期的MMS由微软主导,但随WMV格式衰落而减少使用。RTSP由网景和RealNetworks联合提出,支持多种格式,但在某些现代应用中不再受支持。RTMP由Adobe开发,曾广泛用于网络直播,但因HTML5不支持Flash而受影响。HLS由苹果开发,基于HTTP,适用于点播。SRT和RIST均为较新协议,强调安全与可靠性,尤其SRT在电视直播中应用增多。尽管RTMP仍占一定市场,但SRT等新协议正逐渐兴起。
72 8
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
|
4月前
|
网络协议 Shell Windows
搭建rtmp流媒体服务器的步骤
网络上很多问文章介绍使用ffmpeg推送和拉流,经常遗漏安装rtsp-simple-server的步骤,执行推流命令:
225 0
|
3月前
|
Web App开发 缓存 编解码
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适用于复杂直播场景。SRS是一款强大的开源流媒体服务器,支持多种协议,起初为RTMP,现扩展至HLS、SRT等。在FFmpeg 6.1之前,推送给SRS的HEVC流不受支持。要播放RTMP流,Android应用可使用ExoPlayer,需在`build.gradle`导入ExoPlayer及RTMP扩展,并根据URL类型创建MediaSource。若SRS播放黑屏,需在配置文件中开启`gop_cache`以缓存关键帧。
114 2
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
|
3月前
|
应用服务中间件 Linux nginx
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
《FFmpeg开发实战》书中介绍了如何使用FFmpeg向网络推流,简单流媒体服务器MediaMTX不适用于复杂业务。nginx-rtmp是Nginx的RTMP模块,提供基本流媒体服务。要在Linux上集成rtmp,需从官方下载nginx和nginx-rtmp-module源码,解压后在nginx目录配置并添加rtmp模块,编译安装。配置nginx.conf启用RTMP服务,监听1935端口。使用ffmpeg推流测试,如能通过VLC播放,表明nginx-rtmp运行正常。更多详情见书本。
93 0
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
|
3月前
|
存储 编解码 应用服务中间件
|
4月前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
106 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
2月前
|
JavaScript 前端开发 关系型数据库
Vue 开源项目:一款实用的个人音乐流媒体服务器,轻松打造属于自己的音乐天堂!!!
Vue 开源项目:一款实用的个人音乐流媒体服务器,轻松打造属于自己的音乐天堂!!!
|
3月前
|
存储
流媒体服务器与视频服务器有什么区别?
总的来说,流媒体服务器和视频服务器的主要区别在于,流媒体服务器更注重实时性和并发性,而视频服务器更注重存储和分发。
136 2
|
4月前
|
编解码 Linux iOS开发
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
OBS(Open Broadcaster Software)是一款开源、跨平台的直播和和Linux。官网为<https://obsproject.com/>。要使用OBS进行直播,需执行四步:1) 下载并安装OBS Studio(<https://obsproject.com/download>),2) 启动流媒体服务器如MediaMTX,生成RTMP推流地址,3) 打开OBS Studio,设置直播服务为自定义RTMP服务器(127.0.0.1:1935/stream),调整视频分辨率,4) 添加视频来源并开始直播。同时,通过FFmpeg的拉流程序验证直播功能正常。
122 4
FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
|
4月前
|
Web App开发 移动开发 编解码
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
本文讨论了实时数据传输在互联网中的重要性,如即时通讯和在线直播。一对一通信通常使用WebRTC技术,但一对多直播需要流媒体服务器和特定协议,如RTSP、RTMP、SRT或RIST。RTMP由于其稳定性和早期普及,成为国内直播的主流。文章通过实例演示了如何使用OBS Studio和RTMP Streamer进行RTMP推流,并对比了不同流媒体传输协议的优缺点。推荐了两本关于FFmpeg和Android开发的书籍以供深入学习。
64 0
FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

热门文章

最新文章