业务场景
公司有这么个需求,有一堆视频直播地址,这些播放地址分为多个分类,每个分类下有多个直播地址,每个分类下的直播地址在一个时间段只播放一个地址,然后项目组那边需要只将同一个按分类播放的地址(即 一个分类给一个统一的地址,不用给出该分类下具体的播放地址)。
一个分类的直播地址:
2016-12-28 10:00,rtmp://xxx.com/test/001.m3u8
2016-12-28 12:00,rtmp://xxx.com/test/002.m3u8
然后给项目组的直播地址为http://xxx.com/test
在2016-12-28 10:00之后请求http://xxx.com/test =》rtmp://xxx.com/test/001.m3u8
在2016-12-28 12:00之后请求http://xxx.com/test =》rtmp://xxx.com/test/002.m3u8
于是想到了nginx的跳转机智(我是这么理解的)
nginx中有rewrite和proxy,这里我选择rewrite,proxy的方式我没有测试这里就不多说。
说一下思路:
首先启动一个定时任务,每分钟(业务需求)去扫描文件视频源文件夹下的视频播放路径文件,判断时间是否与当前时间相同,如果与当前时间相同则将对应的location中的rewrite后地址替换为对应的播放地址。
直接上代码:
#!/bin/sh
curTime=`date '+%Y-%m-%d %H:%M'`
path=/home/test
nginxpath=/usr/local/nginx-1.10.2
for dir in $(ls $path/csv)
do
dos2unix $path/csv/$dir
echo "location /${dir%.*} {" > $path/conf/init.conf
echo "include $path/conf/${dir%.*}.conf;" > $path/conf/init.conf
while read myline
do
t=`echo "$myline" | awk -F ',' '{print $1}'`
u=`echo "$myline" | awk -F ',' '{print $2}'`
if [ "$curTime" == "$t" ]
then
echo "rewrite ^(.*) $u redirect;" > $path/conf/${dir%.*}.conf
fi
done < $path/csv/$dir
echo "}" > $path/conf/init.conf
done
$nginxpath/sbin/nginx -s reload
这个是定时器定时执行的脚本文件。
在nginx的nginx.conf文件中添加一个server,并在server中添加一个include,引入脚本生成的init.conf
代码如下:
server {
listen 80;
server_name localhost;
include /home/test/conf/init.conf;
}
这样就ok啦!
如果报没有csv及conf目录,记得创建一下哦,我就没往脚本里写了