前言
今日闲来无事,使用Streamlink帮字幕组转播(使用的是改版STLInku,直接由境外VPS推流),自己就去吃饭去了。饭到一半,群里有人提醒:
然后到b站直播间看了一下,发现正在自动重播刚刚直播的内容
断开推流之后,转播随即停止。
但是这就出现了一个问题:Streamlink会对已下播的油管直播进行重播吗?
于是就有了这个测试:
一些测试
测试环境:Windows 10 Build 17134 ,Streamlink 1.5.0
测试对象:谁曾经直播过,但是刚刚下播的内容(陈述句)
有内容输出
不出意料的一点是,VLC的进度条,是播放普通文件的样式(明确知道文件多长,能显示出来),而不是播放流的样式(显示不了流的长度,因此总长度一栏是00:00:00)
然后,又换用一个普通上传的视频(非直播归档)测试,结果同上。
结论
可以明白的一点是,Streamlink严格来说不是自动重播,而是在播放直播归档 能出现这种情况,有他的几个原因:
1.油管能自动归档直播内容
没什么好说的,相当于自动录播:
(用户直播结束)→(油管生成归档)
2.STLInku的循环功能
原版STLInku的代码中,有这么一段:
while [ $retry -ge 1 ]
do
start=$(date +%s)
sudo ffmpeg -re -rw_timeout 15000000 -i "$OriginURL" -c copy -bsf:a aac_adtstoasc -f flv "$address"
sleep 1
end=$(date +%s)
let time=end-start
if [ $time -lt 20 ];then
#检测到运行时间小于20s,可能是数据源出错
echo "数据源可能已经断开,正在尝试重新启动数据源"
curl -X POST -d "ctrl=restart" "https://xxxxxxx/STLinkAPI.php"
#重发启动指令,详见“STLinkAPI.php”
echo "等待8秒"
sleep 8
fi
retry=$(( $retry - 1 ))
echo "---------------目前是第:$retry 次重试-----------------"
done
重点是这一块:
while [ $retry -ge 1 ]
do
########## Some Codes #########
retry=$(( $retry - 1 ))
echo "---------------目前是第:$retry 次重试-----------------"
done
实测发现,在油管直播关闭之后,Streamlink也会自动退出。但是上面的代码又自动重启了Streamlink,导致它开始读取直播归档。
也就是说:(直播结束)→(Streamlink检测不到可用流,退出)→(脚本使他重启)→(重启后,在同一个URL处,Streamlink读取到了直播归档)→(开始输出归档内容)
3.ffmpeg的 -re 参数
还记得刚刚说过,VLC检测到了 直播归档 / 非直播归档的上传视频 的最大长度了吗?这说明,VLC将其识别成了一个有固定长度的远程文件。
ffmpeg(包括这类软件)有个特性,就是尽己所能的达到最快速度,但是,ffmpeg也保留了-re这个参数,官方对他的解释是:
-re (input)
Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).
常用场合的例子,翻译成人话就是,如果使用一个(有固定长度的)文件进行推流,不加-re参数的话,推流那边基本上是没法看的:ffmepg只是一个劲地猛扔。
加上-re参数之后,ffmpeg就会慢下来,以文件的原始速率进行推流(也就是为什么,加上这个参数之后,只有1x的速度)
现在,把这两项结合起来看,就很明显了:如果脚本中没有写-re参数的话,ffmpeg检测到内容的最大长度(由Streamlink提供)之后,就会以尽己所能的速度推流直播归档的内容,观众自然会察觉到异样。但是-re参数的出现,则正好使得推流直播归档的速度就是正常播放速度,观众也就看不出来了,以为只是重播。
小结
这算是一个有点有趣的小bug,但是,无妨大雅就是了。
今天又水了一篇文章呢喵~