摸鱼写了个点歌台
我托管podcast服务的国内某直播平台封禁了海外用户上传音频的权限。但是我可以开直播。所以我想,也许我可以开一个直播24小时轮播。
于是我把埋在灰尘中的树莓派翻了出来,元旦这几天摸鱼写代码的时候,遇到几件有意思的事。
首先这个直播机器人基本已经写完了,但是完全做成了一个……点播台。听众发送特定消息可以进行类似 点歌/切歌 的操作。跟我最初的目的几乎没什么关系了。
推流
用 ffmpeg
向 RTMP
服务器推流,开始的时候为了实现「切歌」,我是先 kill
当前 ffmpeg
,然后开一个新的ffmpeg
推下一首歌。
但由于未知原因,重启 ffmpeg
有可能会导致 App 收不到推流,而且有时候是部分人可收到,部分人收不到。很迷。
想到一个方案是,开两个 ffmpeg
分别作为 player
和 streamer
。Streamer
持续向服务器推流,player
向 streamer
推流。切歌的时候只需要干掉 player
,不会影响 RTMP
的链接。
问题是怎么让 player
和 streamer
通信。
试了一下 ffmpeg-python
,失败了。 查了一下可以使用 named pipe
,player
> pipe
> streamer
这样。但是每当player
结束,pipe
都会被关闭,streamer
也就结束了。可以通过增加一个进程持续向 pipe
输出来保证 pipe
不被关闭:
cat > pipe
但即使 pipe
不被关闭,当 player
被杀掉,新的 player
向 pipe
输出,streamer
也不再能够读取到内容。
最后用的方法是……建立了一个playlist
文件:
ffconcat version 1.0
file pipe
file playlist
由于第二条记录指向了自身,每次 pipe
被关闭之后,streamer
都会重新读取这个 playlist
,然后打开 pipe
。
彩蛋
- 在抓包的时候发现,描述一个用户「是否关注你」的变量名叫
focus
。Twitter 上一朋友吐槽应该命名为close-inject-status
。程序员为了命名真是什么单词都用的出来。 - 在需要填写验证码的步骤,会把正确答案和用户填写的答案一起发过去,只要这两个值一致就会通过,令人大开眼界。赛博朋克版的掩耳盗铃。
- 这个平台早期有很多充数的机器人。你经常能看到一些名字很奇怪的用户进入直播间,把在线人数冲到基本人。后来平台推出了匿名功能,我当时就吐槽说这是他们为了不用再给机器人取名字推出的功能。这次抓包发现,经常会有一千多个 ID 为 0 的匿名用户挂在直播间。神奇。
- 这平台现在基本上靠赌博性质的抽奖在续命。也难怪会写出这么方便hack的代码。