iOS音频播放编程简介
音效
使用框架AudioToolbox.framework(基于C语言)
本质是将短音频注册到系统服务上(System Sound Service)
系统服务限制
1.音频播放时间不能超过30秒
2.音频数据格式是PCM或IMA4(必须)
3.音频文件类型是caf、air、wav类型
使用系统声音服务步骤
1.添加框架AudioToolbox.framework,引入头文件 #import <AudioToolbox/AudioToolbox.h>
2.首先获取文件路径
NSString *audioFile=[[NSBundle mainBundle] pathForResource:path ofType:nil];
NSURL *fileUrl=[NSURL fileURLWithPath:audioFile];
3.创建声音服务
SystemSoundID soundID=0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);
4.添加声音服务到系统 (如果需要在播放完之后执行某些操作,可以调用如下方法注册一个播放完成回调函数)
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
5播放声音服务
AudioServicesPlaySystemSound(soundID);//播放音效
AudioServicesPlayAlertSound(soundID);//播放音效并震动
6. 播放完成回调函数
void soundCompleteCallback(SystemSoundID soundID,void * clientData){
NSLog(@“做自己需要的操作…”);
}
音乐
使用框架AVFoundation.framework中的AVAudioPlayer来实现音乐播放
它可以实现多种音频的播放,还能进行音量、进度、播放速度的控制
使用步骤
1.添加框架AVFoundation.framework,引入头文件<AVFoundation/AVFoundation.h>
2.获取文件路径
NSString *urlStr=[[NSBundle mainBundle]pathForResource:@"陈奕迅 - 浮夸.mp3" ofType:nil];
NSURL *url=[NSURL fileURLWithPath:urlStr];
3.初始化AVAudioPlayer 对象,指定文件路径
AVAudioPlayer* myAudioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
4.设置播放器属性:音量大小、循环次数等
myAudioPlayer.volume=1.0;//音量大小
myAudioPlayer.numberOfLoops=10;//设置为0表示不循环,只播放一遍
myAudioPlayer.delegate=self;//设置代理
5.加载音频文件到缓存,准备播放
[myAudioPlayer prepareToPlay];
6.播放音乐
[myAudioPlayer play];//开始播放
[myAudioPlayer playAtTime:(NSTimeInterval)time];//在指定时间播放
7.播放完毕回调函数
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"音乐播放完成...");
}
以上是使用AVAudioPlayer的简单实现方法,具体属性以及方法见下面
AVAudioPlayer属性 说明
@property(readonly, getter=isPlaying) BOOL playing 是否正在播放,只读
@property(readonly) NSUInteger numberOfChannels 音频声道数,只读
@property(readonly) NSTimeInterval duration 音频时长
@property(readonly) NSURL *url 音频文件路径,只读
@property(readonly) NSData *data 音频数据,只读
@property float pan 立体声平衡,如果为-1.0则完全左声道,如果0.0则左右声道平衡,如果为1.0则完全为右声道
@property float volume 音量大小,范围0-1.0
@property BOOL enableRate 是否允许改变播放速率
@property float rate 播放速率,范围0.5-2.0,如果为1.0则正常播放,如果要修改播放速率则必须设置enableRate为YES
@property NSTimeInterval currentTime 当前播放时长
@property(readonly) NSTimeInterval deviceCurrentTime 输出设备播放音频的时间,注意如果播放中被暂停此时间也会继续累加
@property NSInteger numberOfLoops 循环播放次数,如果为0则不循环,如果小于0则无限循环,大于0则表示循环次数
@property(readonly) NSDictionary *settings 音频播放设置信息,只读
@property(getter=isMeteringEnabled) BOOL meteringEnabled 是否启用音频测量,默认为NO,一旦启用音频测量可以通过updateMeters方法更新测量值
对象方法 说明
- (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError 使用文件URL初始化播放器,注意这个URL不能是HTTP URL,AVAudioPlayer不支持加载 网络媒体流,只能播放本地文件
- (instancetype)initWithData:(NSData *)data error:(NSError **)outError 使用NSData初始化播放器,注意使用此方法时必须文件格式和文件后缀一致,否则出错,所以相比 此方法更推荐使用上述方法或- (instancetype)initWithData:(NSData *)data fileTypeHint:(NSString *)utiString error:(NSError **)outError 方法进行初始化
- (BOOL)prepareToPlay; 加载音频文件到缓冲区,注意即使在播放之前音频文件没有加载到缓冲区程序也会隐式调用此方法。
- (BOOL)play; 播放音频文件
- (BOOL)playAtTime:(NSTimeInterval)time 在指定的时间开始播放音频
- (void)pause; 暂停播放
- (void)stop; 停止播放
- (void)updateMeters 更新音频测量值,注意如果要更新音频测量值必须设置meteringEnabled为YES,通过音频测量值可以即时获得音频分贝等信息
- (float)peakPowerForChannel:(NSUInteger)channelNumber; 获得指定声道的分贝峰值,注意如果要获得分贝峰值必须在此之前调用updateMeters方法
- (float)averagePowerForChannel:(NSUInteger)channelNumber 获得指定声道的分贝平均值,注意如果要获得分贝平均值必须在此之前调用updateMeters方法
@property(nonatomic, copy) NSArray *channelAssignments 获得或设置播放声道
代理方法 说明
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 音频播放完成
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 音频解码发生错误
使用MediaPlayer.framework框架中的MPMusicPlayerController来实现音乐库中音乐的播放
MPMusicPlayerController中提供了两种播放器 ,如下:
+ (MPMusicPlayerController *)applicationMusicPlayer; 应用退出后音乐播放会自动停止
+ (MPMusicPlayerController *)systemMusicPlayer;应用停止后不会退出播放状态
MPMusicPlayerController的加载需要通过一个播放队列或者是播放集,支持上一曲、下一曲。方法如下:
- (void)setQueueWithQuery:(MPMediaQuery *)query
- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection
使用步骤如下:
1.添加框架MediaPlayer.framework,引入头文件#import <MediaPlayer/MediaPlayer.h>
2.获取媒体源,得到MPMediaQueue或者MPMediaItemCollection,以下是MPMediaQueue提供的方法,按需要选择。
+ (MPMediaQuery *)albumsQuery; 专辑
+ (MPMediaQuery *)artistsQuery; 艺术家
+ (MPMediaQuery *)songsQuery; 歌集
+ (MPMediaQuery *)playlistsQuery; 演出剧目表
+ (MPMediaQuery *)podcastsQuery; 播客
+ (MPMediaQuery *)audiobooksQuery; 有声读物
+ (MPMediaQuery *)compilationsQuery; 编辑
+ (MPMediaQuery *)composersQuery; 作曲家
+ (MPMediaQuery *)genresQuery; 流派
MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];获取播放队列(所有歌曲)
NSMutableArray *array=[NSMutableArray array];
for (MPMediaItem *item in mediaQueue.items) {
[array addObject:item];
}
MPMediaItemCollection *mediaItemCollection=[[MPMediaItemCollection alloc]initWithItems:[array copy]];//用播放队列变为播放集
也可以用户自己选择媒体源,这里需要用到MPMediaPickerController
mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeAny];
mediaPicker.allowsPickingMultipleItems=YES;//允许多选
mediaPicker.prompt=@"请选择要播放的音乐";
mediaPicker.delegate=self;//设置选择器代理
//选择完成回调
-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection{
给musicPlayer设置媒体源
}
//取消选择回调
-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{
}
对于用于显示的歌曲的各种信息都存放在 MPMediaItem中
MPMediaItem *mediaItem=[mediaItemCollection.items firstObject];//第一个播放音乐
3.初始化MPMusicPlayerController
MPMusicPlayerController*musicPlayer=[MPMusicPlayerController systemMusicPlayer];
[musicPlayer beginGeneratingPlaybackNotifications];//开启通知,否则监控不到MPMusicPlayerController的通知
[musicPlayer setQueueWithItemQuery:mediaQueue];//用播放队列设置媒体源
[musicPlayer setQueueWithItemCollection:mediaItemCollection];//用播放集设置媒体源
NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];//添加观察者,监听musicPlayer播放状态的变化
[notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:musicPlayer];
4.对于musicPlayer的一些基本操作
[musicPlayer play]; 播放
[musicPlayer pause]; 暂停
[musicPlayer stop]; 停止
[musicPlayer skipToNextItem]; 下一曲
[musicPlayer skipToPreviousItem]; 上一曲
[musicPlayer skipToBeginning]; 从起始位置播放
以下是对MPMusicPlayerController对象属性、方法的详细介绍
@property (nonatomic, readonly) MPMusicPlaybackState playbackState 播放器状态,枚举类型:
MPMusicPlaybackStateStopped:停止播放 MPMusicPlaybackStatePlaying:正在播放
MPMusicPlaybackStatePaused:暂停播放
MPMusicPlaybackStateInterrupted:播放中断
MPMusicPlaybackStateSeekingForward:向前查找
MPMusicPlaybackStateSeekingBackward:向后查找
@property (nonatomic) MPMusicRepeatMode repeatMode 重复模式,枚举类型:
MPMusicRepeatModeDefault:默认模式,使用用户的首选项(系统音乐程序设置)
MPMusicRepeatModeNone:不重复
MPMusicRepeatModeOne:单曲循环
MPMusicRepeatModeAll:在当前列表内循环
@property (nonatomic) MPMusicShuffleMode shuffleMode 随机播放模式,枚举类型:
MPMusicShuffleModeDefault:默认模式,使用用户首选项(系统音乐程序设置)
MPMusicShuffleModeOff:不随机播放
MPMusicShuffleModeSongs:按歌曲随机播放
MPMusicShuffleModeAlbums:按专辑随机播放
@property (nonatomic, copy) MPMediaItem *nowPlayingItem 正在播放的音乐项
@property (nonatomic, readonly) NSUInteger indexOfNowPlayingItem 当前正在播放的音乐在播放队列中的索引
@property(nonatomic, readonly) BOOL isPreparedToPlay 是否准好播放准备
@property(nonatomic) NSTimeInterval currentPlaybackTime 当前已播放时间,单位:秒
@property(nonatomic) float currentPlaybackRate 当前播放速度,是一个播放速度倍率,0表示暂停播放,1代表正常速度
类方法 说明
+ (MPMusicPlayerController *)applicationMusicPlayer; 获取应用播放器,注意此类播放器无法在后台播放
+ (MPMusicPlayerController *)systemMusicPlayer 获取系统播放器,支持后台播放
对象方法 说明
- (void)setQueueWithQuery:(MPMediaQuery *)query 使用媒体队列设置播放源媒体队列
- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection 使用媒体项集合设置播放源媒体队列
- (void)skipToNextItem 下一曲
- (void)skipToBeginning 从起始位置播放
- (void)skipToPreviousItem 上一曲
- (void)beginGeneratingPlaybackNotifications 开启播放通知,注意不同于其他播放器,MPMusicPlayerController要想获得通知必须首先开启,默认情况无法获得 通知
- (void)endGeneratingPlaybackNotifications 关闭播放通知
- (void)prepareToPlay 做好播放准备(加载音频到缓冲区),在使用play方法播放时如果没有做好准备回自动调用该方法
- (void)play 开始播放
- (void)pause 暂停播放
- (void)stop 停止播放
- (void)beginSeekingForward 开始向前查找(快进)
- (void)beginSeekingBackward 开始向后查找(快退)
- (void)endSeeking 结束查找
通知 说明(注意:要想获得MPMusicPlayerController通知必须首先调用beginGeneratingPlaybackNotifications开启通知)
MPMusicPlayerControllerPlaybackStateDidChangeNotification 播放状态改变
MPMusicPlayerControllerNowPlayingItemDidChangeNotification 当前播放音频改变
MPMusicPlayerControllerVolumeDidChangeNotification 声音大小改变
MPMediaPlaybackIsPreparedToPlayDidChangeNotification 准备好播放
iOS音频播放编程简介相关推荐
- 视频直播APP源码开发iOS音频播放流程
视频直播APP源码开发iOS音频播放流程 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的, ...
- iOS音频播放(一):概述
(本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...
- iOS音频播放 (二):AudioSession 转
原文出处 :http://msching.github.io/blog/2014/07/08/audio-in-ios-2/ 前言 本篇为<iOS音频播放>系列的第二篇. 在实施前一篇中所 ...
- iOS音频播放 (一):概述 转
2019独角兽企业重金招聘Python工程师标准>>> 基础 先来简单了解一下一些基础的音频知识. 目前我们在计算机上进行音频播放都需要依赖于音频文件,音频文件的生成过程是将声音信息 ...
- iOS音频播放第三方框架FreeStreamer解析(全)
iOS音频播放第三方框架FreeStreamer解析(全) 新项目是一款音频播放类软件,作为该项目核心功能:音频播放.第一版本是使用了系统提供的AVPlayer框架来实现音频文件的播放,再开发完成之后 ...
- iOS音频播放 (八):NowPlayingCenter和RemoteControl
转自 码农人生 ChengYin's coding life http://msching.github.io/blog/2014/11/06/audio-in-ios-8/ iOS音频播放 (八): ...
- iOS音频播放之AudioQueue(一):播放本地音乐
AudioQueue简介 AudioStreamer说明 AudioQueue详解 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput AudioQue ...
- iOS 音频播放,录音,视频播放,拍照,视频录制
iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 2014-12-26 09:15 by KenshinCui, 149110 阅读, 67 评论, 收藏, 编辑 --iOS多媒体 概览 随 ...
- iOS 音频播放 —— AVAudioSession
An audio session is a singleton object that you employ to set the audio context for your app and to ...
最新文章
- 使用一个特别设计的损失来处理类别不均衡的数据集
- C#强化系列:HttpModule,HttpHandler,HttpHandlerFactory简单使用
- 开发团队里是否需要测试人员?
- 图书馆access的Google chrome 插件
- scrapy 让指定的spider执行指定的pipeline
- C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)
- 网站源代码遭公开,2.43亿名巴西公民个人数据遭泄露
- IIS安装前已经安装了.NET Framework,安装后如何启用.NETFramework
- jdbc学习笔记3,blob类型数据的操作,preparedstatement的批量操作,数据库的事务,以及事务的特性,隔离权限的修改
- java软件工程师工作业绩_JAVA软件工程师个人简历范文
- 计算机软件系统管理说课,计算机软件系统 说课稿
- yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild错误
- np.mat()和np.transpose
- 汽车驾驶 - 如何调整汽车后视镜
- 阿里云存储OSS之九大使用技巧
- 计算机 26个英文字母代表数字,数字能量字母对照表-26个英文字母各代表什么数字...
- 如何彻底卸载win10预装的office365等
- 基于STM8的数字温度计设计
- C语言实现银行ATM存取款系统 | 附源码
- Android SDK 的 H5 打通方案演进 | 数据采集