ffmpeg+nginx服务器 将USB摄像头|网络摄像头|本地文件 推流rtmp,使用VLC拉流观看
注意
如果使用的是阿里云、华为云或腾讯云这类云服务器作为nginx服务器,需要在实例中添加安全组,包含需要的端口号,否则会出现输出错误问题
一、安装
1、依赖文件
先安装PCRE pcre-devel 和Zlib,配置nginx的时候会用到这两个东西
安装pcre
sudo apt-get install libpcre3 libpcre3-dev
安装zlib依赖库
sudo apt-get install zlib1g-dev
安装ssl依赖库
sudo apt-get install libssl-dev
2、ffmpeg
安装ffmpeg
sudo apt-get install ffmpeg
查看版本
ffmpeg -version
#结果:
ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
如果报错,应该是缺少相应文件,检查 1、依赖文件是否有疏漏
3、nginx与ffmpeg
在自己安装软件的文件位置使用以下命令,将以下两个文件放在同一目录下
下载rtmp模块
git clone https://github.com/arut/nginx-rtmp-module.git
下载nginx
wget http://nginx.org/download/nginx-1.19.1.tar.gz
解压与安装:
tar -zxvf nginx-1.19.1.tar.gz
进入解压目录:
cd nginx-1.19.1
配置makefile:
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module --with-http_gzip_static_module \
--with-http_stub_status_module --with-pcre \
--with-http_v2_module \
--add-module=../nginx-rtmp-module
注意:
最后的”--add-module=../nginx-rtmp-module “ 的“../nginx-rtmp-module”是下载rtmp模块目录
编辑与安装nginx:
make && make install
修改nginx配置文件
修改的目的是:修改nginx网页打开目录、网页打开视频目录、rtmp推流拉流端口号
nvim /usr/local/nginx/conf/nginx.conf
配置文件nginx.conf结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
我的配置
主要修改了nginx网页根目录以及视频根目录,rtmp推流相关
#user root
worker_processes 2; #进程数
#pid /usr/local/nginx/pid/nginx.pid #指定nginx进程运行文件存放地址
# worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log error; #日志路径
events {
# accept_mutex on; #设置网络连接序列化,互斥锁 默认为ON
multi_accept on; #设置一个进程是否同时接受多个网络连接 默认为OFF
#user epoll; #设置事件驱动模型 slect|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接树,默认512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
autoindex on; #开启nginx目录浏览功能
sendfile on; #允许使用sendfile方式发送文件,默认为off
keepalive_timeout 65; #超时时间 默认为75秒
error_page 404 500 502 503 504 /home/webdir/webpages/50x.html;
server {
listen 80;
server_name localhost;
location / {
root /home/webdir/webpages/;
index index.html index.htm;
}
#播放本地视频 输入ip/test.mp4
location ~ \.mp4 {
root /home/webdir/video/;
}
include servers;
}
rtmp
{
server
{
listen 1935;
chunk_size 4096;
application live#rtmp推流请求路径
{
live on;
max_connections 1024;
}
}
}
二、测试使用
启动nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过 -h查看帮助命令。
1、本地视频直接播放
如上面nginx配置文件中的地址:/home/webdir/webpages/
将视频文件放入该目录下,如我放的是test.mp4
浏览器输入
http://xxx.xxx.xxx.xxx/test.mp4
效果:
2、本地视频推流
在文件目录下 使用如下命令
ffmpeg -i test.mp4 -f flv "rtmp://xxx.xxx.xxx.xxx:端口号/live/test"
在vlc播放器中选择网络流观看
输入rtsp或rtmp地址
rtsp://用户名:密码@192.168.1.xxx:554/stream2
rtmp://xxx.xxx.xxx.xxx:端口号/live/test
3、摄像头推流
rtsp源码流
使用的是tplink的网络摄像头
直接使用vcl在局域网内拉流观看rtsp流
rtsp://admin:密码@192.168.1.xxx:554/stream2
推流生成的rtmp码流
使用ffmpeg 将rtsp流推送到rtmp服务器
ffmpeg -i "rtsp://admin:密码@192.168.1.xxx:554/stream2" -r 50 -ar 44100 -f flv "rtmp://xxx.xxx.xxx.xxx:端口号/live/test"
-r 50帧
-ar 44100 音频采样率
可以很明显的看出rtsp源码流清晰度高于rtmp
USB摄像头
ffmpeg -i "/dev/video0" -r 50 -ar 44100 -f flv "rtmp://xxx.xxx.xxx.xxx:端口号/live/test"