nginx rtmp

======配置目的======

让Nginx支持flv和mp4格式文件,支持RTMP协议的直播和点播;
同时打开RTMP的HLS功能

资料:
HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。
HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。
它也很容易使用内容分发网络来传输媒体流。

======前提条件======

Nginx: http://nginx.org
模块:nginx_mod_h264_streaming(支持h264编码的视频)
模块:http_flv_module 支持flv
模块:http_mp4_module 支持mp4
下载地址:
http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
https://github.com/arut/nginx-rtmp-module

======安装依赖包======

yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64

======安装相关工具包======

1.安装git
mkdir soft-source
cd soft-source
wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.xz
xz -d git-latest.tar.xz
tar xf git-latest.tar 
cd git-2016-03-29
autoconf
./configure
make && make install
git --version

2.zlib安装
wget http://zlib.net/zlib-1.2.8.tar.gz
tar xf zlib-1.2.8.tar.gz 
cd zlib-1.2.8
./configure
make && make install

3.pcre安装
wget http://exim.mirror.fr/pcre/pcre-8.12.tar.gz
tar xf pcre-8.12.tar.gz
cd pcre-8.12
./configure
make && make install

4.yadmi安装
yadmi的作用是为flv文件添加关键帧,才能实现拖动播放
wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download  
tar xf yamdi-1.4.tar.gz
cd yamdi-1.4
make && make install

5.OpenSSL安装
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar xf openssl-1.0.1c.tar.gz
./config
make && make install

======安装ffmpeg及其依赖包======

1). Yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar xf yasm-1.2.0.tar.gz
cd yasm-1.2.0
./configure
make
make install

2). x264
git clone git://git.videolan.org/x264
cd x264
./configure --enable-shared 
make
make install

3). LAME
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --enable-nasm
make
make install

4). libogg
wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
tar xf libogg-1.3.0.tar.gz
cd libogg-1.3.0
./configure
make
make install

5). libvorbis
wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
tar xf libvorbis-1.3.3.tar.gz
cd libvorbis-1.3.3
./configure
make
make install

6). libvpx
git clone https://github.com/Distrotech/libvpx.git
cd libvpx
./configure  --enable-shared
make
make install

7). FAAD2
wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz
tar xf faad2-2.7.tar.gz
cd faad2-2.7
./configure
make
make install

8). FAAC
wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
tar xf faac-1.28.tar.gz
cd faac-1.28
./configure
make
make install

在make之前修改
 vim +123 ./common/mp4v2/mpeg4ip.h
从123行开始修改此文件mpeg4ip.h,到129行结束。

修改前:

#ifdef __cplusplus

extern "C" {

#endif

char *strcasestr(const char *haystack, const char *needle);

#ifdef __cplusplus

}

#endif

 

修改后:

#ifdef __cplusplus

extern "C++" {

#endif

const char *strcasestr(const char *haystack, const char *needle);

#ifdef __cplusplus

}

#endif

 9). Xvid
wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
tar xf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic
./configure
make
make install

10). ffmpeg
git clone git://source.ffmpeg.org/ffmpeg
cd ffmpeg
./configure  --prefix=/opt/ffmpeg/ --enable-version3 --enable-libvpx --enable-libfaac --enable-libmp3lame --enable-libvorbis --enable-libx264 --enable-libxvid --enable-shared --enable-gpl --enable-postproc --enable-nonfree  --enable-avfilter --enable-pthreads
make && make install

修改/etc/ld.so.conf如下:
include ld.so.conf.d/*.conf
/lib
/lib64
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/ffmpeg/lib
# ldconfig

======安装Nginx相关模块======
<code>
1. 模块安装
wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar xf nginx_mod_h264_streaming-2.2.7.tar.gz
git clone git://github.com/arut/nginx-rtmp-module.git

2. 创建用户和组
groupadd www
useradd -g www www

3. nginx安装
wget http://nginx.org/download/nginx-1.6.0.tar.gz
tar xf nginx-1.6.0.tar.gz
cd nginx-1.6.0

4.编译安装nginx

在nginx-1.6.0目录下新建文件:nginx_configure.sh
vim nginx_configure.sh

#!/bin/sh

echo "configure start ..."
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --add-module=../nginx_mod_h264_streaming-2.2.7 --with-pcre=../pcre-8.12 --with-zlib=../zlib-1.2.8 --with-http_dav_module --with-http_flv_module --with-http_stub_status_module --without-http_scgi_module --without-http_uwsgi_module --without-http_gzip_module --without-http_ssi_module --without-http_proxy_module --without-http_memcached_module --without-http_empty_gif_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_ssl_module --with-openssl=../openssl-1.0.1c --add-module=../nginx-rtmp-module --with-cc-opt=-I/opt/ffmpeg/include --with-ld-opt=‘-L/opt/ffmpeg/lib -Wl,-rpath=/opt/ffmpeg/lib‘
echo "configure end!"

【保存并退出】
chmod +x nginx_configure.sh
./nginx_configure.sh
make && make install

备注:

在执行make的时候可能出现错误1:

adding module in ../nginx_mod_h264_streaming-2.2.7

 + ngx_http_h264_streaming_module was configured

adding module in ../nginx-rtmp-module

 + ngx_rtmp_module was configured

checking for OpenSSL library ... not found

 

./configure: error: SSL modules require the OpenSSL library.

You can either do not enable the modules, or install the OpenSSL library

into the system, or build the OpenSSL library statically from the source

with nginx by using --with-openssl=<path> option.

 

configure end!

[email protected]:/home/song/nginx-t/nginx-1.6.0# make

make: *** No rule to make target `build‘, needed by `default‘.  Stop.

 

解决方法:

a)可以安装ssl

apt-get install openssl

apt-get install libssl-dev

b)也可以添加

--with-openssl=<path>

在执行make的时候可能出现错误2:

/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c: In function ‘ngx_streaming_handler’:

 

/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c:158: error: ‘ngx_http_request_t’ has no member named ‘zero_in_uri’

 

make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1

 

make[1]: Leaving directory `/root/nginx-0.8.54‘

 

make: *** [build] Error 2

 

解决方法:

那么将src/ngx_http_streaming_module.c文件中以下代码删除或者是注释掉就可以了:

/* TODO: Win32 */

if (r->zero_in_uri)

{

return NGX_DECLINED;

}

 

在执行make的时候可能出现错误3:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函数‘esds_read’中:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:377:16: 错误: 变量‘stream_priority’被设定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:376:12: 错误: 变量‘stream_id’被设定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函数‘stsd_parse_vide’中:

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:529:22: 错误: 变量‘level_indication’被设定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:528:22: 错误: 变量‘profile_compatibility’被设定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:527:22: 错误: 变量‘profile_indication’被设定但未被使用 [-Werror=unused-but-set-variable]

../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:526:22: 错误: 变量‘configuration_version’被设定但未被使用 [-Werror=unused-but-set-variable]

cc1: all warnings being treated as errors

make[1]: *** [objs/addon/src/mp4_reader.o] 错误 1

 

解决方法:

# vim objs/Makefile (修改objs/Makefile文件, 去掉其中的"-Werror"), 然后就能够正常编译了.

然后在make就能过了。

======配置Nginx相关模块======

1.

安装好了之后终端进入 nginx安装的目录 : /usr/local/nginx/html/

然后新建目录:nginx-rtmp-module

然后拷贝 之前用于存放下载 nginx 所需资源包的目录 :/root/nginx/nginx-rtmp-module/

拷贝 目录 test 到/usr/local/nginx/html/ 目录下:

cp /root/nginx-rtmp-module/test /usr/local/nginx/html/nginx-rtmp-module/

cp /root/nginx-rtmp-module/stat.xsl /usr/local/nginx/html/nginx-rtmp-module/

2.

拷贝之后就需要修改 /usr/local/nginx/nginx.conf 文件:

下面是配置好的nginx.conf 文件:
#user  nobody;
worker_processes  4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  51200;
}

#切换自动推送(多 worker 直播流)模式。默认为 off
rtmp_auto_push on;

#当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒
rtmp_auto_push_reconnect 1s;

#设置用于流推送的 UNIX 域套接字目录。默认为 /tmp
#rtmp_socket_dir /var/sock;

rtmp {
    server {
            listen 1935;

        #点播配置
                application vod {
                    play /opt/media/nginxrtmp/flv;
                }
        
        #直播流配置
            application live {
                    live on;
            #为 rtmp 引擎设置最大连接数。默认为 off
            max_connections 1024;

                    # default recorder
                    record all;
                    record_path /var/rec;
 
                    recorder audio {
                         record audio;
                         record_suffix -%d-%b-%y-%T.flv;
                    } 

                    recorder chunked {
                        record all;
                         record_interval 15s;
                         record_path /var/rec/chunked;
                    }

            #on_publish http://localhost:8080/publish;  
            #on_play http://localhost:8080/play;  
            #on_record_done http://localhost:8080/record_done;
            
            #rtmp日志设置
             #access_log logs/rtmp_access.log new;
             #access_log logs/rtmp_access.log;
             #access_log off;

             }
        
        #HLS协议支持
        #application hls {  
            #live on;  
            #hls on;  
            #hls_path /tmp/app;  
            #hls_fragment 5s;  
        #} 

            application hls{
        
                    live on;
                    hls on;
                    hls_path /usr/local/nginx/html/app;
                    hls_fragment 1s;
            }
 

        }
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    #                  ‘$status $body_bytes_sent "$http_referer" ‘
    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache‘s document root
        # concurs with nginx‘s one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}

    location /rtmp-publisher {  
        root /root/nginx/nginx-rtmp-module/test;  
    }  

    #location /hls {  
        #server hls fragments  
        #types{  
            #application/vnd.apple.mpegurl m3u8;  
            #video/mp2t ts;  
        #}
  
        #alias /usr/local/nginx/html;  
        #expires -1;  
    #}

    location /hls {
         #server hls fragments
              types{
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
              }

             #alias /usr/local/nginx/html/app;
         alias /usr/local/nginx/html;
             expires -2;
         }  

    location / {  
        #root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;  
        types{  
          application/vnd.apple.mpegurl m3u8;  
          video/mp2t ts;  
        }
  
        root /usr/local/nginx/html/rtmp-publisher;  
        expires -1;  
    }  

    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    #支持flv
    server
        {
            listen       8081;
            server_name localhost;
            #root /opt/pub/media/nginx; #http协议时候,flv视频位置
        #root /root/nginx/nginx-rtmp-module/test/www;
            root /usr/local/nginx/html/www;

            location ~ .*.(flv|swf|mp4|wma|wmv)$ {
                    valid_referers none blocked *.xxxx.com http://localhost;
                    if ($invalid_referer) {
                    return 403;
                    }
            }
            location ~ \.flv$ {
                    flv;
                    #limit_conn one 20;#限制客户端并发连接数
                    limit_rate 200k;#限制每客户端最大带宽
            }
            location ~ \.mp4$ {
                    flv;
                    #limit_conn one 20;
                    limit_rate 200k;
            }
            #access_log  logs/nginxflv_access.log  main;
        }

    server
        {
            listen       8082;
            server_name localhost;
            index index.html;
            location / {
                #root /opt/pub/media/nginx-rtmp;
        root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;
            }
            #access_log  logs/nginxrtmpflv_access.log  main;
        }

    server {
        listen      8080;
    server_name localhost;
    index player.html;

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet /root/nginx/nginx-rtmp-module/stat.xsl;
        }
        location /stat.xsl {
            root /root/nginx/nginx-rtmp-module;
        }

        location /rtmp-publisher {  
            root /usr/local/nginx/html/test/rtmp-publisher;  
        }  

        location / {
            root /root/nginx/nginx-rtmp-module/test/rtmp-publisher;
        }
    }

}

推流使用OBS进行推流
rtmp://192.168.15.3/live/
流秘钥:stream

客户端使用VLC进行观看
rtmp://192.168.15.3/live/stream
时间: 2024-10-18 08:52:41

nginx rtmp的相关文章

ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制

公司最近在做视频直播的项目,我这里分配到对直播的视频进行录制,录制的方式是通过rtmpdump对rtmp的视频流进行录制 前置的知识 ffmpeg: 用于实现把录屏工具发出的视频和音频流,转换成我们需要的格式,然后发送到rtmp中转服务器上. rtmpdump: 用于实现视频的录制,从rtmp的中转服务器接受到视频流,并把视频流保存成flv文件 nginx-rtmp-module: 用户rtmp中转服务,虽然他可以做很多功能,但是我这里只是使用了这一个 screen capture: windo

CRtmpServer转推流到Nginx Rtmp及SRS(SimpleRtmpServer)的经历

本人一直用的是CRtmpServer服务,在CRtmpServer服务中根据自已的想法也加入了许多功能,如通过http接口来加载配置等,苦于不支持HLS,自已添加ts分片水平又有限,思来想去决定借助SimpleRtmpServer的HLS功能.说干就干,马上查找相关资源,下载.解压一一蹴而就,SRS顺利搭好,比想像中的要简单很多. SRS服务搭建好后,直推测试成功,在配置CRtmpServer转推流时,SRS的流播放不出,查看日志发现报了个tcUrl不能为空的异常,于是想到应该是CRtmpSer

nginx rtmp模块 实现hls

nginx rtmp  ffmpeg 组合模仿hls直播 前几天老总说搞了一个局域网内的直播,想到了之前提到的rtmp模块,抱着试试看的的心态 开干了 系统环境: [[email protected] html]# uname -a  Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:35 EDT 2010 i686 athlon i386 GNU/Linux [[email protected] html]# g

Android中直播视频技术探究之---视频直播服务端环境搭建(Nginx+RTMP)

一.前言 前面介绍了Android中视频直播中的一个重要类ByteBuffer,不了解的同学可以 点击查看 到这里开始,我们开始动手开发了,因为我们后续肯定是需要直播视频功能,然后把视频推流到服务端,本地在进行拉流播放的流程.所以这个过程中,我们需要首先来把服务端这个中间环节的工作搞定,后续再弄推流和拉流功能.现在推流大部分都是使用RTMP/HLS协议的,关于这两个协议的区别: 所以我们服务端搭建就需要用这两个协议,不过本文放心了,不会去手动的编写一套协议代码的,谁叫这个世界属于开源呢? 需要的

转:Nginx RTMP 功能研究

看点: 1.    Nginx 配置信息与使用.  (支持 rtmp与HLS配置) 2.    有ffmpeg 编译与使用,    命令行方式来测试验证客户端使用. 转自:http://blog.csdn.net/cccallen/article/details/8440191 Nginx-RTMP功能调研 1. RTMP协议介绍...2 2.RTMP server.3 2.1当前的流媒体server.3 2.2Wowza功能...3 3.Nginx-based RTMP server.5 3.

nginx + rtmp 搭建流媒体服务器

一.安装nginx服务器 1.路径说明: 路径:/usr/local/src 2.下载nginx-rtmp-module (我这里的目录是在/usr/local/src/下面) cd /usr/local/src nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module git clone https://github.com/arut/nginx-rtmp-module.git ( 如果没有git进行安装,yu

在Centos7上搭建Nginx+rtmp服务器

在VPS服务器上配置一个直播环境,在iOS客户端实现推流到直播服务器,通过VLC播放器实现拉取服务器上的流观看直播. 效果图 Demo_01 Centos7上搭建Nginx+rtmp服务器 今天第一次在Centos7上搭建Nginx+rtmp服务器,以前在Mac上成功搭建,所以今天想在Centos7上试一试,在此记录一下,过程还是比较顺利. (1)准备需要的模块及工具(nginx-rtmp-module,openssl和git) 1.使用yum安装git [root~]# yum -y inst

利用 Nginx + rtmp 搭建流媒体服务器

背景 nginx 在音视频服务也有比较强大的功能,下面给出配置步骤. 前提:根据 软件运行环境,确保搭建好了有关支持环境 参考: 步骤 1.下载第三方扩展模块nginx-rtmp-module wget https://github.com/arut/nginx-rtmp-module/archive/master.zip //下载模块 2.编译安装nginx nginx 添加模块都是需要重新配置编译的编译 bash ./configure ... --add-module=/root/modu

Nginx rtmp流媒体服务器搭建

Nginx下rtmp模块安装: 在lnmp环境下安装: cd lnmp/src yum -y install git wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gztar xzf yasm-1.2.0.tar.gz cd yasm-1.2.0./configure make && make install cd ..git clone git://git.videolan.org/x264.gitcd

Nginx rtmp模块nginx-rtmp-module指令详解

指令Corertmp语法:rtmp { ... }上下文:根描述:保存所有 RTMP 配置的块.server语法:server { ... }上下文:rtmp描述:声明一个 RTMP 实例.rtmp {  server {  }}listen语法:listen (addr[:port]|port|unix:path) [bind] [ipv6only=on|off] [so_keepalive=on|off|keepidle:keepintvl:keepcnt]上下文:server描述:给 NG