Contents

摸鱼写了个点歌台

Contents

我托管podcast服务的国内某直播平台封禁了海外用户上传音频的权限。但是我可以开直播。所以我想,也许我可以开一个直播24小时轮播。

于是我把埋在灰尘中的树莓派翻了出来,元旦这几天摸鱼写代码的时候,遇到几件有意思的事。

首先这个直播机器人基本已经写完了,但是完全做成了一个……点播台。听众发送特定消息可以进行类似 点歌/切歌 的操作。跟我最初的目的几乎没什么关系了。

推流

ffmpegRTMP 服务器推流,开始的时候为了实现「切歌」,我是先 kill 当前 ffmpeg,然后开一个新的ffmpeg推下一首歌。

但由于未知原因,重启 ffmpeg 有可能会导致 App 收不到推流,而且有时候是部分人可收到,部分人收不到。很迷。

想到一个方案是,开两个 ffmpeg 分别作为 playerstreamerStreamer 持续向服务器推流,playerstreamer 推流。切歌的时候只需要干掉 player,不会影响 RTMP 的链接。

问题是怎么让 playerstreamer 通信。

试了一下 ffmpeg-python ,失败了。 查了一下可以使用 named pipeplayer > pipe > streamer 这样。但是每当player 结束,pipe 都会被关闭,streamer 也就结束了。可以通过增加一个进程持续向 pipe 输出来保证 pipe 不被关闭:

cat > pipe

但即使 pipe 不被关闭,当 player 被杀掉,新的 playerpipe 输出,streamer 也不再能够读取到内容。

最后用的方法是……建立了一个playlist 文件:

ffconcat version 1.0
file pipe
file playlist

由于第二条记录指向了自身,每次 pipe 被关闭之后,streamer 都会重新读取这个 playlist,然后打开 pipe

彩蛋

  • 在抓包的时候发现,描述一个用户「是否关注你」的变量名叫 focus。Twitter 上一朋友吐槽应该命名为 close-inject-status。程序员为了命名真是什么单词都用的出来。
  • 在需要填写验证码的步骤,会把正确答案和用户填写的答案一起发过去,只要这两个值一致就会通过,令人大开眼界。赛博朋克版的掩耳盗铃。
  • 这个平台早期有很多充数的机器人。你经常能看到一些名字很奇怪的用户进入直播间,把在线人数冲到基本人。后来平台推出了匿名功能,我当时就吐槽说这是他们为了不用再给机器人取名字推出的功能。这次抓包发现,经常会有一千多个 ID 为 0 的匿名用户挂在直播间。神奇。
  • 这平台现在基本上靠赌博性质的抽奖在续命。也难怪会写出这么方便hack的代码。