5 分钟完成 Nginx 直播服务部署(直播 + 分流 + 画面水印) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ar414
V2EX    问与答

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

  ar414 2020-03-17 18:08:11 +08:00 3548 次点击
这是一个创建于 2034 天前的主题,其中的信息可能已经有所发展或是发生改变。

前言

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

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

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

朋友需求的拓扑示意图:

ar414-nginx-rtmp

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

ar414-nginx-service

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

部署运行

服务器

  • 安装 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 播放测试工具: http://player.alicdn.com/aliplayer/setting/setting.html (如果配置了证书则使用 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
    • 有水印:需要分流到其他服务器上

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

完整配置文件

  • 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 | 水印图片的高度 |

结语

  • 如果觉得对你有帮助请给我一个start
13 条回复    2020-06-17 14:49:26 +08:00
HTSdTt3WygdgQQGe
    1
HTSdTt3WygdgQQGe  
   2020-03-17 18:14:07 +08:00 via Android
不错,收藏
ar414
    2
ar414  
OP
   2020-03-17 18:27:25 +08:00
为啥我发到 nginx 节点 会跑到提问这,奇了个怪
herozzm
    3
herozzm  
   2020-03-17 18:29:22 +08:00 via Android
@ar414 #2 系统匹配节点吧
npe
    4
npe  
   2020-03-17 18:36:34 +08:00
直播主要是流量和带宽,不如直接用各厂大解决方案。
MeteorCat
    5
MeteorCat  
   2020-03-17 18:39:08 +08:00 via Android
我记得很容易断,很不稳定
ar414
    6
ar414  
OP
   2020-03-17 19:08:42 +08:00
@npe 你可能没有实操过
ar414
    7
ar414  
OP
   2020-03-17 19:09:33 +08:00
@MeteorCat 检查网络和 CPU
MeteorCat
    8
MeteorCat  
   2020-03-17 19:31:51 +08:00 via Android
@ar414 这个 1M2G 这种小鸡配置可以运行吗?
MonoLogueChi
    9
MonoLogueChi  
   2020-03-17 19:55:42 +08:00 via Android
这种情况直接 SRS 就可以,以前也是自己编译 nginx,后来搞得烦了,直接留一份二进制文件,再后来留的那份二进制文件找不到了,就直接 SRS 了
ar414
    10
ar414  
OP
   2020-03-17 20:02:42 +08:00
@MeteorCat 这配置跑不动 吃 CPU,你运行的时候查看 CPU 负荷
cctv6
    11
cctv6  
   2020-03-18 09:07:10 +08:00 via iPhone
第一次见到这种操作
npe
    12
npe  
   2020-03-18 10:42:17 +08:00
@ar414 我的意思是 nginx 服务器需要较高的配置来支撑,随之的成本也就很高,那既然商用为什么不一步到位上大厂的直播解决方案省时省力。。 (如果只是学习的话当我没说)
garychang
    13
garychang  
   2020-06-17 14:49:26 +08:00
不错,收藏
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2611 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 29ms UTC 06:19 PVG 14:19 LAX 23:19 JFK 02:19
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86