在前两篇中讲了使用AudioQueue流式播放本地文件的功能,本篇就来讲讲网络流媒体的播放。其实已经有了本地流式播放功能,网络流媒体播放基本就没问题了,只是数据来源于网络而已,但还是有些问题要注意。
从AudioStreamer讲起
AudioStreamer是一个用于播放网络流媒体音频的库,采用了AudioQueue+AudioStreamer+CFNetwork的方式来编写,代码量不大。阅读量很方便,其实使用AudioQueue来编写流媒体播放,代码基本都长一样。没必要重复造轮子,但是造轮子却有助于学习。我在学习和编写的时候也参考和阅读了AudioStreamer的代码。
为什么要使用CFNetwork
AudioStreamer使用了CFNetwork来下载数据,相信有一些人在使用AudioStreamer的时候都没有思考过这样一个问题,为什么AudioStreamer要使用CFNetwork来下载音频数据?起初我也没有去考虑这个问题,但是在自己造轮子的过程中,似乎我明白了作者的意图。我之前使用NSURLSession也编写了一个这样的功能,当然实现起来是没问题的,但是由于NSURLSession是异步请求,这样就会涉及到多线程之间的通信问题,比较复杂,并且读取到的数据大小不好控制,而使用CFNetwork则不一样,你可以控制每次读取到的数据大小,并且读取数据是在本线程中,所以虽然说CFNetwork是底层网络,但是使用CFNetwork反而比使用NSURLSession更加简单。下面先上一个CFNetwork的示例
CFNetwork示例:下载图片
在该示例中,我们使用CFNetwork来下载从百度图片上随意选则的一张