23.1.1 流媒体传输的基本原理
实现流式传输需要使用缓存机制。因为音频或视频数据在网络中是以包的形式传输的,而网络是动态变化的,各个数据包选择的路由可能不尽相同,到达客户端所需的时间也就不一样,有可能会出现先发的数据包却后到。因此,客户端如果按照包到达的次序播放数据,必然会得到不正确的结果。使用缓存机制就可以解决这个问题,客户端收到数据包后先缓存起来,播放器再从缓存中按次序读取数据。
使用缓存机制还可以解决停顿问题。网络由于某种原因经常会有一些突发流量,此时会造成暂时的拥塞,使流数据不能实时到达客户端,客户端的播放就会出现停顿。如果采用了缓存机制,暂时的网络阻塞并不会影响播放效果,因为播放器可以读取以前缓存的数据。等网络正常后,新的流数据将会继续添加到缓存中。
虽然音频或视频等流数据容量非常大,但播放流数据时所需的缓存容量并不需要很大,因为缓存可以使用环形链表结构来存储数据,已经播放的内容可以马上丢弃,缓存可以腾出空间用于存放后续尚未播放的内容。
当传输流数据时,需要使用合适的传输协议。TCP虽然是一种可靠的传输协议,但由于需要的开销较多,并不适合传输实时性要求很高的流数据。因此,在实际的流式传输方案中,TCP协议一般用来传输控制信息,而实时的音视频数据则是用效率更高的RTP/UDP等协议来传输。流媒体传输的基本原理如图23-1所示。
在图23-1中,Web服务器只是为用户提供了使用流媒体的操作界面。客户机上的用户在浏览器中选中播放某一流媒体资源后,Web服务器把有关这一资源的流媒体服务器地址、资源路径及编码类型等信息提供给客户端,于是客户端就启动了流媒体播放器,与流媒体服务器进行连接。
图23-1 流媒体传输原理
客户端的流媒体播放器与流媒体服务器之间交换控制信息时使用的是RTSP协议,它是基于TCP协议的一种应用层协议,默认使用的是554端口。RTSP协议提供了有关流媒体播放、快进、快倒、暂停及录制等操作的命令和方法。通过RTSP协议,客户端向服务器提出了播放某一流媒体资源的请求,服务器响应了这个请求后,就可以把流媒体数据传输给客户端了。
需要注意的是,RTSP协议并不具备传输流媒体数据的功能,承担流媒体数据传输任务的是另一种基于UDP的RTP协议,但在RTP协议传输流媒体数据的过程中,RTSP连接是一直存在的,并且控制着流媒体数据的传输。一旦流媒体数据到达了客户端,流媒体播放器就可以播放输出了。流媒体的数据和控制信息使用不同的协议和连接时,还可以带来一个好处,就是播放流媒体的客户机和控制流媒体播放的客户机可以是不同的计算机。