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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 18

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

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

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

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

file

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

点赞 :+1: :+1:

4年前 评论

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

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

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

3年前 评论

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

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

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

3年前 评论

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

2年前 评论

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