最近给服务器折腾了不少东西,然后就在思考,能否实现24小时直播。这当然是很好实现的,而且用FFmpeg推流就行,这个对资源占用极低。但是如何做到自动化开播,或是说一键开启直播呢?这就需要你自己操作一下,而且这个你想想就知道肯定不止一种方法,建议自己先想想怎么来实现。我这里用的是思路比较简单的方法(换言之,比较低级),来看看。
简单思路
这是我一直想要的,一直在研究的,现今做成了的一件事。但其实,这是一个曲线救国的方法,因为这里面应用了操控“鼠标”的方法。
环境:Linux Deepin 20 beta。
主要使用:xdotool——一个能“控制”你鼠标和键盘的命令,需要安装软件包。FFmpeg——一个底层的,处理音视频流的命令行程序,需要安装软件包。如果不确定自己有,最好装一下。
sudo apt-get update
sudo apt install xdotool
sudo apt install ffmpeg
有了这两个工具,我们就可以写个shell脚本,用xdotool操纵鼠标逐步点击,开始直播。用FFmpeg推流到B站的直播间。然后在脚本里写上循环体,就可以循环推流了。
由于我这个 电脑 / 服务器 是做了网络唤醒(用于定时开机)和定时关机的,所以我会把脚本放到cron
定时任务里,让它开机自启。
xdotool操纵键鼠
主要用到这几个命令,这个工具还有许多强大的功能,你如果想了解,去网上搜搜看,同样有许多文章介绍地很详细。
1.显示当前鼠标的位置
xdotool getmouselocation
2.把光标移动到 x y 处,这里的位置你可以用上一条命令得到
xdotool mousemove x y
3.鼠标移动到x y处,并单击左键。
xdotool mousemove x y click 1
这里click 1
是左键,click 2
为滚轮下滑,click 3
为右键,click 4
为滚轮上滑。
如果要双击,可以写成
xdotool click 1 click 1
4.从键盘输入一串文字
xdotool type 'text'
5.敲击某一个按键。
xdotool key $[key]
敲回车为xdotool key Return
,组合键xdotool key ctrl+Tab
。
敲回车也可以写成:
xdotool type 'text'
打开B站直播脚本
首先创建脚本autolive1.sh
#! /bin/bash
#get mouse location
xdotool getmouselocation
用于便捷地获取当前鼠标位置
然后是用于打开B站直播的脚本:
#! /bin/bash
#Test For Auto Start Live on Bilibili
sleep 7
xdotool type 'vhyimy@7805'
xdotool key Return
sleep 1
google-chrome-stable > /dev/null 2>&1 & #打开Google Chrome
sleep 5
xdotool type 'vhyimy@7805'
xdotool key Return
sleep 20
xdotool mousemove 169 92 click 1 #点击地址栏
sleep 1
xdotool type 'https://link.bilibili.com/p/center/index?visit_id=XXXXXXXXXX#/my-room/start-live'
xdotool key Return #键入地址,按下回车,等待其加载完成
sleep 30
xdotool mousemove 360 639 click 1 #点击选择分类
sleep 1
xdotool mousemove 576 333 click 1 #点击上次分类
sleep 1
xdotool mousemove 1357 763 click 1 click 1 #向下滚动
sleep 1
xdotool mousemove 406 704 click 1 #点击“开始直播”
sleep 1
#ps -ef | grep chrome | grep -v grep | cut -c 9-15 |xargs kill -9 #关闭Chrome进程,已弃用
#sleep 1
xdotool mousemove 1374 5 click 1 #关闭chrome窗口
sleep 2
xdotool mousemove 988 18 click 3
sleep 1
xdotool mousemove 1000 160 click 1 # 退出Chrome
我来解释地详细一点:
- 1.开机输入密码
首先我的Deepin系统,为了运行这个脚本时不必开机输入密码,就设置了“无密码登录”和“自动登录”,这样开机没有密码就能进入桌面,但是“钥匙环”是需要密码来解锁的,开机就会弹出对话框,让你输入密码,所以前两句用于输入密码
sleep 7
xdotool type 'vhyimy@7805'
xdotool key Return
sleep 1
sleep 1
表示停留1秒,用于防止前一步操作没有做完。
- 2.打开Chrome浏览器
google-chrome-stable > /dev/null 2>&1 & #打开Google Chrome
sleep 5
xdotool type 'vhyimy@7805' #防止之前输入密码失败,这里再输入一次
xdotool key Return
sleep 20
打开chrome用的命令google-chrome-stable > /dev/null 2>&1 &
,写成这样是为了防止往屏幕输出信息,后边&
表示放入后台运行。
- 3.逐步打开B站的“开播设置”页面
xdotool mousemove 169 92 click 1 #点击地址栏
sleep 1
xdotool type 'https://link.bilibili.com/p/center/index?visit_id=XXXXXXXXXX#/my-room/start-live' #这里换成你的“开播设置”页面
xdotool key Return #键入地址,按下回车,等待其加载完成
sleep 30
xdotool mousemove 360 639 click 1 #点击选择分类
sleep 1
xdotool mousemove 576 333 click 1 #点击上次分类
sleep 1
xdotool mousemove 1357 763 click 1 click 1 #向下滚动
sleep 1
xdotool mousemove 406 704 click 1 #点击“开始直播”
sleep 1
为了不用登录,我是先前用浏览器登陆过B站的,而Deepin的密码存储在“钥匙环”里,这也是为什么我前面反复调整的原因,使得既不需要开机密码,又能保证这一步不用登录B站。
这几行命令中,鼠标的位置,是需要你自己测试的,这只是适应我屏幕的按钮位置。
- 4.退出Chrome
#ps -ef | grep chrome | grep -v grep | cut -c 9-15 |xargs kill -9 #关闭Chrome进程,已弃用
#sleep 1
xdotool mousemove 1374 5 click 1 #关闭chrome窗口
sleep 2
xdotool mousemove 988 18 click 3 #右键状态栏的Chrome图标
sleep 1
xdotool mousemove 1000 160 click 1 # 退出Chrome
注意第一行弃用了,因为这是用杀进程的方式关闭Chrome的,这会导致下次打开Chrome有崩溃提示,不利于反复操作,于是采用了和上面一样的“曲线救国”
的策略。其实上面的点击是可以化为console
里发消息的,但是出于不会,所以没弄。
推流
采用FFmpeg推流,它的命令格式你可以去官网看文档
我是这么用的:
ffmpeg -re -i "/home/moonhikari/Videos/dong.flv"\
-vcodec copy -preset veryfast -acodec aac -strict -2 -f flv \
rtmp://XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXX
-i
后面的是你视频的路径,中间的为预设,最后一行为你B站的推流地址。不会变,需要你提前粘贴到脚本里来。
然后我打算一次推流有四个视频连着,顺次播放。然后再做成循环。成品在下面:
#! /bin/bash
#Auto FFmpeg Push
for i in $(seq 7)
do
echo Gen_Num: $i >>/home/moonhikari/sh/log/live.log #第几次循环,输出到日志
echo live start time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log
ffmpeg -re -i "/home/moonhikari/Videos/dong.flv"\
-vcodec copy -preset veryfast -acodec aac -strict -2 -f flv \
"rtmp://txy.live-send.acg.tv/live-txy/?streamname=XXXXXXXXXXXXXXXXXXXX
echo End of $i-a time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log #第一个视频结束,时间
ffmpeg -re -i "/home/moonhikari/Videos/zhong.flv"\
-vcodec copy -preset veryfast -acodec aac -strict -2 -f flv \
"rtmp://txy.live-send.acg.tv/live-txy/?streamname=XXXXXXXXXXXXXXXXXXXXXXXX
echo End of $i-b time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log #二
ffmpeg -re -i "/home/moonhikari/Videos/bei.flv"\
-vcodec copy -preset veryfast -acodec aac -strict -2 -f flv \
"rtmp://txy.live-send.acg.tv/live-txy/?streamname=XXXXXXXXXXXXXXXXXXXXX
echo End of $i-c time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log #三
ffmpeg -re -i "/home/moonhikari/Videos/pan.flv"\
-vcodec copy -preset veryfast -acodec aac -strict -2 -f flv \
"rtmp://txy.live-send.acg.tv/live-txy/?streamname=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
echo End of $i-d time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log #四
echo End of all in Gen $i time:$(date +'%F %T') >>/home/moonhikari/sh/log/live.log #全部结束,时间输出到日志
done
就这些!
开始
放到定时任务里:
crontab -e
里面写上:
#auto_start_live
35 5 * * * DISPLAY=:0 /home/moonhikari/sh/autolive2.sh
#auto_start_push
37 5 * * * /home/moonhikari/sh/autolive3.sh
这个怎么写,规则去百度吧,简单来说就是:
这里我们不用指定谁来执行。
注意因为第一个脚本里会用到xdotool
,所以前面加上DISPLAY=:0
来使其在显示器上操作,这个怎么写,去百度吧,太多了。。。
如果能运行起来,那就万事大吉了,之后也可以看着改进。若有问题,仔细排查,祝你成功!
(完)