上一篇讲了如何在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做点播的方法还没研究,等实现了再做补充吧。