iOS音频播放编程简介

来源:互联网 发布:宿迁装修公司知乎 编辑:程序博客网 时间:2024/04/29 04:39

音效  

使用框架AudioToolbox.framework(基于C语言)

本质是将短音频注册到系统服务上(System Sound Service

系统服务限制

1.音频播放时间不能超过30

2.音频数据格式是PCMIMA4(必须)

3.音频文件类型是cafairwav类型

使用系统声音服务步骤

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则正常播放,如果要修改播放速率则必须设置enableRateYES

@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 URLAVAudioPlayer不支持加载网络媒体流,只能播放本地文件

- (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更新音频测量值,注意如果要更新音频测量值必须设置meteringEnabledYES,通过音频测量值可以即时获得音频分贝等信息

- (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准备好播放

0 0
原创粉丝点击