iOS中支持的音频播放类型
播放音效(System Sound Service)
播放本地音频(AVFoundataion)
播放流媒体音频(AVFoundataion)
iOS支持的音频格式

注意:硬件解码器一次只能对一个音频文件解码。在实际应用开发中通常使用非压缩音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的的消耗,大致省电的目的
关于音效的使用
音效又称短音频,是一个声音文件,在应用程序中起到点缀效果,用于提升应用程序的整体用户体验
通常短音效在程序中的播放时长为1~2秒,对于某些特殊动画效果的点缀音效可以略长
由于音效的播放相对比较频繁,为了不影响应用程序的性能,在实际应用中通常使用非压缩的音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的消耗,达到省电的目的
使用系统声音服务播放音效,需要导入AudioToolbox框架
系统声音服务通过SystemSoundID来播放声音文件,对于同一个声音文件,可以创建多个SystemSoundID
系统声音服务是一套C语言的框架
为了提高应用程序性能,避免声音文件被重复加载,通常采用单例模式处理系统声音的播放
加载和播放音效代码
// 加载音效
SystemSoundID soundID;
NSString *path = [_soundBundle pathForResource:name ofType:nil];
NSURL *url = [NSURL fileURLWithPath:path];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
return soundID;
// 播放音效
AudioServicesPlaySystemSound(soundID);
// 播放音效同时振动(当用户静音时,可以通过振动提示用户注意重要操作)
AudioServicesPlayAlertSound(soundID);
使用AVAudioPlayer播放本地音乐
使用AVAudioPlayer可以播放本地音乐,具备以下特点:
能够预先缓存,提高播放的流畅性(prepareToPlay)
播放起始时间(playAtTime)
播放控制(play/pause/stop)
循环播放次数(numberOfLoops)
播放音量(volume)
设置播放速度(enableRate/rate)
音量监控(meteringEnabled/peakPowerForChannel/averagePowerForChannel)
除上述功能外,还可以通过AVAudioPlayer的代理方法监控音乐的播放进度
“流”媒体Stream 网络的音频和视频MediaPlayer
之所以设置三个缓冲区,是为了解决磁盘缓存跟不上播放速度
此方式会每次都从服务器重新下载播放.
应用程序的实际应用场景!
实例化AVAudioPlayer
NSError *error = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if (error) {
NSLog(@"加载音乐播放器失败 - %@", error.localizedDescription);
return nil;
}
return player;
AVAudioPlayer播放时的音量监控
应用场景:诵读类App的播放时长截取
// 1. 加载朗诵音频
_player = [SoundTool audioPlayerWithName:@"上01一东.mp3"];
_player.numberOfLoops = 0;
[_player prepareToPlay];
[_player setDelegate:self];
// 2. 允许音量测量
[_player setMeteringEnabled:YES];
// 3. 实例化音频信息数组
_soundInfo = [NSMutableArray array];
// 4. 启动时钟
_timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
// 5. 开始播放
[_player play];
时钟处理方法
// 1. 更新播放器音量
[_player updateMeters];
// 2. 判断是否需要记录
if ([_player averagePowerForChannel:0] > -50.0) {
if (_shouldRecord) {
NSLog(@"%f", [_player currentTime]);
if (![_soundInfo containsObject:@([_player currentTime])]) {
[_soundInfo addObject:@([_player currentTime])];
}
}
_shouldRecord = NO;
} else {
_shouldRecord = YES;
}
关于AVAudioSession
AVAudioSession是一个单例,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用
针对不同的音频应用场景,需要设置不同的音频会话分类
AVAudioSession的类别(1)
AVAudioSessionCategoryAmbient
混音播放,例如雨声、汽车引擎等,可与其他音乐一起播放
AVAudioSessionCategorySoloAmbient
后台播放,其他音乐将被停止
AVAudioSessionCategoryPlayback
独占音乐播放
AVAudioSessionCategoryRecord
录制音频
AVAudioSessionCategoryPlayAndRecord
播放和录制音频
AVAudioSessionCategoryAudioProcessing
使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音
后台播放音乐(1)——设置后台任务
+ (UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId
{
// 1. 设置并激活音频会话类别
AVAudioSession *session = [AVAudioSession sharedInstance];
[session AVAudioSessionCategoryPlayback error:nil];
[session setActive:YES error:nil];
// 2. 允许应用程序接收远程控制
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
// 3. 设置后台任务ID
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
if (newTaskId != UIBackgroundTaskInvalid && backTaskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:backTaskId];
}
return newTaskId;
}
后台播放音乐(3)——记录后台任务代号
// 后台播放任务Id
UIBackgroundTaskIdentifier _bgTaskId;
// 设置音频会话,允许后台播放
_bgTaskId = [SoundTool backgroundPlayerID:_bgTaskId];
音频录音机参数字典
NSMutableDictionary *setting = [[NSMutableDictionary alloc] init];
// 音频格式
[setting setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
// 音频采样率
[setting setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
// 音频通道数
[setting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
// 线性音频的位深度
[setting setValue:[NSNumber numberWithInt:8]forKey:AVLinearPCMBitDepthKey];
return setting;
转载于:https://my.oschina.net/itcastBlogs/blog/693030
