自己动手构建简易广播系统
|Word Count:1.2k|Reading Time:4mins|Post Views:
综合概述
XXX电视直播系统是用于XXX北京研发中心的广播和直播相结合的便宜视频推送系统,使用到了办公环境服务器、监控用电视大屏和监控用主机盒子。
组织架构
逻辑拓扑
整体系统由开源直播系统SRS和开源视频播放器VLC构成,其逻辑拓扑如下:
物理组件
- 一个SRS服务器:VLNX101071(172.31.101.71)
- 十三个视频接收端:172.29.153.165~177
- 推流服务:使用安装OBS工具的公共笔记本电脑
构建软件
视频网关
安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| # 系统准备 yum makecache yum update -y yum install -y git make autoconf m4 gcc cd /opt # 从GITHUB拉取SRS git clone -b 4.0release https://gitee.com/ossrs/srs.git # 编译系统 cd srs/trunk ./configure make # 安装系统 make install ln -sf /usr/local/srs/etc/init.d/srs /etc/init.d/srs cp -f /usr/local/srs/usr/lib/systemd/system/srs.service /usr/lib/systemd/system/srs.service # 启动服务 systemctl daemon-reload systemctl enable --now srs # 配置防火墙 # 8080端口为控制台端口 1935为rtmp拉流端口 1985为SRS群集通讯端口 firewall-cmd --permanent --add-port={8080/tcp,1935/tcp,1985/tcp} firewall-cmd --reload
|
使用
- 登录访问 http://172.31.101.71:8080/
- 进入控制台
- 查看主机信息
- 查看视频流
- 查看客户端
推流
本地推流
FFMPEG是一套功能强大的多媒体视频处理框架,能够完成视频采集、格式转换、视频抓图等各项功能,初步使用方法可以参考《FFmpeg 视频处理入门教程》。我们本次使用它的视频推送功能,以便完成当前需求。
1 2 3 4 5 6 7 8 9 10 11
| # 使用 \\172.31.101.71 打开服务器主机共享文件夹,并上传视频文件 # 最简单的输入输出命令为 ffmpeg -i input.avi output.mp4 # 我们实际使用如下命令 ffmpeg -i /var/liveshow/1840.mp4 -vcodec libx264 -acodec aac -f flv -preset ultrafast -vf fps=25 rtmp://localhost/live/livestream # -i /var/liveshow/1840.mp4 参数指定播放的文件路径 # -vcodec libx264 指定使用H.264编码器进行编码 # -acodec aac 使用aac进行音频编码 # -f flv 输出格式为flv格式 # -preset ultrafast 指定输出的视频质量,可用值为ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow # -vf fps=25 指定帧率为25 # rtmp://localhost/live/livestream 使用rtmp协议推送到本地的Live频道,验证码为livestream
|
我们在本项目中使用Linux主机的crontab定时机制实现定点播放指定内容
1 2 3 4
| # 周一至周五,上午11点59开始静音推流 1150.mp4 文件 00 12 * * 1-5 ffmpeg -re -i /var/liveshow/1150.mp4 -vcodec libx264 -acodec aac -f flv -preset ultrafast -vf fps=25 -threads 4 -vol 0 rtmp://localhost/live/livestream # 周一至周五,下午18点40开始推流 1840.mp4 文件 40 18 * * 1-5 ffmpeg -re -i /var/liveshow/1840.mp4 -vcodec libx264 -acodec aac -f flv -preset ultrafast -vf fps=25 -threads 4 rtmp://localhost/live/livestream
|
OBS推流
OBS是一款开源免费的直播推流软件,支持当前的主流系统平台和直播平台,具有良好的兼容性和功能性。
推流设置
视频来源
推流与录制
SRS视频流
电视大屏
VLC Media Player 是一个老牌的流媒体播放器,以跨平台的兼容性和丰富的媒体支持而著称。
拉流
我们在电视大屏的监控主机上使用vlc播放器的客户端版本cvlc来实现主动从172.31.101.71上拉取视频流
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash # 配置变量环境 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash HOME=/home/fxiaoke # 配置视频和音频环境 export XDG_RUNTIME_DIR="/run/user/1000" DISPLAY=:0.0 # 调用cvlc播放,音频输出到第一个HDMI接口 cvlc --fullscreen --play-and-exit --alsa-audio-device hw:0,0 http://172.31.101.71:8080/live/livestream.flv
|
定时播放
为了实现以下目标:
- 电视大屏主机实现定时播放SRS视频网关上推送的视频流;
- 可自定义拉起视频流,实现电视直播
我们使用了Linux主机的Crontab和Ansible两种技术来实现。
计划任务
1 2 3
| # 配置客户端定时调用播放脚本 # Ansible: Live Show 00 12 * * * /bin/bash /home/fxiaoke/play.sh
|
批量下发
1 2 3 4 5 6 7 8
| # 使用Ansible Cron模块下发定时任务,指定12:00静音播放SRS网关视频流 ansible TV -m cron -a "name='Play Steam Live Show' minute=00 hour=12 job='/bin/bash /home/fxiaoke/play.sh' user=fxiaoke disabled=no"
# 使用Ansible Cron模块下发定时任务,指定18:00播放SRS网关视频流 ansible TV -m cron -a "name='Play Steam Live Show Again' minute=40 hour=18 job='/bin/bash /home/fxiaoke/play.sh' user=fxiaoke disabled=no"
# 使用Ansible Cron模块下发临时任务,指定某一时刻临时播放SRS网关视频流 ansible TV -m cron -a "name='Live Show Test' minute=13 hour=12 job='/bin/bash /home/fxiaoke/play.sh' user=fxiaoke disabled=yes"
|