rtsp通过ffmpeg+nginx发布成rtmp和http-flv部署文档

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情


第一章 部署nginx

一、准备环境

1.1、服务器资源

服务名称:测试环境服务器

IP:[请查看资源分配文档]

操作系统:CentOS 6.8 x64

二、安装nginx

2.1、nginx下载

nginx下载

下载地址:nginx.org/en/download…

image.png

nginx-http-flv-module下载

下载地址:github.com/winshining/…

image.png

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

image.png

外网访问地址结果:

image.png

第二章 部署ffmpeg

一、 服务器资源

1.1、服务器资源

服务名称:测试环境服务器

IP:[请查看资源分配文档]

操作系统:CentOS 6.8 x64

二、安装ffmpeg

2.1、ffmpeg下载

下载地址:www.ffmpeg.org/releases/

image.png

yasm 下载

下载地址:www.tortall.net/projects/ya…

image.png

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

image.png image.png

第三章 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流:

image.png

  • 对应源码
<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查看:

image.png

  • 对应源码
<!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部署的过程了。

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

个人理解,可能也不够全面,班门弄斧了。

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

image.png

猜你喜欢

转载自juejin.im/post/7112447342384513031