为什么流媒体能够一边下载一边观看?与普通的视频有什么不同?
流媒体与要下载才能观赏的视频文件的最主要区别是媒体文件的存储和使用方式的不同。在流媒体,浏览器或播放器不需要创建一个本地的视频副本或保存接收到视频数据,然后再播放,浏览器或播放器只需要先加载少量的视频数据就可以实时播放视频了。
我们可以这样来理解流媒体。流媒体实际上也是一些音频和视频数据,只是它会通过网络源源不断地发送到客户端(浏览器,播放器)来直接被播放。在传输上,与要下载才能播放的视频没有区别,只是流媒体不需要保存它的副本或它的数据,流媒体音视频数据可以被直接消费,需要下载的视频则必须先保存音视频的所有视频或一个完整的副本才能够开始播放。
流媒体其实很常见。比如说:
电影,你可以直接看;
音乐,你可以直接听;
电视节目,可以直接看;
短视频,如抖音、快手等;
视频点播(VOD)、视频广播、视频监控、视频会议、远程教学、交互式游戏等;
直播,是最明显不的例子了。
这些例子都不需要下载完整的音视频文件就可以直接观看,最多就是在网络不好的时候,需要缓冲一下,又或者打开一瞬间,需要缓冲一些数据。大多数情况下,基本上都是秒开。
在浏览器或播放器播放音视频时,音频或视频播放器源源不断接收来自流媒体服务器发送的数据包,然后不断地对数据包进行解析,然后将解析好的数据送往播放器播放。一旦用户不想看关了流(就是关闭了播放器),流媒体文件会被自动地删除。传统的媒体需要先下载完整个文件或数据,然后再进行数据解析,再送往播放器播放。
在流媒体中,媒体比特流被分割成块,这些块可以被单独传输。接收器就能够对终端用户在特定时间接收到的比特流部分进行编码和播放。为什么它能够在接收到部分比特流数据时也可以进行编解码方面的处理呢?其实这可以是发送流媒体数据的一端系统地发送多媒体系统知识的数据包,而接收端同时接受、解码和检查接收到的比特流部分。也就是在这些块可能携带了相应的编解方面的信息,又或者像刚刚提到的,发送端可以向接收端发送多媒体系统知识的数据包。无论哪一种,都让播放端有足够的信息去处理和播放收到的部分视频数据。
需要下载才能够观赏的音视频就与流媒体不一样了。首先,它需要在观赏前将来自服务器的音视频内容存储在机器上,然后才被加载进行解码、播放等工作。
因为最紧要的仍然是数据的存储与使用方式。传输协议只是根据应用场景需要而选择的传输方式罢了。
比如流媒体一开始先下载一部分文件到缓存区,然后再从缓存区里面拿数据来播放。流媒体文件的编码的格式比较特殊,像 flv、rmvb、mov、asf等格式文件都属于流媒体格式文件。这些文件有一个特点就是有文件头信息和中间打包了,可以直接解析分包,而且文件可以任意大小,而不需要通过索引分包。flv、rmvb等可以直接依次分包解析,不需要下载完整的文件才播放。
而像mp4、avi等这些非流媒体格式的文件一定要依赖索引表才行,而且开始就要固定好位置,如果索引表在尾部,那么文件未下载完毕是没办法解析的。
用于传输流媒体数据的协议有很多如UDP,TCP,HTTP等等,作用就是传输数据包,传统的媒体也可以用这些协议来传输数据。大多数流媒体服务使用内容分发网络(CDN)将内容存储在离用户更近的位置。这种接近减少了流延迟,加快了内容交付并减少了缓冲。有些流媒体可以用HTTP协议对流式文件进行分段下载,由于在前面的接收到的分段数据可以先播放,因此可以一边下载一边播放。
因此对于要下载完毕才能播放的音视频文件,是因为播放端不知道如何对文件进行解析,必须下载整个文件,才能收集到足够的信息去做数据解析,所以它不能边下载边播放。