ios中 主要有两种音频类型,短音(如短信铃声,音效等 播放时长在30s内),长音(如歌曲等)
音效框架:AudioToolbox.framework
音乐框架:AVFoundation.framework
注意:在使用NSTimer 的时候 记得不使用的时候一定要调用 invalidate ,如果不调用 invalidate ,timer会一只在runloop中运行 最后将导致 当前控制器无法释放资源。
注意:如果要想在播放音乐时app进入后台后仍然能够继续运行(播放音乐)需要做如下几步操作:
1,在Appdelegate.m中实现如下方法内容
2,在在 Capabilities 中设置 后台模式 选中 音乐播放 和 Background fetch
//程序失去焦点的时候调用(不能跟用户进行交互了)
- (void)applicationWillResignActive:(UIApplication *)application
{
AVAudioSession *audioSession=[AVAudioSessionsharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlaybackerror:nil];
[audioSession setActive:YESerror:nil];
}
播放音效 底层由c语言实现
#pragma mark - 播放音效
- (void)playSound
{
NSString *audioFile = [[NSBundlemainBundle]pathForResource:@"Default.mp3"ofType:nil];
NSURL *fileUrl = [NSURLfileURLWithPath:audioFile];
//1.获得系统声音ID
SystemSoundID soundID=0;
/**
* inFileUrl:音频文件url
* outSystemSoundID:声音id(此函数会将音效文件加入到系统音频服务中并返回一个长整形ID)
*/
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)(fileUrl), &soundID);
//如果需要在播放完之后执行某些操作,可以调用如下方法注册一个播放完成回调函数
AudioServicesAddSystemSoundCompletion(soundID,NULL,NULL,soundCompleteCallback,NULL);
//2.播放音频
AudioServicesPlaySystemSound(soundID);//播放音效
// AudioServicesPlayAlertSound(soundID);//播放音效并震动只会震动一次
}
/**
* 播放完成回调函数
*
* @param soundID 系统声音ID
* @param clientData 回调时传递的数据
*/
void soundCompleteCallback(SystemSoundID soundID,void * clientData)
{
NSLog(@"音效播放完噢!");
NSLog(@"%u, %@", (unsignedint)soundID, clientData);
}
播放音乐
#import <AudioToolbox/AudioToolbox.h>//播放音效
#import <AVFoundation/AVFoundation.h>//播放音乐
@interface AudioVC ()<AVAudioPlayerDelegate>
//播放音乐
@property (nonatomic,strong)AVAudioPlayer *audioPlayer;
@property (nonatomic,strong)UIProgressView *progressMusic;
@property (nonatomic,strong)UIButtonK *btnMusic;//播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态)
@property (nonatomic,strong)NSTimer *timer;
@end
- (void)viewWillDisappear:(BOOL)animated
{
[superviewWillDisappear:animated];
[self.timerinvalidate];//杀掉定时器否则本控制器无法释放
}
#pragma mark - 播放音乐
- (void)playMusic
{
/*
1.初始化AVAudioPlayer对象,此时通常指定本地文件路径。
2.设置播放器属性,例如重复次数、音量大小等。
3.调用play方法播放。
*/
if (self.btnMusic.tag ==0)//此时为暂停
{
//播放
self.btnMusic.tag =1;
[self.btnMusicsetTitle:@"stop"forState:UIControlStateNormal];
if (![self.audioPlayerisPlaying])//如果当前没有播放
{
[self.audioPlayerplay];//播放音乐
[selfStartTimer];
}
}
else//此时为播放
{
//暂停
self.btnMusic.tag =0;
[self.btnMusicsetTitle:@"ing"forState:UIControlStateNormal];
if ([self.audioPlayerisPlaying])//如果当前正在播放
{
[self.audioPlayerpause];//暂停音乐
[self.timerinvalidate];
self.timer =nil;
}
}
}
/**
* 创建播放器懒加载
*
* @return 音频播放器
*/
-(AVAudioPlayer *)audioPlayer
{
if (_audioPlayer ==nil)
{
NSString *urlStr = [[NSBundlemainBundle]pathForResource:@"直到世界的尽头.mp3"ofType:nil];
NSURL *url = [NSURLfileURLWithPath:urlStr];
NSError *error =nil;
//初始化播放器,注意这里的Url参数只能是文件路径,不支持HTTP Url
_audioPlayer = [[AVAudioPlayeralloc]initWithContentsOfURL:urlerror:&error];
//设置播放器属性
_audioPlayer.numberOfLoops =0;//设置为0不循环
_audioPlayer.delegate =self;
[_audioPlayerprepareToPlay];//加载音频文件到缓存
if(error)
{
NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);
returnnil;
}
}
return_audioPlayer;
}
//懒加载
-(NSTimer *)StartTimer
{
if (!_timer)
{
_timer=[NSTimerscheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(updateProgress)
userInfo:nilrepeats:true];
}
return_timer;
}
- (void)updateProgress
{
float progress=self.audioPlayer.currentTime /self.audioPlayer.duration;
[self.progressMusicsetProgress:progressanimated:true];
}
#pragma mark - 播放器代理方法
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog(@"音乐播放完成...");
}
=============================分割线================================这里只是实现了最简单的功能,如需详细了解可以参考其他大神的文章,给出一下链接
http://msching.github.io/
http://www.cnblogs.com/kenshincui/p/4186022.html#audioSession
1301

被折叠的 条评论
为什么被折叠?



