转载请注明出处:https://blog.csdn.net/impingo
项目地址:https://github.com/im-pingo/pingos
快速搭建nginx-rtmp的HLS录像和回放服务
HLS直播和录像
众所周知不管是在直播或者点播方式的选择中,HLS都是兼容性最好的协议。
以往常见的录像和点播
以往为了快速实现HLS点播服务,需要服务器将实时数据保存成mp4或者flv格式数据,然后直播结束后再使用ffmpeg将录像文件切成小片。
从这张图中可以看到为了实现hls点播,我们需要将原有录像进行独立切片,然后将其切片放在http目录以供hls点播服务使用。
为了完成这样的操作,需要频繁对硬盘进行读写,同时又必须等到录像文件生成后才能切成ts和m3u8文件。
使用pingos快速实现HLS录像和点播
pingos项目中的nginx-rtmp-module模块可以极大地简化上述流程,用户甚至可以直接对当前直播时间一分钟以内的内容进行点播,不尽在效率和点播内容的时效性上有很大改善,在机器资源配置上也节省了切片服务。
需要注意的是,我们应该尽量将录像服务和直播服务器独立,因为直播服务器对磁盘并无太高要求,仅对转发效率和带宽要求较高。
而录像服务队磁盘空间和磁盘读写性能要求都比较高,所以面对不同应用场景需要配备不同类型的硬件。
下面给出直播服务器和录像服务器配置方案:
假设 录像服务器IP为 192.168.1.3,下面是直播服务器和录像服务器的配置模板(注意:直播服务器和录像服务器是分开部署的)
直播配置模板
user root;
daemon on;
master_process on;
worker_processes 1;
#worker_rlimit 4g;
#working_directory /usr/local/openresty/nginx/logs;
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
worker_rlimit_nofile 102400;
worker_rlimit_core 2G;
working_directory /tmp;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
multi_listen unix:/tmp/http 80;
}
stream_zone buckets=1024 streams=4096;
rtmp {
log_format log_json '{$remote_addr, [$time_local]}';
access_log logs/rtmp.log trunc=2s;
server {
listen 1935;
serverid 000;
out_queue 2048;
application live {
rtmp_auto_pull on;
rtmp_auto_pull_port unix:/tmp/rtmp;
live_record on;
live_record_path /tmp/record;
live_record_interval 1m;
push rtmp://192.168.1.3/live;
live on;
wait_key on;
wait_video on;
cache_time 3s;
low_latency off;
fix_timestamp 0s;
# h265 codecid, default 12
hevc_codecid 12;
}
}
}
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" "$http_X-Real-IP" "$host"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
location /rtmp_stat {
rtmp_stat all;
rtmp_stat_stylesheet /stat.xsl;
}
location /xstat {
rtmp_stat all;
}
location /sys_stat {
sys_stat;
}
location / {
chunked_transfer_encoding on;
root html/;
}
}
录像配置模板
user root;
daemon on;
master_process on;
worker_processes 1;
#worker_rlimit 4g;
#working_directory /usr/local/openresty/nginx/logs;
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
worker_rlimit_nofile 102400;
worker_rlimit_core 2G;
working_directory /tmp;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
stream_zone buckets=1024 streams=4096;
rtmp {
log_format log_json '{$remote_addr, [$time_local]}';
access_log logs/rtmp.log trunc=2s;
server {
listen 1935;
serverid 000;
out_queue 2048;
application live {
rtmp_auto_pull on;
rtmp_auto_pull_port unix:/tmp/rtmp;
live_record on;
live_record_path /tmp/record;
live_record_interval 1m;
live on;
# h265 codecid, default 12
hevc_codecid 12;
}
}
}
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" "$http_X-Real-IP" "$host"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
location /rtmp_stat {
rtmp_stat all;
rtmp_stat_stylesheet /stat.xsl;
}
location /xstat {
rtmp_stat all;
}
location /sys_stat {
sys_stat;
}
location / {
chunked_transfer_encoding on;
root html/;
}
}