一. 音频
iOS中共有四种专门播放音频的方式
1.System Sound Services (系统声音服务)
2.OpenAL(夸平台的开源的音频处理接口)
3.Audio Queue Services(播放和录制音频服务)
4.AVAudioPlayer(高级音频播放器)
- System Sound Services
1.声音小于30s;
2.格式为IMA4(wav);
3.不能控制播放进度;
4.调用方法后立即播放;
5.没有循环播放与立体声播放
示例代码:
-(void)soundService {
// 找到少于30秒的音频文件(必须为wav格式)
NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"wav"];
// 转换成为url对象
NSURL *url = [NSURL fileURLWithPath:urlStr];
// 设置播放音乐的ID号,范围在1000~2000之内.
SystemSoundID soundID;
// 根据歌曲路径创建ID
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
// 系统自动播放音乐
AudioServicesPlayAlertSound(soundID);
}
- OpenAL
- Audio Queue Services
- AVAudioPlayer
AVAudioPlayer:是一个高级播放器,可以播放较多格式的音频文件.
优势:
1.支持更多的格式;
2.可以播放任意长度的音频文件;
3.支持循环播放;
4.可以同步播放多个音频文件;
5.控制播放进度以及从音频的任意一点开始播放.
注意:AVAudioPlayer是在AVFoundation框架下,工程使用中必须手动导入此框架.并且引入头文件#import <AVFoundation/AVFoundation.h>
示例代码:
-(void)soundAVAudioPlayer {
// 得到音频资源 (此处使用的文件为iPhone.mp3)
NSString *soundStr = [[NSBundle mainBundle] pathForResource:@"iPhone" ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:soundStr];
// 初始化播放器对象
self.myAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
// 设置声音大小
self.myAudioPlayer.volume = 1.0; // 声音取值0.0~1.0
// 设置播放次数,如果为负数为循环播放
self.myAudioPlayer.numberOfLoops = -1;
// 初始播放时间
self.myAudioPlayer.currentTime = 0;
// 播放音乐
[self.myAudioPlayer play];
}
二. 视频
- AVPlayer(在AVFoundation框架下)用来实现播放视频的类.
AVPlayer与AVAudioPlayer类似,AVPlayer可以用来播放音频也可以用来播放视频,并且AVPlayer可以直接播放网络音频.
- AVPlayer的使用步骤:
1.导入头文件<AVFoundation/AVFoundation.h>
2.获取播放的地址,转换成为URL对象
3.根据获取的URL对象创建AVPlayerItem对象,AVPlayerItem对象可以获取当前的视频信息,播放时间,总时长等.
4.通过AVPlayerItem对象初始化AVPlayer对象
5.初始化一个AVPlayerLayer对象并指定AVPlayer
6.设置AVPlayerLayer的大小
7.将AVPlayerLayer添加到显示的View上
8.开始播放
示例代码:
-(void)loadAVPlayer {
// 1.得到网络视频地址
NSString *pathStr = @"http://baobab.wdjcdn.com/1455782903700jy.mp4";
NSURL *url = [NSURL URLWithString:pathStr];
// 2.构建播放单元
self.item = [[AVPlayerItem alloc] initWithURL:url];
// 3.初始化播放器
self.myAVPlayer = [[AVPlayer alloc] initWithPlayerItem:self.item];
// 4.构建播放界面(指定哪个播放器)
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myAVPlayer];
// 5.指定播放界面的大小
self.playerLayer.frame = self.view.layer.frame;
// 6.添加layer
[self.view.layer addSublayer:self.playerLayer];
// 7.播放
[self.myAVPlayer play];
}
获取视频的总时长的时候,需要通过计算可得:
通过AVPlayerItem的Duration结构体中的value值(为视频的总帧数)除以AVPlayerItem的Duration结构体中的timeScale(播放一帧需要的时间)即可以得出视频的总时长
而获取当前播放的时间与其类似获取AVPlayerItem的currentTime结构体中的value值(为当前播放的帧数)除以AVPlayerItem的currentTime结构体中的timeScale(播放一帧所需要的时间)即可以得出视频当前播放的时间.
让视频从指定的时间开始播放:
// Time为CMTime类型,Block中的参数是用来判断是否完成视频的播放.
[self.myAVPlayer seekToTime:(CMTime) completionHandler:^(BOOL finished) {
}]