最近给服务器折腾了不少东西,然后就在思考,能否实现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定时任务里,让它开机自启。

截图录屏_deepin-terminal_20200426012907.png

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

这个怎么写,规则去百度吧,简单来说就是:

timg.jpg

这里我们不用指定谁来执行。

注意因为第一个脚本里会用到xdotool,所以前面加上DISPLAY=:0来使其在显示器上操作,这个怎么写,去百度吧,太多了。。。

如果能运行起来,那就万事大吉了,之后也可以看着改进。若有问题,仔细排查,祝你成功!


(完)