浅谈直播
前言
借着这次疫情的机会,已经平息的直播,又一次被唤醒。像钉钉(视频会议)、腾讯会议、瞩目之类的软件迅速冒出,不禁让我想起自己的毕业设计。在这里简单聊一下我的毕业设计和目前的直播平台搭建方式。
忆往昔
大学的毕业设计,我选的课题叫做多媒体电子教室的设计与实现。
貌似全班就我一个人选了,连个讨论的人都找不到。😂
这个课题简单来说就是设计一款局域网屏幕传输软件,方便老师在计算机教室上课教学。
如果你对“方便”有疑惑的话,我就描述一下应用场景,印象中大学的计算机教室架了四台还是六台投影仪,幕布摆放的位置也只能穿插在两排座位之间,这就导致投影的效果很差,大部分位置的视角都很别扭。
另说,那时候是用飞鸽传书来互传文件,比如交作业(代码)给老师。课堂上理所当然不允许讲话,所以咯,我们经常用飞鸽来聊天,搞定点爆破(针对性连续发送文件)。🤐
作品
C#写的 Winform 程序,实现了局域网内的屏幕广播、聊天对话、举手和远程开关机。
过程
已经不记得当时的技术水平和具体思路了,毕业有点久了,只能捡一些回忆来讲。
首先拿到这个课题,大脑里简单构思了一下,主要就是两项功能,一个是屏幕传输,另一个是聊天。
作为一个度娘养大的孩子,凡事不懂先百度的习惯已经深入骨髓,搜了一些信息,就盯着“红蜘蛛”这款软件了。但是很显然,我只能看到一些功能描述和界面,具体源码是不可能搞得到的。所以,只能自己动手了。
屏幕传输,简单点,就是连续截图,再连续发送就完了。实际用代码去实现的时候就发现问题来了,截图好说,TCP 发送好说,效果就很不好说了,开启广播就有巨大的流量,但客户端显示效果极差,比放 PPT 还差。
遇到问题了,再次请教度娘,借鉴了网友的思路,TCP 是不行的,既然是有指不定多少个客户端要看到画面,而且要流畅,也就是说丟几帧画面也没关系,那就改用 UDP 吧。
用 UDP 就发现,UDP 单次发送的数据包大小是有限制的。为此,服务端又将截图进行切片,又给片段进行编号,客户端在一小段时间内对这些片段按照编号重组,如果编号缺失或者超时,就直接放弃这一次画面的显示。
换成这种实现方式,效果出奇得好,好到我准备的其他优化手段都用不上了。在局域网内,没有其他流量干扰,屏幕广播的延迟不超过一秒,流畅度和看电影差不多。
聊天,那就更简单了,定向 TCP 连接就完了,不谈。远程开关机之类的,太简单,不谈。
后续就是拿着软件,改了三遍论文,就去答辩了。
后续
答辩结束后,老师说想将我的软件实际投入教学使用,我那时候考虑的是,这个软件目前远不如我的预期,但迫于论文答辩,只能仓促完成,便婉拒了老师。当时还想着毕业了再完善一下这个软件,等到我自己认可这个软件的时候,再和老师联系。现实情况是,毕业了就开始忙着找工作,早就忘了这件事了。😅
其实,作为一个电子教室软件,界面丑我是心知肚明的,对客户端的强力控制也是一个重点,奈何当初技术菜、时间短,就写了个 Kill 任务管理器的线程,然后在启动广播的时候把客户端置顶;另外,虽然屏幕传输实现了,但是音频传输也需要考虑,在教室四周摆上大音响的做法太不计科了;还有聊天功能,也不能只是纯文字聊天,富文本聊天、传输文件的功能也是要加的。
基于以上种种要做却没做的功能,这个软件我自己实在不能认可。
看今朝
直播行业大火的时候,我就了解到 OBS 这款软件,简单上手把玩了一番,发现此乃神器,全方位吊打我当初毕设软件的理想终极版。先简单说下直播的技术。
- 知乎:如何搭建一个完整的视频直播系统?
- 博客:直播平台整体架构
直播的技术架构到如今也是很成熟的了,毕竟活不下去的也差不多都倒闭了,先来盗些图
简单来讲,就是有人主动发起直播(推流),有流媒体服务器在处理(分发),有人在看(拉流)。
我尝试着使用 OBS、SRS 和 Potplayer,在我那 1 核 2GB 1Mbps 的小水管服务器做了个测试,直播效果很勉强,有明显的卡顿,但至少是有效果的。
OBS(推流)
OBS Studio 是免费的开源软件,用于视频记录和实时流媒体。目前可以使用 Linux,Mac 和 Windows Build。
- 官方 OBS Studio 构建:Github Release
- 手动构建 OBS Studio:安装说明
SRS(分发)
SRS/3.0,OuXuli,是一个流媒体集群,支持 RTMP/HLS/WebRTC/SRT/GB28181,高效、稳定、易用,简单而快乐。
SRS 定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码。SRS 提供了丰富的接入方案将 RTMP 流接入 SRS, 包括推送 RTMP 到 SRS、推送 RTSP/UDP/FLV 到 SRS、拉取流到 SRS。 SRS 还支持将接入的 RTMP 流进行各种变换,譬如将 RTMP 流转码、流截图、 转发给其他服务器、转封装成 HTTP-FLV 流、转封装成 HLS、 转封装成 HDS、转封装成 DASH、录制成 FLV/MP4。SRS 包含支大规模集群如 CDN 业务的关键特性, 譬如 RTMP 多级集群、源站集群、VHOST 虚拟服务器 、 无中断服务 Reload、HTTP-FLV 集群。此外,SRS 还提供丰富的应用接口, 包括 HTTP 回调、安全策略 Security、HTTP API 接口、 RTMP 测速。SRS 在源站和 CDN 集群中都得到了广泛的应用 Applications。
VLC(拉流)
VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。
后记
依旧是留坑,看啥时候研究下 OBS,给当初的毕设软件换换血,再顺带把远程控制的功能一并做了。😁