综合概述

XXX电视直播系统是用于XXX北京研发中心的广播和直播相结合的便宜视频推送系统,使用到了办公环境服务器、监控用电视大屏和监控用主机盒子。

组织架构

逻辑拓扑

整体系统由开源直播系统SRS和开源视频播放器VLC构成,其逻辑拓扑如下:
liveshow-topo

物理组件

  1. 一个SRS服务器:VLNX101071(172.31.101.71)
  2. 十三个视频接收端:172.29.153.165~177
  3. 推流服务:使用安装OBS工具的公共笔记本电脑

构建软件

视频网关

安装

# 系统准备
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

使用

  1. 登录访问 http://172.31.101.71:8080/
    liveshow-server-1
  2. 进入控制台
    liveshow-server-1
  3. 查看主机信息
    liveshow-server-1
  4. 查看视频流
    liveshow-server-1
  5. 查看客户端
    liveshow-server-1

推流

本地推流

FFMPEG是一套功能强大的多媒体视频处理框架,能够完成视频采集、格式转换、视频抓图等各项功能,初步使用方法可以参考《FFmpeg 视频处理入门教程》。我们本次使用它的视频推送功能,以便完成当前需求。

# 使用 \\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定时机制实现定点播放指定内容

# 周一至周五,上午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是一款开源免费的直播推流软件,支持当前的主流系统平台和直播平台,具有良好的兼容性和功能性。

liveshow-obs-pro

推流设置

liveshow-obs-push

视频来源

liveshow-obs-zoom

推流与录制

liveshow-obs-recod

SRS视频流

liveshow-obs-srs

电视大屏

VLC Media Player 是一个老牌的流媒体播放器,以跨平台的兼容性和丰富的媒体支持而著称。

liveshow-vlc

拉流

我们在电视大屏的监控主机上使用vlc播放器的客户端版本cvlc来实现主动从172.31.101.71上拉取视频流

#!/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

定时播放

为了实现以下目标:

  1. 电视大屏主机实现定时播放SRS视频网关上推送的视频流;
  2. 可自定义拉起视频流,实现电视直播

我们使用了Linux主机的Crontab和Ansible两种技术来实现。

计划任务
# 配置客户端定时调用播放脚本
# Ansible: Live Show
00 12 * * * /bin/bash /home/fxiaoke/play.sh
批量下发
# 使用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"