流媒体
我们设计了一种类似目录的格式,将音视频数据进行切片,这部分能力利用现有的工具 FFmpeg 就可以轻松做到。
1 | ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8 |
eg:
上面将input.mp4切割成HTTP Live Streaming 可以播放的切片(大多数浏览器中的播放器都可以播放)。最终会生成大量的切片文件,比如说每个 256k,以及一个目录文件 output.m3u8
m3u8 文件是目录,它记录了每个视频切片文件(ts)对应的视频时间范围。用户播放视频的时候,会先下载 m3u8 文件。当用户调整视频播放滑块选择播放时间时,播放器就根据 m3u8 的内容下载对应的 ts 文件。
我们将视频上传到服务器进行编码,产生上面提到的切片文件。切片文件存储到流媒体服务器中,当用户需要的时候,就从流媒体服务器中读取视频目录(上面的 m3u8 文件),然后在各个端播放。进行编码的时候,可以根据不同的清晰度编码多个版本,来应对用户在不同网络环境的情况。
媒体,就是把多媒体数据抽象成为流进行传输。视频本质上是一张张图片在播放,因此非常适合流传输。要知道,流是随着时间产生的数据。通常在一个网络中,等价成本下吞吐量、丢包率和延迟 3 者不能兼得。也就是说,像直播这种吞吐量非常大的视频应用,可能就要牺牲延迟。比如之前 B 站直播没有优化前,用户看到的直播画面会比真实的时间会慢近半分钟。
另一方面,像在线会议这类对延迟要求较高的场景,就可能需要降低视频质量,或者部署边缘服务。如果是内网视频会议,或者跨地区的公司视频会议,很容易找到边缘节点帮助交换数据和计算;如果是来自天南地北的用户,那么就需要投入更多成本。对于社交网站而言,需要维护几个人同时语音、视频聊天,因为人数较少,就可以使用点对点技术(但是要解决 NAT 穿墙的问题)。