RTMP服务器搭建与视频流推送
在这篇文章中,我将详述如何搭建一个RTMP(Real-Time Messaging Protocol
)服务器,并使用ffmpeg技术进行本地视频的推流或者进行直播推流。
部署前的准备
安全组防火墙开放1935
端口并安装ffmpeg
sudo yum update -y
sudo yum install ffmpeg ffmpeg-devel -y
搭建基于NGINX的RTMP直播服务器
安装wget
yum install wget -y
安装 gcc gcc-c++
yum install gcc gcc-c++ -y
安装PCRE库
cd /usr/local/
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install
安装openssl
cd /usr/local/
wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
tar -zxvf openssl-1.0.1j.tar.gz
cd openssl-1.0.1j
./config
make && make install
如果提示You need Perl 5,则输入下面这个命令:
yum install Perl 5 -y
安装zlib
cd /usr/local/
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
./configure
make && make install
下载nginx-rtmp-module
cd /usr/local/
yum install git -y
git clone https://github.com/arut/nginx-rtmp-module.git
安装nginx
修改nginx配置文件
在http{
前加入:
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4000;
application mxvideo {#rtmp推流请求路径 (切记路径错了会推不上流)
live on; #开启实时
hls on; #开启hls
hls_path /usr/local/src/nginx/html/mxvideo; #rtmp推流请求路径,文件存放路径
hls_fragment 5s; #每个TS文件包含5秒的视频内容
}
}
}
![图片[1]-搭建基于RTMP协议服务器并推送视频流-铭心博客](https://oss.imxbk.com//blog/WordPress/img/wz/%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8ERTMP%E5%8D%8F%E8%AE%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%8E%A8%E9%80%81%E8%A7%86%E9%A2%91%E6%B5%81/1.webp?x-oss-process=image/auto-orient,1/format,webp/watermark,text_d3d3Lnd3cnUuY24,type_ZmFuZ3poZW5naGVpdGk,size_10,g_se,x_10,y_10)
修改完成后,重启nginx
此时已经成功地在本地启动了一个RTMP服务器,它监听在1935端口。
推拉流
打开obs设置推流
![图片[2]-搭建基于RTMP协议服务器并推送视频流-铭心博客](https://oss.imxbk.com//blog/WordPress/img/wz/%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8ERTMP%E5%8D%8F%E8%AE%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%8E%A8%E9%80%81%E8%A7%86%E9%A2%91%E6%B5%81/2.webp?x-oss-process=image/auto-orient,1/format,webp/watermark,text_d3d3Lnd3cnUuY24,type_ZmFuZ3poZW5naGVpdGk,size_10,g_se,x_10,y_10)
右下角变为绿色方块则推流成功
使用本地播放器拉流
使用VLC播放器或者PotPlayer播放器播放http的m3u8地址。或者是使用支持rtmp协议的播放器拉流。
![图片[3]-搭建基于RTMP协议服务器并推送视频流-铭心博客](https://oss.imxbk.com//blog/WordPress/img/wz/%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8ERTMP%E5%8D%8F%E8%AE%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%8E%A8%E9%80%81%E8%A7%86%E9%A2%91%E6%B5%81/3.webp?x-oss-process=image/auto-orient,1/format,webp/watermark,text_d3d3Lnd3cnUuY24,type_ZmFuZ3poZW5naGVpdGk,size_10,g_se,x_10,y_10)
Docker搭建RTMP服务器并进行本地视频推流
安装Docker的步骤会根据操作系统的不同而变化。下面是在Ubuntu和Centos上安装Docker的命令:
#Ubuntu
sudo apt-get update
sudo apt-get install docker.io
#Centos
sudo yum update -y
sudo yum install docker -y
如果你使用的是其他操作系统,请参照Docker的官方文档进行安装。
下载开源项目nginx-rtmp-docker到你的本地目录
git clone https://github.com/tiangolo/nginx-rtmp-docker.git
cd nginx-rtmp-docker
运行服务器
docker run -d -p 1935:1935 --name=nginx-rtmp tiangolo/nginx-rtmp
此时已经成功地在本地启动了一个RTMP服务器,它监听在1935端口。
使用ffmpeg进行视频推流
你需要有一个视频文件(请自行上传)用于推流。然后,使用以下命令进行推流:
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost/live/stream #input.mp4是你的视频文件,rtmp://localhost/live/stream是你的RTMP服务器地址。
![图片[4]-搭建基于RTMP协议服务器并推送视频流-铭心博客](https://oss.imxbk.com//blog/WordPress/img/wz/%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8ERTMP%E5%8D%8F%E8%AE%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%8E%A8%E9%80%81%E8%A7%86%E9%A2%91%E6%B5%81/4.webp?x-oss-process=image/auto-orient,1/format,webp/watermark,text_d3d3Lnd3cnUuY24,type_ZmFuZ3poZW5naGVpdGk,size_10,g_se,x_10,y_10)
在这个例子中,ffmpeg是用于将视频文件推送(stream)到建立的RTMP服务器。而这个RTMP服务器就是通过Docker运行的nginx-rtmp容器提供的。
docker run -d -p 1935:1935 –name=nginx-rtmp tiangolo/nginx-rtmp命令启动了一个名为”nginx-rtmp”的容器,它监听主机的1935端口。
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost/live/stream命令将名为”input.mp4″的视频文件转换成流,然后推送到”rtmp://localhost/live/stream”。其中”localhost”指的是本地主机,即RTMP服务器所在的主机。“1935″是RTMP协议默认的端口号,如果没有特别指定,就会使用这个端口。”/live/stream”是推流的路径和名称,你可以根据需要自定义。
所以,在URL上看,ffmpeg推流到”rtmp://localhost/live/stream”实际上就是推流到了通过Docker启动的nginx-rtmp容器的1935端口。
简单来说,ffmpeg是推流客户端,而nginx-rtmp容器是流媒体服务器,二者之间通过RTMP协议进行通信。
因为流媒体服务器(nginx-rtmp)和ffmpeg推流端是在服务器(192.168.1.11)上运行,使用windows电脑能够用VLC播放RTMP流,所以执行以下命令:
ffmpeg -re -i forest4kTest.mp4 -c copy -f flv rtmp://192.168.1.11/live/stream
使用本地播放器拉流
使用VLC播放器或者PotPlayer播放器播放RTMP流,或者是使用支持rtmp协议的播放器拉流。
![图片[5]-搭建基于RTMP协议服务器并推送视频流-铭心博客](https://oss.imxbk.com//blog/WordPress/img/wz/%E6%90%AD%E5%BB%BA%E5%9F%BA%E4%BA%8ERTMP%E5%8D%8F%E8%AE%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E6%8E%A8%E9%80%81%E8%A7%86%E9%A2%91%E6%B5%81/5.webp?x-oss-process=image/auto-orient,1/format,webp/watermark,text_d3d3Lnd3cnUuY24,type_ZmFuZ3poZW5naGVpdGk,size_10,g_se,x_10,y_10)
推流脚本
可以配合screen
命令来使用
使用脚本
新建pushflow.sh
文件
vim pushflow.sh
把下面的代码粘贴进去
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#=================================================================#
# System Required: CentOS7 X86_64 #
# Description: FFmpeg Stream Media Server #
#=================================================================#
# 颜色选择
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
font="\033[0m"
ffmpeg_install(){
# 安装FFMPEG
read -p "你的机器内是否已经安装过FFmpeg4.x?安装FFmpeg才能正常推流,是否现在安装FFmpeg?(yes/no):" Choose
if [ $Choose = "yes" ];then
yum -y install wget
wget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xz
tar -xJf ffmpeg-4.0.3-64bit-static.tar.xz
cd ffmpeg-4.0.3-64bit-static
mv ffmpeg /usr/bin && mv ffprobe /usr/bin && mv qt-faststart /usr/bin && mv ffmpeg-10bit /usr/bin
fi
if [ $Choose = "no" ]
then
echo -e "${yellow} 你选择不安装FFmpeg,请确定你的机器内已经自行安装过FFmpeg,否则程序无法正常工作! ${font}"
sleep 2
fi
}
stream_start(){
# 定义推流地址和推流码
read -p "输入你的推流地址和推流码(rtmp协议):" rtmp
# 判断用户输入的地址是否合法
if [[ $rtmp =~ "rtmp://" ]];then
echo -e "${green} 推流地址输入正确,程序将进行下一步操作. ${font}"
sleep 2
else
echo -e "${red} 你输入的地址不合法,请重新运行程序并输入! ${font}"
exit 1
fi
# 定义视频存放目录
read -p "输入你的视频存放目录 (格式仅支持mp4,并且要绝对路径,例如/opt/video):" folder
# 判断是否需要添加水印
read -p "是否需要为视频添加水印?水印位置默认在右上方,需要较好CPU支持(yes/no):" watermark
if [ $watermark = "yes" ];then
read -p "输入你的水印图片存放绝对路径,例如/opt/image/watermark.jpg (格式支持jpg/png/bmp):" image
echo -e "${yellow} 添加水印完成,程序将开始推流. ${font}"
# 循环
while true
do
cd $folder
for video in $(ls *.mp4)
do
ffmpeg -re -i "$video" -i "$image" -filter_complex overlay=W-w-5:5 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv ${rtmp}
done
done
fi
if [ $watermark = "no" ]
then
echo -e "${yellow} 你选择不添加水印,程序将开始推流. ${font}"
# 循环
while true
do
cd $folder
for video in $(ls *.mp4)
do
ffmpeg -re -i "$video" -c:v copy -c:a aac -b:a 192k -strict -2 -f flv ${rtmp}
done
done
fi
}
# 停止推流
stream_stop(){
screen -S stream -X quit
killall ffmpeg
}
# 开始菜单设置
echo -e "${yellow} CentOS7 X86_64 FFmpeg无人值守循环推流 For LALA.IM ${font}"
echo -e "${red} 请确定此脚本目前是在screen窗口内运行的! ${font}"
echo -e "${green} 1.安装FFmpeg (机器要安装FFmpeg才能正常推流) ${font}"
echo -e "${green} 2.开始无人值守循环推流 ${font}"
echo -e "${green} 3.停止推流 ${font}"
start_menu(){
read -p "请输入数字(1-3),选择你要进行的操作:" num
case "$num" in
1)
ffmpeg_install
;;
2)
stream_start
;;
3)
stream_stop
;;
*)
echo -e "${red} 请输入正确的数字 (1-3) ${font}"
;;
esac
}
# 运行开始菜单
start_menu
出现报错”/bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)“使用以下文章进行操作
运行脚本
chmod +x pushflow.sh
sudo bash pushflow.sh
暂无评论内容