Nginx-rtmp模块实现流媒体play、push、pull功能

官方wiki:https://github.com/arut/nginx-rtmp-module#readme

Nginx rtmp 功能特点

1.   支持音视频直播

2.   支持flv/mp4视频格式,输入可以是文件或者HTTP流

3.   支持两种流的分发模式 pushand pull

4.   可以将直播流录制成flv文件

5.   H264/AAC编码

6.   支持在线转码 Onlinetranscoding with FFmpeg

7.   支持HLS (HTTP LiveStreaming)需要 libavformat (>= 8. 53.31.100) from ffmpeg (ffmpeg.org)

8.   HTTPcallbacks (publish/play/record/update etc)

9.   支持外部程序(exec)

10.  HTTPcontrol module for recording audio/video and dropping clients

11.  先进内存控制技术,可以在使用少量内存的情况下完成流畅的直播功能。

12 . 可以和以下协同工作。FMS server(Wirecast, FMS, Wowza,)Player(JWPlayer, FlowPlayer, StrobeMediaPlayback,)外部程序(ffmpeg,avconv,rtmpdump,flvstreamer )

13. Statistics in XML/XSL in machine- & human- readable form

14.  支持跨平台 Linux/FreeBSD/MacOS

实现环境:

 

rhel6.1 172.16.6.36
rhel6.1 172.16.6.39

编译环境:安装gcc、openssl-devel、pcre-devel

网络yum源配置参考链接:http://lyd0721.blog.51cto.com/4894702/1428467

下载并解压nginx-rtmp-module模块

编译安装nginx


1

2

3

4

[root@localhost ~]# tar xf nginx-1.4.7.tar.gz

[root@localhost ~]# cd nginx-1.4.7

[root@localhost ~]# ./configure --prefix=/usr --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/nginx.pid  --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --add-module=/root/nginx-rtmp-module-master

[root@localhost ~]# make && make install

在/etc/init.d/目录下为nginx提供服务器脚本并赋予其执行权限


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

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

# Source function library.

/etc/rc.d/init.d/functions

# Source networking configuration.

/etc/sysconfig/network

# Check that networking is up.

"$NETWORKING" "no" ] && exit 0

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {

# make required directories

user=`nginx -V 2>&1 | grep "configure arguments:" sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

options=`$nginx -V 2>&1 | grep 'configure arguments:'`

for opt in $options; do

if [ `echo $opt | grep '.*-temp-path'` ]; then

value=`echo $opt | cut -d "=" -f 2`

if [ ! -d "$value" ]; then

# echo "creating" $value

mkdir -p $value && chown -R $user $value

fi

fi

done

}

start() {

[ -x $nginx ] || exit 5

[ -f $NGINX_CONF_FILE ] || exit 6

make_dirs

echo -n $"Starting $prog: "

daemon $nginx -c $NGINX_CONF_FILE

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $prog: "

killproc $prog -QUIT

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

configtest || return $?

stop

sleep 1

start

}

reload() {

configtest || return $?

echo -n $"Reloading $prog: "

killproc $nginx -HUP

RETVAL=$?

echo

}

force_reload() {

restart

}

configtest() {

$nginx -t -c $NGINX_CONF_FILE

}

rh_status() {

status $prog

}

rh_status_q() {

rh_status >/dev/null 2>&1

}

case "$1" in

start)

rh_status_q && exit 0

$1

;;

stop)

rh_status_q || exit 0

$1

;;

restart|configtest)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

exit 2

esac


1

[root@localhost ~]# chmod +x nginx

添加nginx至服务列表并设置其开机自动启动


1

2

[root@localhost ~]# chkconfig --add nginx

[root@localhost ~]# chkconfig nginx on

备份/etc/nginx配置文件,把nginx-rtmp-module-master/test/nginx.conf复制到/etc/nginx目录下


1

2

3

4

[root@localhost ~]# cd /etc/nginx/

[root@localhost nginx]# mv nginx.conf nginx.conf.bak

[root@localhost ~]# cd nginx-rtmp-module-master/test/

[root@localhost test]# mv nginx.conf /etc/nginx/

修改/etc/nginx/nginx.conf配置文件

 

172.16.6.39上面的环境与172.16.6.36相同,只不过要在172.16.6.39上实现pull的功能

 

下载一个.flv结尾的视频文件,使用ffmpeg模拟视频直播源进行测试play、push及pull功能是否实现

使用ffmpeg模拟直播效果,ffmpeg下载链接http://www.ffmpeg.org/download.html

进入ffmpeg-2.2.1-64bit-static目录下,执行如下命令


1

[root@localhost ffmpeg-2.2.1-64bit-static]# ./ffmpeg -re -i ~/2014.flv -f flv rtmp://172.16.6.36/myapp/test1

然后登录此链接验证能够播放:http://www.wowza.com/resources/3.5.0/examples/LiveVideoStreaming/FlashRTMPPlayer/player.html

验证pull功能是否实现

验证push功能

使用ffmpeg推流的时候,应该推至/mypush中,/mypush有流之后才能push至172.16.6.39的/myapp中,所以执行如下命令


1

[root@localhost ffmpeg-2.2.1-64bit-static]# ./ffmpeg -re -i ~/2014.flv -f flv rtmp://172.16.6.36/mypush/test1

 

时间: 2024-10-18 11:56:46

Nginx-rtmp模块实现流媒体play、push、pull功能的相关文章

Mac上搭建直播服务器Nginx+rtmp

简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 步骤安装 1.安装Homebrow Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,可以说Homebrew就是mac下的apt-get.yum神器 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/

Mac上搭建nginx+rtmp直播服务器的步骤详解_nginx

前言 相信大家都知道nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,所以小编在网上整理了安装流程,现在分享给大家并且作备忘.有需要的朋友们可以参考学习,下面来一起看看吧. 一.安装Homebrow 已经安装了brow的可以直接跳过这一步. 执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 如果已经安装过,而

流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html 上面这两个流的地址分别是: 第一个就是推送的地址: RTMP推流地址: rtmp://serverIp:1935/myapp/test1 第二个是HTTP地址:  HLS推流地址: http://serverIp

Nginx 第三方模块-漫谈缘起

本文的部分内容和图片摘录于http://tengine.taobao.org/download/nginx@taobao.pdf 为什么要使用nginx模块?我个人觉得taobao这个ppt来做说明是最好不过了 从web服务器结构开始说起:   第一个模式(LAMP): 这个结构中,Apache的PHP模块将所有动态网页都使用php解析,所有逻辑结构都放在php中进行处理. 这个结构也是现在最多web网站的架构LAMP(Linux+Apache+PHP+Mysql)   Apache的强劲的市场

《深入理解Nginx:模块开发与架构解析》一1.3 准备工作

1.3 准备工作 由于Linux具有免费.使用广泛.商业支持越来越完善等特点,本书将主要针对Linux上运行的Nginx来进行介绍.需要说明的是,本书不是使用手册,而是介绍Nginx作为Web服务器的设计思想,以及如何更有效地使用Nginx达成目的,而这些内容在各操作系统上基本是相通的(除了第9章关于事件驱动方式以及第14章的进程间同步方式在类UNIX操作系统上略有不同以外). 1.3.1 Linux操作系统 首先我们需要一个内核为Linux 2.6及以上版本的操作系统,因为Linux 2.6及

Nginx学习笔记六Nginx的模块开发

1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均衡相关配置)这部分指令用于设置反向代理及后端服务 器的负载均衡.location(目录匹配配置)这部分指令用于匹配网页位置(例如,根目录"/","/images",等 等). location部分会继承server部分的指令,而server部分会继承main部分的指令.

《深入理解Nginx:模块开发与架构解析》一3.9 用C++语言编写HTTP模块

3.9 用C++语言编写HTTP模块 Nginx及其官方模块都是由C语言开发的,那么能不能使用C++语言来开发Nginx模块呢?C语言是面向过程的编程语言,C++则是面向对象的编程语言,面向对象与面向过程的优劣这里暂且不论,存在即合理.当我们由于各种原因需要使用C++语言实现一个Nginx模块时(例如,某个子功能是用C++语言写成,或者开发团队对C++语言更熟练,又或者就是喜欢使用C++语言),尽管Nginx本身并没有提供相应的方法支持这样做,但由于C语言与C++语言的近亲特性,我们还是可以比较

《深入理解Nginx:模块开发与架构解析》一3.4 HTTP模块的数据结构

3.4 HTTP模块的数据结构 定义HTTP模块方式很简单,例如: ngx_module_t ngx_http_mytest_module; 其中,ngx_module_t 是一个Nginx模块的数据结构(详见8.2节).下面来分析一下Nginx模块中所有的成员,如下所示: typedef struct ngx_module_s ngx_module_t; struct ngx_module_s { /* 下面的ctx_index.index.spare0.spare1.spare2.spare

《深入理解Nginx:模块开发与架构解析》一3.2 准备工作

3.2 准备工作 Nginx模块需要使用C(或者C++)语言编写代码来实现,每个模块都要有自己的名字.按照Nginx约定俗成的命名规则,我们把第一个HTTP模块命名为ngx_http_mytest_module.由于第一个模块非常简单,一个C源文件就可以完成,所以这里按照官方惯例,将唯一的源代码文件命名为ngx_http_mytest_module.c. 实际上,我们还需要定义一个名称,以便在编译前的configure命令执行时显示是否执行成功(即configure脚本执行时的ngx_addon