持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
第一章 部署nginx
一、准备环境
1.1、服务器资源
服务名称:测试环境服务器
IP:[请查看资源分配文档]
操作系统:CentOS 6.8 x64
二、安装nginx
2.1、nginx下载
nginx下载
nginx-http-flv-module下载
2.2、nginx安装
把nginx-1.16.1.tar.gz和nginx-http-flv-module-1.2.7.tar.gz,上传到/opt/tools目录下
创建nginx目录
# mkdir /usr/local/nginx
解压nginx和nginx-flv
# cd /opt/tools
# tar -zxvf nginx-1.16.1.tar.gz
# tar -zxvf nginx-http-flv-module-1.2.7.tar.gz -C /usr/local/nginx/
目录改名
# cd /usr/local/nginx
# mv nginx-http-flv-module-1.2.7 nginx-http-flv-module
安装nginx所需依赖项
yum -y install gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
安装nginx
# cd /opt/tools/nginx-1.16.1
# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx/nginx-http-flv-module
# make && make install
修改配置文件
# cd /usr/local/nginx
# vi conf/nginx.conf
修改为以下内容:
worker_processes 1;
events {
worker_connections 1024;
}
#rtmp配置
rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
server {
listen 1935;
application live {
live on;
record off;
gop_cache on;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80; #nginx的端口,默认是80
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#http-flv的配置
location /live {
flv_live on;
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
三、配置防火墙
启动80、1935端口
# vi /etc/sysconfig/iptables
添加以下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT\
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1935 -j ACCEPT
重启防火墙
# service iptables restart
四、启动nginx
4.1、启动nginx
# /usr/local/nginx/sbin/nginx
4.2、重启nginx
# /usr/local/nginx/sbin/nginx -s reload
4.3、关闭nginx
# /usr/local/nginx/sbin/nginx -s stop
4.4、检验nginx
# curl http://localhost:80
外网访问地址结果:
第二章 部署ffmpeg
一、 服务器资源
1.1、服务器资源
服务名称:测试环境服务器
IP:[请查看资源分配文档]
操作系统:CentOS 6.8 x64
二、安装ffmpeg
2.1、ffmpeg下载
yasm 下载
下载地址:www.tortall.net/projects/ya…
2.2、ffmpeg安装
把ffmpeg-4.2.tar.g和yasm-1.3.0.tar.gz,上传到/opt/tools目录下,
解压安装yasm:
# cd /opt/tools
# tar -zxvf yasm-1.3.0.tar.gz
# cd yasm-1.3.0
# ./configure
# make && make install
解压安装ffmpeg:
# cd /opt/tools
# tar -zxvf ffmpeg-4.2.tar.gz
# ./configure --enable-shared --prefix=/usr/local/ffmpeg
# make && make install 编译过程有点长,耐心等待...
将ffmpeg的lib加载到系统库:
# vi /etc/ld.so.conf
在文件末尾添加以下内容:
/usr/local/ffmpeg/lib
使修改生效:
# ldconfig
将ffmpeg添加到环境变量中
# vi /etc/profile
在文件末尾添加以下内容:
#ffmpeg env
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$FFMPEG_HOME/bin:$PATH
使修改生效:
# source /etc/profile
校验ffmpeg是否生效:
# ffmpeg
第三章 ffmpeg推送流
一、通过ffmpeg将rtsp转成rtmp推送到nginx
# ffmpeg -re -rtsp_transport tcp -i rtsp://username:passowrd@ip:port -vcodec h264 -c copy -f flv rtmp://127.0.0.1/live/1019232
参数 名称 | 含义 | 备注 |
---|---|---|
-re | 输入 | 以原始帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(这可能会导致数据包丢失)。默认情况下,ffmpeg尝试尽快读取输入。此选项会将输入的读取速度减慢到输入的原始帧速率。对于实时输出(例如实时流)很有用。 |
-rtsp_transport | 设定推送流方式 | UDP和TCP |
-i | 输入 | 可设定rtsp输入流地址(rtsp://[username]:[password]@[ip]:[port]/)username: 用户名。例如admin。password: 密码。例如12345。ip: 为设备IP。例如 192.0.0.64。port: 端口号默认为554 |
-vcodec | 视频编解码器 | 一般后面加copy表示拷贝 |
-acodec | 音频编解码器 | libmp3lame |
-c | 编解码器 | 编解码器(每个流的输入/输出) |
-f | (输入/输出) | 强制输入或输出文件格式。通常会自动检测输入文件的格式,并从文件扩展名中猜测输出文件的格式,因此在大多数情况下不需要此选项。 |
- 效果预览查看
1.1.使用flash查看rtmp流:
- 对应源码
<html>
<embed src='./swfs/SampleMediaPlayback.swf'
width='600px' height='400px' quality='high'
bgcolor='#000000' name='SampleMediaPlayback' allowfullscreen='true'
pluginspage='http://www.adobe.com/go/getflashplayer'
flashvars='&src=rtmp://192.168.133.130/live/1019232&
autoHideControlBar=true&streamType=recorded&autoPlay=true&verbose=true'
type='application/x-shockwave-flash' wmode='Opaque'>
</embed>
</html>
1.2.使用flv.js查看:
- 对应源码
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>flv.js demo</title>
<style>
.mainContainer {
display: block;
width: 540px;
margin-left: auto;
margin-right: auto;
}
.centeredVideo {
display: block;
width: 100%;
height: 306px;
margin-left: auto;
margin-right: auto;
margin-bottom: auto;
}
</style>
</head>
<body>
<div class="mainContainer">
<video name="videoElement" class="centeredVideo" id="videoElement" controls autoplay muted>
Your browser is too old which doesn't support HTML5 video.
</video>
</div>
<script src="./js/flv.min.js?v=2"></script>
<script>
var flvPlayer;
if (flvjs.isSupported()) {
startVideo()
}
function startVideo() {
var videoElement = document.getElementById('videoElement');
flvPlayer = flvjs.createPlayer({
type: 'flv',
enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
isLive: true, //直播模式
hasAudio: false, //关闭音频
hasVideo: true,
stashInitialSize: 128,
enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
url: 'http://192.168.133.130/live?app=live&stream=1019232'
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
//消除时延
setInterval(function () {
if (!flvPlayer.buffered.length) {
return;
}
var end = flvPlayer.buffered.end(0);
var diff = end - flvPlayer.currentTime;
if (diff >= 1) {
flvPlayer.currentTime = parseInt(end);
}
}, 3000)
}
videoElement.addEventListener('click', function () {
reloadVideo();
})
function destoryVideo() {
flvPlayer.pause();
flvPlayer.unload();
flvPlayer.detachMediaElement();
flvPlayer.destroy();
flvPlayer = null;
}
function reloadVideo() {
destoryVideo();
startVideo();
}
</script>
</body>
</html>
二、通过ffmpeg将rtsp转成rtmp推送到nginx(后台挂起方式运行)
#ffmpeg -re -rtsp_transport tcp -i rtsp://username:password@ip:port -vcodec h264 -c copy -flvflags no_duration_filesize -f flv rtmp://127.0.0.1/live/1019232 > /dev/null 2>&1 < /dev/null &
好了,以上就是rtsp通过ffmpeg+nginx发布成rtmp和http-flv部署的过程了。
个人理解,可能也不够全面,班门弄斧了。
好了,今天就先到这里了!!!^_^
个人理解,可能也不够全面,班门弄斧了。
如果觉得有收获的,帮忙点赞、评论、收藏
一下呗!!!