据接收、数据预处理、解码播放三个子模块,下面将详细介绍这三个子模块的设计过程。
4.4.1 数据接收子模块
该子模块位于系统的最底层,主要负责与流媒体服务器进行交互,协商音/视频数据的细节,并在协商后从流媒体服务器获取音/视频流数据,最后将接收到的数据存入缓冲区。
图4.4 数据接收模块结构图
Fig. 4.4 The module structure diagram of accepting data
如图4.4所示,该模块需要并发执行会话控制、音/视频数据接收和网络传输控制。因此,该模块中将启动5个线程并发执行,一个线程负责会话控制,采用TCP连接来进行RTSP会话协商;另外用2个线程来接收音频和视频RTP包,如图4.5所示。在数据传输过程中,会话控制的TCP连接仍然保留着;最后的2个线程用来接收和发送音/视频的RTCP包。
为了使音/视频数据按顺序进行播放,在RTP包的接收过程中必须考虑顺序的问题。该系统主要使用双向循环队列来接受RTP包,当接收到一个RTP包时,首先查看队列中是否已经有RTP包,若已经含有RTP包,则将接收到的包的序列号与队列中RTP包序列号进行比较,将序列号大的包排在后面,序列号小的包排在前面,即按照从小到大的顺序排列RTP包;若队列中没有RTP包,则可以直接将RTP包插入到队列中。当接收到的序列号与队列中已有RTP包的序列号相同时,说明RTP包重复了,这时可以丢掉此RTP包。
表4.5 数据接收流程
Table 4.5 The flow diagram diagram of accepting data
4.4.2 数据预处理子模块
数据预处理子模块是为音/视频解码的播放做准备,它需要屏蔽底层的异构流媒体文件数据,不管文件是来自本地还是网络,经过预处理后的音/视频数据都能进行统一的解码播放。
本地文件的预处理仅需依赖FFmpeg提供的功能文件解封功能,本文重点讨论网络流媒体文件预处理的方法和流程。由于接收到的网络流媒体数据为一个一个的RTP包,因此需要对这些RTP包进行整合,此过程称为RTP包解析过程,其执行流程如图4.6所示。
表4.6 RTP包解析流程
Table 4.6 The flow diagram diagram of analyzing RTP package
通过网络接收到的流媒体RTP包中都有一个包头,此包头包含了流媒体文件的序列号、时间戳、媒体类型等。包头中的信息对于流媒体数据的处理非常重要,其中序列号主要用于在接收音/视频数据时对包进行重组排序,时间戳能够为音/视频的播放解决同步问题,媒体类型用于标识媒体的类型信息。
当接收到了完整的RTP包后,就可以根据包头信息将这些RTP包解析组帧,由于一个RTP包中不一定包含了完整的一帧音/视频信息,所以要对相邻的两个RTP包进行判断是否存在丢包现象:首先判断这两个包的时间戳是否一致,再判断这两个包中的序列号是否为相邻的。若它们代表同一帧数据,其时间戳应该是一样的,同时需要序列号是相邻的;若序列号不相邻,则代表有包丢失了。若判断出确实存在丢包现象,这样的包就不完整了,在解析中需要将其舍弃掉。
RTP包中有个标识位M用于标识RTP包是否为组合帧的最后一个包。每次
上一篇:
基于Android平台的手机电子书阅读器设计
下一篇:
试论APP广告在手机中的应用