搭建基于RTMP协议服务器并推送视频流

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的安装与配置-铭心博客
NGINX的安装与配置-铭心博客
3年前
0705121

修改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协议服务器并推送视频流-铭心博客

修改完成后,重启nginx

此时已经成功地在本地启动了一个RTMP服务器,它监听在1935端口。

推拉流

打开obs设置推流

图片[2]-搭建基于RTMP协议服务器并推送视频流-铭心博客

右下角变为绿色方块则推流成功

使用本地播放器拉流

使用VLC播放器或者PotPlayer播放器播放http的m3u8地址。或者是使用支持rtmp协议的播放器拉流。

图片[3]-搭建基于RTMP协议服务器并推送视频流-铭心博客

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协议服务器并推送视频流-铭心博客

在这个例子中,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协议服务器并推送视频流-铭心博客

推流脚本

可以配合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
© 版权声明
THE END
喜欢就支持一下吧!
点赞345 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容