③ 发送DESCRIBE请求,并解析回应。
④ 根据SDPDescription在MediaSession中创建MediaSession对象。
⑤ 配置所有子会话对象。
⑥ 由RTSPClient对象向服务器发送SETUP消息并接收回应。
⑦ 由RTSPClient对象向服务器发送PLAY消息并接收回应。
接收到的经过压缩编码的MP3音频数据只有经过解码后发送给音频设备,才能实现解码播放。为了缩短开发周期,本文使用LIBMAD库来实现MP3解码。LIBMAD库是一个开源的高精度MPEG音频解码库,支持MPEGLayer I、 MPEGLayer II和MPEGLayer III。LIBMAD提供24位的PCM输出,完全是定点计算,非常适合应用在没有浮点支持的平台上。使用LIBMAD提供的一系列 API(应用程序编程接口),就可以非常简单地实现 MP3 数据解码。
为了使系统接收到的音频流数据能够正常解码并播放,系统采用双线程(数据接收线程和音乐播放线程)、双缓冲(数据接收缓冲和音乐播放缓冲)操作。两个线程并发运行,且音乐播放线程运行速度较慢。如果网络速度较快,数据接收线程的接收缓冲区已满,而当前音乐播放线程正在播放音乐,那么数据接收线程必须停止接收数据。如果不让数据接收线程进入等待状态,它会一直轮询音乐播放线程观察其是否需要数据。简单的轮询会浪费 CPU 资源,在这种情况下,有必要让数据接收线程进入等待状态。本系统使用信号量机制来动态控制线程的运行,有效地提高程序执行效率。
2.3.2 顺序流式传输MMS协议
MMS(Microsoft Media Server,微软媒体服务器)协议由微软制定,用来访问以及用于流式接收Windows Media服务器中的流文件,也是连接Windows Media单播服务的默认方法。在Windows Media Player中输入一个URL以便连接播放内容时要使用这个协议,当用MMS协议连接到发布点后,服务器会使用“协议翻转”来获得最佳的连接。