nginx + ffmpeg

摘要:
第一种方案:ffmpeg+nginx新的ffmpeg已经支持HLS。

第一种方案:ffmpeg+nginx

新的ffmpeg已经支持HLS。(本人也参与了代码供献,给自己做个广告:))

点播:

生成hls分片:

ffmpeg -i <媒体文件> -c:v libx264 -c:a aac -f hls /usr/local/nginx/html/test.m3u8

直播:

ffmpeg -i udp://@:1234 -c:v libx264 -c:a aac -f hls -hls_list_size 5 -hls_wrap 5 /usr/local/nginx/html/test.m3u8

建立web服务器:

默认配置就可以。

 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

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

}

启动nginx。

客户端访问:http://IP/test.m3u8

在windows上可以用vlc播放。

第二个方案,用nginx-rtmp-module

      
rtmp {

    server {

        listen 1935;

        chunk_size 4000;
      
        #HLS

        # For HLS to work please create a directory in tmpfs (/tmp/app here)
        # for the fragments. The directory contents is served via HTTP (see
        # http{} section in config)
        #
        # Incoming stream must be in H264/AAC. For iPhones use baseline H264
        # profile (see ffmpeg example).
        # This example creates RTMP stream from movie ready for HLS:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264 
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # If you need to transcode live stream use 'exec' feature.
        #
        application hls {
            live on;
            hls on;
            hls_path /tmp/app;
            hls_fragment 5s;
        }
    }
}

http {

    server {

        listen      80;
        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias /tmp/app;
            expires -1;
        }
    }
}

1        功能:

1.1         视频、音频直播流(Live streaming of video/audio)

1.2         Flv、mp4视频需求,从本地或HTTP播放(Video ondemand FLV/MP4, playing from local filesystem or HTTP)

1.3         支持分布式流中继:推或拉模式(Stream relay support for distributed streaming: push & pullmodels)

1.4         录制FLVS流(Recording streams in multiple FLVs)

1.5         支持H264/AAC

1.6         在线用ffmpeg转码(Online transcoding with FFmpeg)

1.7         HLS (HTTP Live Streaming) 支持

1.8         基于http的操作(发布、播放、录制)(HTTP callbacks (publish/play/record/update etc))

1.9         在一定的事件中执行应用程序(Running external programs on certain events (exec))

1.10      HTTP control module forrecording audio/video and dropping clients

1.11      高级内存管理技术,快速流和低内存占用(Advanced buffering techniques to keep memory allocations at aminimum level for faster streaming and low memory footprint)

1.12      实践证明可以在下列产品中工作: Wirecast,FMS,Wowza, JWPlayer,FlowPlayer,StrobeMediaPlayback,ffmpeg,avconv,rtmpdump,flvstreamer and many more

1.13      Statistics in XML/XSL in machine-& human- readable form

1.14      Linux/FreeBSD/MacOS/Windows

2        代码下载:

Nginx:

官网:http://nginx.org/

下载:hg clone http://hg.nginx.org/nginx

nginx-rtmp-module:

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

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

3        编译:

3.1         Linux下:

进入nginx源码根目录:

auto/configure--add-module=<path-to-nginx-rtmp-module>

make -f objs/Makefile

make -f objs/Makefile install

 

增加:http_ssl_module:

auto/configure--add-module=<path-to-nginx-rtmp-module> --with-http_ssl_module

3.2   windows下:

3.2.1 官网提供的编译方法:

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

3.2.1.1 预备:

l  Microsoft Visual C compiler.Microsoft Visual Studio® 8 and 10

l  Msys

l  Perl(如果要编译OpenSSL并且nginx支持SLL),例如:ActivePerl 或 Strawberry Perl.

l  PCRE,zlib and OpenSSLlibraries sources.

3.2.1.2    编译步骤:

l  设置MSYS、Perl、VC环境变量

运行vc设置环境变量脚本vcvarsall.bat(默认安装路径:C:Program FilesMicrosoftVisual Studio 9.0VC)

l  开始MSYS

l  建立编译和库目录

mkdir objs

mkdir objs/lib

cd objs/lib

tar -xzf ../../pcre-8.32.tar.gz

tar -xzf ../../zlib-1.2.7.tar.gz

tar -xzf ../../openssl-1.0.1e.tar.gz

l  运行配置脚本:

auto/configure --with-cc=cl --builddir=objs--prefix=

--conf-path=conf/nginx.conf--pid-path=logs/nginx.pid

--http-log-path=logs/access.log--error-log-path=logs/error.log

--sbin-path=nginx.exe--http-client-body-temp-path=temp/client_body_temp

--http-proxy-temp-path=temp/proxy_temp

--http-fastcgi-temp-path=temp/fastcgi_temp

--with-cc-opt=-DFD_SETSIZE=1024--with-pcre=objs/lib/pcre-8.32

--with-zlib=objs/lib/zlib-1.2.7--with-openssl=objs/lib/openssl-1.0.1e

--with-select_module --with-http_ssl_module--with-ipv6

运行脚本:

nmake –f objs/Makefile

3.2.2 Cygwin下:

linux

4        Windows下的限制:

Windows下下列功能不支持:

l  execs

l  static pulls

l  auto_push

windows下用的是select模式:

events{

    worker_connections  30; #默认为(1024),windows默认为64,所以需要修改此值小于64

}

5        访问URL格式:

rtmp://rtmp.example.com/app[/name]

app-应该是配置文件中的application块

name-可以为空

6        配置:

在源码要目下有个test目录。其中有测试配置文件和脚本。

6.1         点播配置:

l  环境:

服务器IP为:192.168.10.4。

安装根路径:/usr/local/nginx

在你的配置时,需要把IP换成你的服务器IP或域名。

l  建立媒体文件夹:

mkdir /usr/local/nginx/vod/flvs

l  准备媒体文件:

把媒体文件 a.flv 复制到 /usr/local/nginx/vod/flvs目录下。

l  准备网页

下载jwplayer:http://www.longtailvideo.com/players/jw-flv-player/

下载后,解压到:/usr/local/nginx/html/

建立测试页面test.html,也放到上面目录下。

<html>

         <head>

                   <scriptsrc="/jwplayer/jwplayer.js"></script>

         </head>

         <body>

                   <divid='my-video'></div>

                   <scripttype='text/javascript'>

                            jwplayer('my-video').setup({

                                     file:'rtmp://192.168.10.4/vod/a.flv',    

                                     '50%',

                                     aspectratio:'3:2',

                                     fallback:'false',

                                     primary:'flash'  

                                     });

                   </script>

         </body>

</html>

l  在nginx中配置http

#配置事件工作线程数

events {

   worker_connections  30; #默认为(1024),windows默认为64,所以需要修改此值小于64

}

#配置http

http {

   include       mime.types;

   default_type application/octet-stream;

    #配置访问web页

   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;

       }

   }

  

   #配置rtmp状态页

  server {

       listen      8080;

       location /stat {

           rtmp_stat all;

           rtmp_stat_stylesheet stat.xsl;

       }

       location /stat.xsl {

           root /usr/local/nginx/nginx-rtmp-module/;  #在nginx-rtmp-module源码根目录

       }

   }

}

#rtmp点播配置

rtmp {

   server {

        listen 1935;

        chunk_size 4000;

        application  vod {

                play /usr/local/nginx/vod/flvs;  #点播媒体文件存放目录

        }

    }

}

l  启动nginx

./nginx

l  从客户端访问网页:

http://192.168.10.4/test.html

l  访问rtmp状态页(非必须):

http://192.168.10.4:8080/stat

6.2         直播配置:

l   

l  在配置文件nginx.conf中加入

#rtmp直播配置

rtmp {

   server {

        listen 1935;

        chunk_size 4000;

        application  live {

                   live on;

        }

    }

}

#配置访问web页

http {

    include       mime.types;

   default_type application/octet-stream;

#配置访问web页

   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;

       }

#配置rtmp状态页

   server {

       listen      8080;

       location /stat {

           rtmp_stat all;

           rtmp_stat_stylesheet stat.xsl;

       }

       location /stat.xsl {

           root /usr/local/nginx/nginx-rtmp-module/;  #在nginx-rtmp-module源码根目录

       }

}

}

l  访问rtmp状态页(非必须):

http://192.168.10.4:8080/stat

可以查看rtmp流的统计情况

l  准备网页

下载jwplayer:http://www.longtailvideo.com/players/jw-flv-player/

下载后,解压到:/usr/local/nginx/html/

建立测试页面test.html,也放到上面目录下。

<html>

         <head>

                   <scriptsrc="/jwplayer/jwplayer.js"></script>

         </head>

         <body>

                   <divid='my-video'></div>

                   <scripttype='text/javascript'>

                            jwplayer('my-video').setup({

                               file:'rtmp://192.168.0.128/live/test', #live是applicatioin,test是直播缓存流文件

                                     '50%',

                                     aspectratio:'3:2',

                                     fallback:'false',

                                     primary:'flash'  

                                     });

                   </script>

         </body>

</html>

l  启动服务

nginx

l  推流

用ffmpeg产生一个模拟直播源,向rtmp服务器推送

ffmpeg –i/usr/local/nginx/vod/flvs/a.flv-strict -2 -c:v libx264 -c:a aac -f flv rtmp://192.168.10.4/live/test

注意,源文件必须是H.264+AAC编码的。

192.168.10.4是运行nginx的服务器IP,l

ive是applicatioin,

test是直播缓存流文件,需要与配置文件中的直播缓存文件名一样。

 

l  从客户端访问网页:

http://192.168.10.4/test.html

免责声明:文章转载自《nginx + ffmpeg》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java反射及其在Android中的应用学习总结论软件体系架构之质量属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

nginx上传模块—nginx upload module-

一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下。这些文件信息从原始请求体中分离并根据nginx.conf...

Nginx实战系列之功能篇----后端节点健康检查

公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查。目前,nginx对后端节点健康检查的方式主要有3种,这里列出: 1 2 3 4 5 6 1、ngx_http_proxy_module模块和ngx_http_upstream_module模块(自带) 官网地址:http://nginx.org/...

nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)错误解决办法

ginx: the configuration file /home/work/local-qc/nginx/conf/nginx.conf syntax is oknginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)nginx: configuration file /hom...

ubuntu上安装nginx+mysql+php5-fpm(PHP5

题外话:由于近段时间测试环境ssh链路质量不大好,经常短线。故我把整个安装过程放到screen里去执行,以防止断线中断了安装过程。执行screen -S install,这样断线后,只要再执行screen -r install 就可以恢复之前的安装界面。 1.安装mysql sudo apt-get install mysql-server mysql-c...

【Nginx(五)】Nginx配置Https证书

大致的流程如下 1.申请Https证书,绑定域名信息; 由于自己的服务器是腾讯云服务器, 这里就在腾讯云上申请SSL证书, 申请地址:https://console.cloud.tencent.com/ssl 点击申请免费的SSL证书,弹窗如下: 这里直接申请亚洲诚信的证书 点击确定,输入相关信息即可,大概1天之内完成证书颁发,届时会有微信公众号通知提...

Nginx使用教程(四):提高Nginx网络吞吐量之buffers优化

请求缓冲区在NGINX请求处理中起着重要作用。 在接收到请求时,NGINX将其写入这些缓冲区。 这些缓冲区中的数据可作为NGINX变量使用,例如$request_body。 如果缓冲区与请求大小相比较小,则数据将写入磁盘上的文件,因此将涉及I/O操作。 NGINX提供了可以改变请求缓冲区的各种指令。 client_body_buffer_size <...