大家应该已经注意到了,无论是前面的录音还是音频播放均不支持网络流媒体播放,当然对于录音来说这种需求可能不大,但是对于音频播放来说有时候就很有必要了。AVAudioPlayer只能播放本地文件,并且是一次性加载所以音频数据,初始化AVAudioPlayer时指定的URL也只能是File URL而不能是HTTP URL。当然,将音频文件下载到本地然后再调用AVAudioPlayer来播放也是一种播放网络音频的办法,但是这种方式最大的弊端就是必须等到整个音频播放完成才能播放,而不能使用流式播放,这往往在实际开发中是不切实际的。那么在iOS中如何播放网络流媒体呢?就是使用AudioToolbox框架中的音频队列服务Audio Queue Services。

使用音频队列服务完全可以做到音频播放和录制,首先看一下录音音频服务队列:

一个音频服务队列Audio Queue有三部分组成:

三个缓冲器Buffers:每个缓冲器都是一个存储音频数据的临时仓库。

一个缓冲队列Buffer Queue:一个包含音频缓冲器的有序队列。

一个回调Callback:一个自定义的队列回调函数。

声音通过输入设备进入缓冲队列中,首先填充第一个缓冲器;当第一个缓冲器填充满之后自动填充下一个缓冲器,同时会调用回调函数;在回调函数中需要将缓冲器中的音频数据写入磁盘,同时将缓冲器放回到缓冲队列中以便重用。下面是Apple官方关于音频队列服务的流程示意图:

类似的,看一下音频播放缓冲队列,其组成部分和录音缓冲队列类似。

但是在音频播放缓冲队列中,回调函数调用的时机不同于音频录制缓冲队列,流程刚好相反。将音频读取到缓冲器中,一旦一个缓冲器填充满之后就放到缓冲队列中,然后继续填充其他缓冲器;当开始播放时,则从第一个缓冲器中读取音频进行播放;一旦播放完之后就会触发回调函数,开始播放下一个缓冲器中的音频,同时填充第一个缓冲器放;填充满之后再次放回到缓冲队列。下面是详细的流程:

当然,要明白音频队列服务的原理并不难,问题是如何实现这个自定义的回调函数,这其中我们有大量的工作要做,控制播放状态、处理异常中断、进行音频编码等等。由于牵扯内容过多,而且不是本文目的,如果以后有时间将另开一篇文章重点介绍,目前有很多第三方优秀框架可以直接使用,例如AudioStreamer、FreeStreamer。由于前者当前只有非ARC版本,所以下面不妨使用FreeStreamer来简单演示在线音频播放的过程,当然在使用之前要做如下准备工作:

1.拷贝FreeStreamer中的Reachability.h、Reachability.m和Common、astreamer两个文件夹中的内容到项目中。

2.添加FreeStreamer使用的类库:CFNetwork.framework、AudioToolbox.framework、AVFoundation.framework
、libxml2.dylib、MediaPlayer.framework。

3.如果引用libxml2.dylib编译不通过,需要在Xcode的Targets-Build Settings-Header Build Path中添加$(SDKROOT)/usr/include/libxml2。

4.将FreeStreamer中的FreeStreamerMobile-Prefix.pch文件添加到项目中并将Targets-Build Settings-Precompile Prefix Header设置为YES,在Targets-Build Settings-Prefix Header设置为$(SRCROOT)/项目名称/FreeStreamerMobile-Prefix.pch(因为Xcode6默认没有pch文件)

然后就可以编写代码播放网络音频了:

//
//  ViewController.m
//  AudioQueueServices
//
//  Created by Kenshin Cui on 14/03/30.
//  Copyright (c) 2014年 cmjstudio. All rights reserved.
//  使用FreeStreamer实现网络音频播放#import "ViewController.h"
#import "FSAudioStream.h"@interface ViewController ()@property (nonatomic,strong) FSAudioStream *audioStream;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self.audioStream play];
}/***  取得本地文件路径**  @return 文件路径*/
-(NSURL *)getFileUrl{NSString *urlStr=[[NSBundle mainBundle]pathForResource:@"刘若英 - 原来你也在这里.mp3" ofType:nil];NSURL *url=[NSURL fileURLWithPath:urlStr];return url;
}
-(NSURL *)getNetworkUrl{NSString *urlStr=@"http://192.168.1.102/liu.mp3";NSURL *url=[NSURL URLWithString:urlStr];return url;
}/***  创建FSAudioStream对象**  @return FSAudioStream对象*/
-(FSAudioStream *)audioStream{if (!_audioStream) {NSURL *url=[self getNetworkUrl];//创建FSAudioStream对象_audioStream=[[FSAudioStream alloc]initWithUrl:url];_audioStream.onFailure=^(FSAudioStreamError error,NSString *description){NSLog(@"播放过程中发生错误,错误信息:%@",description);};_audioStream.onCompletion=^(){NSLog(@"播放完成!");};[_audioStream setVolume:0.5];//设置声音}return _audioStream;
}@end

其实FreeStreamer的功能很强大,不仅仅是播放本地、网络音频那么简单,它还支持播放列表、检查包内容、RSS订阅、播放中断等很多强大的功能,甚至还包含了一个音频分析器,有兴趣的朋友可以访问官网查看详细用法

注释:文章转自http://www.cnblogs.com/kenshincui/p/4186022.html,如需转载请注明该地址

IOS音频的流媒体播放相关推荐

  1. 视频直播APP源码开发iOS音频播放流程

    视频直播APP源码开发iOS音频播放流程 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的, ...

  2. iOS音频播放(一):概述

    (本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...

  3. 一步一步教你实现iOS音频频谱动画(一)

    如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第二篇:一步一步教你实现iOS音频频谱动画(二) 基于篇幅考虑,本次教程分为两篇文章,本篇文章主要讲述音频播放和频谱 ...

  4. iOS音频播放 (二):AudioSession 转

    原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...

  5. iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)...

    iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断) 2013-12-11 21:13 1416人阅读 评论(0) 收藏 举报  分类: cocoa SDK(139)  ...

  6. iOS 音频视频图像合成那点事

    代码地址如下: http://www.demodashi.com/demo/13420.html 人而无信不知其可 前言 很久很久没有写点什么了,只因为最近事情太多了,这几天终于闲下来了,趁此机会,记 ...

  7. iOS音频播放 (一):概述 转

    2019独角兽企业重金招聘Python工程师标准>>> 基础 先来简单了解一下一些基础的音频知识. 目前我们在计算机上进行音频播放都需要依赖于音频文件,音频文件的生成过程是将声音信息 ...

  8. 苹果ios音频的回声消除处理

    iOS设备上回声消除的例子 工业上的声音处理中,回声消除是一个重要的话题,重要性不亚于噪声消除.人声放大.自动增益等,尤其是在VoIP功能上,回声消除是每一个做VoIP功能团队的必修课.QQ.Skyp ...

  9. iOS音频编程之实时语音通信

    http://blog.csdn.net/it_yangjing/article/details/51909991 在CSDN上显示的代码格式不全,在github blog地址显示正确 iOS音频编程 ...

最新文章

  1. 防止论坛批量小广告指南
  2. 在Mac下安装使用OpenCV
  3. java学习与总结:操作系统
  4. UTF-8和Unicode
  5. Ceph分布式存储实战2.4 本章小结
  6. boost::contract模块没有宏实现base types的测试程序
  7. Orangepi Zero播放声音报错的解决方案
  8. codeforce R 491 (div2)
  9. Servlet与线程安全
  10. jaas_受JAAS保护的JAX-RS端点
  11. php追加数据,php追加数据到mysql
  12. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.
  13. 数据产品-数据分析和可视化工具Excel基础使用
  14. html语言怎样设置密码类型,html – 在使用contenteditable div时模仿密码类型输入
  15. python开发跟淘宝有联系没_Python爬取淘宝店铺和评论
  16. iOS 链接库“libbaidumapapi.a”缺少此目标所需的一个或多个体系结构:arm64、armv7
  17. java基础--ObjectInputStream和ObjectInputStream类
  18. 酒店预订高保真移动端Axure原型模板
  19. linux下录制视频流,Ubuntu Linux 下的PSP视频输出以及录制
  20. 身上黑色素怎么去除?去黑色素方法

热门文章

  1. 环保新建材,幕墙新科技 智能光电LED玻璃屏颠覆传统广告市场
  2. Tomcat部署多个war包
  3. 开个精品水果店前景怎么样,开一家水果店的前景
  4. Fiddler实现手机抓包——小白入门
  5. 导师喜欢什么样的研究生
  6. (转载)二次剩余(知识总结+板子整理)
  7. java互联网招聘系统
  8. Atheros LSDK 创建VAP命令
  9. Java程序员不得不看的38本书
  10. Linux errno错误信息大全