Nginx + Nginx-http-flv-module + FFMPEG实现直播和点播

21 篇文章 1 订阅
16 篇文章 9 订阅

上一篇讲了如何在Linux系统上安装Nginx:安装Nginx + nginx-http-flv-module。本篇记录一下如何用Nginx + nginx-http-flv-module实现直播和点播功能。

要实现直播和点播,首先需要正确配置Nginx,进入Nginx配置文件路径:/usr/local/nginx/conf (如果安装自定义路径的话,请进入自己的实际安装路径),可以看到有以下这些文件:

我们需要编辑的是nginx.conf。

1. nginx.conf的配置

我目前支持http-flv直播、http-hls直播以及点播功能,所以我的最终配置如下:


#user  nobody;
worker_processes  1;

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

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

rtmp {
    out_queue           4096;
    out_cork            8;
    max_streams         128;
    timeout             15s;
    drop_idle_publisher 15s;
    log_interval 5s; #interval used by log module to log in access.log, it is very useful for debug
    log_size     1m; #buffer size used by log module to log in access.log
    
	server {
        listen 1935;
        server_name localhost; #for suffix wildcard matching of virtual host name
     
		#该块为手动添加,以支持http-flv直播
        application http_flv {   
            live on;
            gop_cache on; #open GOP cache for reducing the wating time for the first picture of video
        }
		
		#该块为手动添加,以支持http-hls直播,若无需HLS直播,该块可不用添加
		application hls {
			live on;
			hls on;
			wait_key on;
			hls_path /home/users/myn/videos;    #HLS切片存放路径
			hls_fragment 10s;
		}
	
		#该块为手动添加,支持视频点播
		application vod {
			play /home/users/myn/videos;   # 视频存放路径
		}
    }
}

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;
        }

		#该块为手动添加,HTTP播放FLV直播流功能
		location /live {   
            flv_live on;     #open flv live streaming (subscribe)
            chunked_transfer_encoding  on; #open 'Transfer-Encoding: chunked' response
            add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header
            add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header
        }
        
		#该块为手动添加,HTTP播放HLS功能,若无需HLS,则该块可省略
		location /hls {
			types {
				application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
			alias /home/users/myn/videos;
			expires -1;
	
			#root /home/users/myn/videos;
			add_header 'Cache-Control' 'no-cache';
		}

		location /stat {
			rtmp_stat all;
			rtmp_stat_stylesheet stat.xsl;
		}

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

2. HTTP-FLV直播

在Linux服务器上,利用ffmpeg向application http-flv推流,命令行如下:

ffmpeg -stream_loop -1 -re -i super_women_doubles.mp4 -c copy -f flv  rtmp://192.168.xx.xxx:1935/http_flv/mystream

以上命令行中,http_flv是我们在nginx配置文件rtmp模块配置的application名称,该名称可根据需要自己起;mystream为输出流的名称,也是自己命名的。

用VLC从服务器拉流播放,支持两种方式,一种是rtmp播放,一种是http播放,分别如下:

rtmp播放地址:

rtmp://example.com[:port]/appname/streamname  

在我们这个例子中,则是:

rtmp://192.168.xx.xxx/http_flv/mystream

http播放地址:

http://example.com:8080/live?port=1935&app=myapp&stream=mystream

在本例中,具体如下:

http://192.168.xx.xxx/live?port=1935&app=http_flv&stream=mystream

下面是用VLC播放以上rtmp和http两地址视频流的截图:

3. HLS直播

以上已经支持了http-flv直播,如果要支持HLS直播,在前面nginx.conf配置的前提下,用ffmpeg推流:

ffmpeg -stream_loop -1 -re -i super_women_doubles.mp4 -c copy -f flv  rtmp://192.168.xx.xxx:1935/hls/mystream

我们进入配置文件中指定的HLS切片路径:/home/users/myn/videos,可以看到已经开始产生了切片文件:

HLS视频流的播放地址命名规则如下:

http://example.com[:port]/dir/streamname.m3u8

具体到我们的例子,则是:

http://192.168.xx.xxx/hls/mystream.m3u8

VLC播放截图如下:

当然,此时如果仍然希望用rtmp或http播放,也是可以的,当然,因为现在是推流在hls这个application上,所以输入的视频流地址也要相应地修改一下:

4. 视频点播

试了一下简单地点播一个mp4文件,是OK的,通过rtmp播放,播放地址按如下规则:

http://example.com[:port]/appname/videofilename

本例中为:

rtmp://192.168.xx.xxx/vod/super_girl.mp4

截个图:

用http做点播的方法还没研究,等实现了再做补充吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值