iOS.AVFoundation.AVAudioPlayer
Morris_ 2019.01.07
前言
做流媒体相关的开发工作,对AVFoundation和AVKit这两个框架的学习是很有必要的,可能还有美颜等这些功能。
AVFoundation和AVKit框架功能很强大,感觉有点不知道从何下手的感觉,那就一点一点来看吧。这里先看AVFoundation。
AVFoundation框架结构
打开查看AVFoundation文档,里面包含有一个AFVAudio的Framework。看类名,这个库应该是提供音频相关功能的类吧。Headers里面是所有这个框架里的类。
本篇学习AVAudioPlayer
AVAudioPlayer
An audio player that provides playback of audio data from a file or memory.
这个类的主要功能就是音频播放相关功能:
- Play sounds of any duration
播放连续的音频
-
Play sounds from files or memory buffers
播放本地音频文件,或者在缓存中的音频。
-
Loop sounds
循环播放,可以设置循环播放的次数等。
-
Play multiple sounds simultaneously, one sound per audio player, with precise synchronization
可以同时播放多个音频,当然每个音频需要一个player。
-
Control relative playback level, stereo positioning, and playback rate for each sound you are playing
播放的控制,暂停、继续什么的。
-
Seek to a particular point in a sound file, which supports such application features as fast forward and rewind
seek功能,快进快退等。
-
Obtain data you can use for playback-level metering
what
AVAudioPlayer.h
1、初始化
常用的初始化方法有两个
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (nullable instancetype)initWithData:(NSData *)data error:(NSError **)outError;
一个播放连接地址的音频,这个我没试,一个是播放本地音频文件。
2、播放以及控制
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@".mp3"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSError *outEoorr = nil;
_audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&outEoorr];
_audioPlayer.volume = 0.5;
if ([_audioPlayer prepareToPlay]) {
NSLog(@"播放");
[_audioPlayer play];
}
播放存储在手机沙盒下的音频文件
NSString *filePath = ...
NSError *outError = nil;
NSURL *pathURL = [NSURL fileURLWithPath:filePath];
NSData *data = [NSData dataWithContentsOfURL:pathURL];
AVAudioPlayer *curPlayer = [[AVAudioPlayer alloc] initWithData:data error:&outError];
curPlayer.delegate = self;
if (outError) {
NSLog(@"音频播放器创建失败:%@",outError);
} else {
self.audioPlayer = curPlayer;
if ([self.audioPlayer prepareToPlay]) {
[self.audioPlayer play];
}
}
这就播出来了,其他的暂停、继续什么的,或者设置播放进度,和一般的音乐播放器一样。
属性/方法 | 描述 |
---|---|
- play | 播放 |
- playAtTime | 从指定的时间处开始播放 |
- pause | 暂停 |
- stop | 停止播放 |
- prepareToPlay | 预加载,就是loading一段音频buffers |
volume | 音量设置 |
pan | 这个属性可以用来设置左右声道,设置范围是-1.0 is left, 0.0 is center, 1.0 is right |
rate | 可以设置播放速率,也就是我们所说的倍速播放,1.0 is normal, 0.5 is half speed, 2.0 is double speed |
-averagePowerForChannel:(NSUInteger)channelNumber | 获得指定声道的分贝平均值,注意如果要获得分贝平均值必须在此之前调用updateMeters方法 |
- peakPowerForChannel:(NSUInteger)channelNumber | 获得指定声道的分贝峰值,注意如果要获得分贝峰值必须在此之前调用updateMeters方法 |
- updateMeters | 更新音频测量值,注意如果要更新音频测量值必须设置meteringEnabled为YES,通过音频测量值可以即时获得音频分贝等信息 |
这里播放的是本地文件,直接读取就播放了,不调用prepareToPlay也可以播放,但是如果是播放网络地址的音频,则一定是需要先prepareToPlay的。
看了看代理事件,其中并没有播放进度的回调,也没有播放进度的监听之类的东西。看了下网上清一色的用timer,获取currentTime。
3、获取播放信息
属性/方法 | 描述 |
---|---|
duration | 播放时长度 |
numberOfLoops | 设置循环播放次数 |
currentTime | 当前播放的时长 |
其他 | … |