5 分钟完成 Nginx 直播服务部署(直播 + 分流 + 画面水印)

ar414-nginx-rtmp-ffmpeg

:two_men_holding_hands:前言

最近帮朋友的公司部署了一套分流+水印的直播系统

顺手打包成docker镜像,方便大家需要用到的时候开箱即用,不需要百度一些零碎的文章
也可做简单的直播服务,只需调整配置文件便可达到你的需求.

需求:将直播流分流到两个云厂商的直播云,一个有水印,一个无水印。使用hls播放

朋友需求的拓扑示意图:

ar414-nginx-rtmp

当前拓扑示意图(阿里云和腾讯云不方便放出推流和拉流地址,有兴趣的同学可以去申请玩一下)

ar414-nginx-service

:whale:docker-nginx-rtmp-ffmpeg

基于docker-nginx-rtmp进行配置部署,这篇文章的意义是实现直播分流及直播画面水印.

  • Nginx 1.16.1(从源代码编译的稳定版本)
  • nginx-rtmp-module 1.2.1(从源代码编译)
  • ffmpeg 4.2.1(从源代码编译)
  • 已配置好的nginx.conf
    • 只支持1920*1080(如需支持其他分辨率可参考nginx.conf
    • 实现两路分流
      • 本机
      • 直播云(例:阿里云、腾讯云、ucloud)
    • 实现直播水印效果
      • 水印图片存放位置(容器内):/opt/images/logo.png

:computer:部署运行

服务器

  • 安装docker(Centos7,其他系统请发挥你的搜索功能)
    $ yum -y install docker #安装docker
    $ systemctl enable docker #配置开机启动
    $ systemctl start docker #启动docker服务
  • 拉取docker镜像并运行
    #如果速度慢可使用阿里云:docker pull registry.cn-shenzhen.aliyuncs.com/ar414/nginx-rtmp-ffmpeg:v1
    $ docker pull ar414/nginx-rtmp-ffmpeg
    $ docker run -it -d -p 1935:1935 -p 8080:80 --rm ar414/nginx-rtmp-ffmpeg
  • 推流地址(Stream live content to):
    rtmp://<server ip>:1935/stream/$STREAM_NAME
  • SSL证书

将证书复制到容器内,并在容器内修改nginx.conf配置文件,然后重新commit(操作容器内的文件都需要重新commit才会生效)

#/etc/nginx/nginx.conf
listen 443 ssl;
ssl_certificate     /opt/certs/example.com.crt;
ssl_certificate_key /opt/certs/example.com.key;

OBS配置

  • Stream Type: Custom Streaming Server
  • URL: rtmp://<server ip>:1935/stream
  • Stream Key:ar414
    obs-config

观看测试

HLS播放测试工具:player.alicdn.com/aliplayer/setting... (如果配置了证书则使用https)

  • HLS播放地址
    • 有水印:http://<server ip>:8080/hls/ar414_wm.m3u8
      ar414-hls-wm
    • 无水印:http://<server ip>:8080/hls/ar414.m3u8
      ar414-hls

RTMP测试工具:PotPlayer

  • RTMP播放地址
    • 无水印:rtmp://<server ip>:1935/stream/ar414
      ar414-rtmp
    • 有水印:需要分流到其他服务器上

:page_facing_up:配置文件简解(分流、水印及水印位置)

完整配置文件

  • RTMP配置

    rtmp {
      server {
          listen 1935; #端口
          chunk_size 4000;
          #RTMP 直播流配置
          application stream {
              live on;
              #添加水印及分流,这次方便测试直接分流到当前服务器hls
              #实际生产一般都分流到直播云(腾讯云、阿里云、ucloud)
              #只需把需要分流的地址替换即可
              #有水印:rtmp://localhost:1935/hls/$name_wm
              #无水印:rtmp://localhost:1935/hls/$name
              exec ffmpeg -i rtmp://localhost:1935/stream/$name -i /opt/images/ar414.png
                -filter_complex "overlay=10:10,split=1[ar414]"
                -map '[ar414]' -map 0:a -s 1920x1080 -c:v libx264 -c:a aac -g 30 -r 30 -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost:1935/hls/$name_wm
                -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1920x1080 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name;
          }
    
          application hls {
              live on;
              hls on;
              hls_fragment 5;
              hls_path /opt/data/hls;
          }
      }
    }
  • 如果需要推多个直播云则复制多个 exec ffmpeg即可 如下:

    application stream {
      live on;
      #分流至本机hls           
      exec ffmpeg -i rtmp://localhost:1935/stream/$name -i /opt/images/ar414.png
        -filter_complex "overlay=10:10,split=1[ar414]"
        -map '[ar414]' -map 0:a -s 1920x1080 -c:v libx264 -c:a aac -g 30 -r 30 -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost:1935/hls/$name_wm
        -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1920x1080 -preset superfast -profile:v baseline rtmp://localhost:1935/hls/$name;
    
      #分流至腾讯云
      exec ffmpeg -i rtmp://localhost:1935/stream/$name -i /opt/images/ar414.png
        -filter_complex "overlay=10:10,split=1[ar414]"
        -map '[ar414]' -map 0:a -s 1920x1080 -c:v libx264 -c:a aac -g 30 -r 30 -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://live-push.tencent.com/stream/$name_wm
        -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1920x1080 -preset superfast -profile:v baseline rtmp://live-push.tencent.com/stream/$name;
    
      #分流至阿里云
      exec ffmpeg -i rtmp://localhost:1935/stream/$name -i /opt/images/ar414.png
        -filter_complex "overlay=10:10,split=1[ar414]"
        -map '[ar414]' -map 0:a -s 1920x1080 -c:v libx264 -c:a aac -g 30 -r 30 -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://live-push.aliyun.com/stream/$name_wm
        -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 2500k -f flv -g 30 -r 30 -s 1920x1080 -preset superfast -profile:v baseline rtmp://live-push.aliyun.com/stream/$name;
    }
  • 水印位置

    • 水印位置

      水印图片位置 overlay值
      左上角 10:10
      右上角 main_w-overlay_w-10:10
      左下角 10:main_h-overlay_h-10
      右下角 main_w-overlay_w-10 : main_h-overlay_h-10
    • overlay参数

      参数 说明
      main_w 视频单帧图像宽度(当前配置文件1920)
      main_h 视频单帧图像高度(当前配置文件1080)
      overlay_w 水印图片的宽度
      overlay_h 水印图片的高度

:octocat:结语

ar414

  • 如果觉得对你有帮助请给我一个star

Support Author

coffee alipay wechat

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
AR414
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 18

点赞 :+1: :+1:

4年前 评论

不错,不错,想问下有没有不使用obs就是那种后端语言实现的推流 比如 php这样的 博主用过吗 现在有个项目刚好做到直播,直播端也是手机端,请教下应该怎么设计思路。

4年前 评论
AR414 (楼主) 4年前

搭建直播系统这么简单的么 :joy:

3年前 评论

还有至臻剑魔 @minororange 你呢弟弟

3年前 评论
AR414 (楼主) 3年前

以前 flash 时代,做直播真方便。

一套 as3 代码搞定采集,推送,播放。

服务端使用 adobe media server,代码也是 as2,协议 rtmp。

https://www.mlxiu.com 还可以用,可以分房间,聊天,权限。不过太久没维护了。

file

3年前 评论
AR414 (楼主) 3年前
七月羽歌 (作者) 3年前
七月羽歌 (作者) 3年前

延迟效果 不知道怎么样 哈哈

3年前 评论

大佬,在本地试,用阿里云访问跨域哈

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!