1.配置nginx-rtmp
获取nginx-rtmp源码,并且在编译nginx时使用。
(1)安装依赖
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
(2)下载nginx-rtmp源码包
cd /home/zhou/software
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
(3)解压nginx-rtmp源码包
/home/zhou/software/nginx-rtmp-module-master
2.安装 nginx
(1)切换到管理员用户root
#切换到管理员用户root(很重要)
sudo su
(2)安装依赖(不在管理员模式下要加sudo)
#安装依赖 (不在管理员模式下要加sudo)
apt-get update
apt-get install build-essential
apt-get install libtool
apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g-dev
apt-get install libssl-dev
(3)下载nginx安装包
下载地址:http://nginx.org/download
选择最新版本下载:nginx-1.23.3.tar.gz,并将其放到路径:/home/zhou/software
(4)解压下载的压缩包
cd /home/zhou/software
tar -xvf nginx-1.23.3.tar.gz
(5)进入nginx包目录下
cd /home/zhou/software/nginx-1.23.3
(6)创建nginx用户(执行编译命令前先创建Nginx用户不然后面Nginx运行时会报错)
useradd nginx
(7)执行命令编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-http_sub_module --with-http_mp4_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
# 配置nginx-rtmp
./configure --with-http_ssl_module --add-module=/home/zhou/software/nginx-rtmp-module-master
make
sudo make install
(8)进入安装目录
cd /usr/local/nginx
(9)配置nginx软连接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/
(10)软连接配置完成即以成功开启nginx服务即可,在浏览器上访问对应ip即可
ll /usr/bin/nginx
# 验证配置文件
sudo nginx -t
nginx -v
(11)启动并验证效果
- 启动
nginx -s reload
- 验证
浏览器中数据ip地址(对应配置文件中的server_name)
3.配置 nginx
配置文件路径:/usr/local/nginx/conf/nginx.conf
3.1 文件结构
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http****块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
location块:配置请求的路由,以及各种页面的处理情况。
3.2 默认配置
### 全局块
#user nobody; #配置用户或者组,默认为nobody nobody。
worker_processes 1; #允许生成的进程数,默认为1
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#pid logs/nginx.pid; #指定nginx进程运行文件存放地址
### events块
events {
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#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; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#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;
#}
}
# 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 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
4.推流/拉流测试
需要准备FFmpeg和VLC软件
4.1 配置文件
新建配置文件:/usr/local/nginx/conf/nginx.test.1.conf
#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_auto_push on;
#RTMP服务
rtmp{
server{
listen 8112; #服务端口
chunk_size 4096; #数据传输块的大小
#rtmp点播配置,访问方式:rtmp://127.0.0.1:8112/vod/xxx.mp4
application vod {
play /home/zhou/视频/nginx; #点播视频存放目录,里面放一个xxx.mp4可以直接播放
}
#rtmp协议直播推流
application live {
live on;
record all;
record_path /home/zhou/视频/nginx/rtmp; # 保存路径
#record_max_size 1K;
#append current timestamp to each flv
record_unique on;
#publish only from localhost
#allow publish 127.0.0.1;
#deny publish all;
}
# HLS协议直播推流
application hls {
live on; #开启rtmp直播
hls on; #开启hls支持
wait_video on; #第一个视频帧发送前禁用音频
hls_path /home/zhou/视频/nginx/hls; #文件保存路径,需要先创建,不然执行推流会报错
hls_fragment 5s; #用来设置每一个块的大小。默认是5秒。只能为整数
hls_playlist_length 30s; #设置播放列表的长度,单位是秒,听说设置成3秒延迟低点
hls_nested off; #默认是off。打开后的作用是每条流自己有一个文件夹
hls_cleanup off; #不清理ts, on|off 默认是开着的,是否删除列表中已经没有的媒体块
#hls_continuous: #on|off 设置连续模式,是从停止播放的点开始还是直接跳过
}
}
}
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 8111;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#hls点播地址
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
#或 application/x-mpegURL
video/mp2t ts;
}
alias /home/zhou/视频/nginx/vod/; #点播视频文件(.ts;.m3u8)存放位置
expires -1;
add_header Cache-Control no-cache; #跨域支持,不然网页播放不了
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间
}
点播的概念有些模糊,目前理解就是:
方式1:直接把分片好的m3u8文件作为视频:然后使用http访问
访问方式:在VLC工具里面输入 http://127.0.0.1:8111/hls/xxx.m3u8
方式2:直接使用rtmp协议访问mp4
访问方式:在VLC工具里面输入 rtmp://127.0.0.1:8112/vod/xxx.mp4
4.2 FFMPEG命令
#使用rtmp协议推流
ffmpeg -re -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/live/test
#说明:test.mp4是待推的视频,rtmp://localhost:8112/live/test是推送视频流和拉取视频流的地址,其中test是自己命名的视频名称,可以使用这个地址在VLC中观看直播(拉取直播流)。
#使用hls协议推流(会产生test视频流文件)
ffmpeg -re -i 11.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/hls/test
#说明:11.mp4是待推的视频,rtmp://localhost:8112/live/test是推送视频流和拉取视频流的地址,其中test是自己命名的视频名称,可以使用这个地址在VLC中观看直播(拉取直播流)。
#将mp4切割成m3u8分片
ffmpeg -i 11.mp4 -profile:v baseline -level 3.0 -start_number 0 -force_key_frames "expr:gte(t,n_forced*1)" -hls_time 10 -hls_list_size 0 -f hls test.m3u8
#说明: 11.mp4是等待切割的视频,test.m3u8是切割完成的文件,还有很多切割好的testxx.ts文件。
#-force_key_frames "expr:gte(t,n_forced*1)" 代表每1秒1个关键帧,方便-hls_time 10切割每10秒一个ts文件
#-f hls test.m3u8 输出文件名叫test.m3u8
4.3 调试
在使用FFmpeg推送视频流的同时可以打开VLC工具测试是否有流输出,打开VLC,媒体、打开网络串流、网络、输入网络URL。
(1)rtmp协议推流
#FFMPEG用rtmp协议推流:libx264无法使用
ffmpeg -re -i /home/zhou/视频/test.mp4 -acodec aac -f flv rtmp://localhost:8112/live/test
#VLC拉取trmp协议的视频流:
rtmp://localhost:8112/live/test
(2)hls协议推流
#FFMPEG用hls协议推流(注意会产生m3u8和ts文件):
ffmpeg -re -i /home/zhou/视频/test.mp4 -acodec aac -f flv rtmp://localhost:8112/hls/test
#VLC拉取hls协议的视频流:
rtmp://127.0.0.1:8112/hls/test
5.问题
5.1 启动异常
问题:执行nginx -s reload
解决:链接
cd /usr/local/nginx/sbin/
killall -9 nginx
nginx -t
nginx -c /usr/local/nginx/conf/nginx.conf
5.2 推流错误
问题:执如下代码出现异常
ffmpeg -re -i /home/zhou/视频/test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:8112/live/test
解决:
ffmpeg推流时报错 Unknown encoder 'libx264'
ffmpeg推流时,可能出现错误:Unknown encoder 'libx264'
cd /home/zhou/code/ffmpeg/
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --prefix=/usr/softinstall/x264/ --includedir=/usr/local/include --libdir=/usr/local/lib --enable-shared
出现如下提示,需要安装nasm
If you really want to compile without asm, configure with --disable-asm.
安装方法
https://www.nasm.us/pub/nasm/releasebuilds/2.14/
选择:nasm-2.14.tar.gz
tar xzvf nasm-2.14.tar.gz
cd nasm-2.14
#需要进入root下编译,否则会出现权限问题
sudo su
./configure
make
make install
编译安装x264:
make -j128
make install
编译成功后查看本版:x264 -V
重新编译ffmpeg:
(1)先卸载ffmpeg
cd /home/zhou/code/ffmpeg/ffmpeg
make uninstall
(2)编译
sudo ./configure \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--enable-gpl \
--enable-gnutls \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-libxml2 \
--enable-nonfree
sudo ./configure --enable-gpl --enable-libx264
sudo ./configure --enable-shared
export LD_LIBRARY_PATH=/usr/local/lib/
make -j256
sudo make install