AV Player是一个用来播放给予时间的视听媒体的控制器对象。将视频资源导出到界面需要使用AVPlayerLayer类;AVPlayer只管理一个单独资源的播放,当需要播放多个音频资源可以使用子类AVQueuePlayer
不需要自定义播放器的情况可以使用
MPMoviewPlayerController
参考 http://www.cnblogs.com/kenshincui/p/4186022.html#avPlayer
初始化
示例:
1 | NSURL *assetURL = [[NSBundle mainBundle] URLForResource:@"waves" withExtension:@"mp4"]; |
对播放进行控制
监听播放状态
监听AVPlayerItem的status属性,播放项开始时status为
AVPlayerItemStatusUnknow
,当状态改变为AVPlayerItemStatusReadyToPlay
才可以开始播放,只有处于这个状态时才能获得视频时长等信息。
1 | //监控状态属性,注意AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态 |
监控网络加载情况属性
监听AVPlayerItem的loadedTimeRanges属性,当loadedTimeRanges的改变时(每缓冲一部分数据就会更新此属性)可以获得本次缓冲加载的视频范围(包含起始时间、本次加载时长),这样一来就可以实时获得缓冲情况。
1 | //监控网络加载情况属性 |
时间监听
AVPlayer提供了两种时间监听方法
定期监听
使用
- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block;
1 | //每秒 |
边界时间监听
使用
- (id)addBoundaryTimeObserverForTimes:(NSArray<NSValue *> *)times queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(void))block;
- times : CMTime值组成的NSArray数组,定义了需要通知的边界点
- queue : 调度队列,指定NULL等同设置主队列
- block : 回调块
监听播放完成通知
注册
AVPlayerItemDidPlayToEndTimeNotification
的通知
1 | //给AVPlayerItem添加播放完成通知 |
生成视频缩略图
使用
AVAssetImageGenerator
类可以从 AVAsset视频中提取图片。
AVAssetImageGenerator有两个可以检索图片的方法:
- (void)generateCGImagesAsynchronouslyForTimes:(NSArray<NSValue *> *)requestedTimes completionHandler:(AVAssetImageGeneratorCompletionHandler)handler;
- 生成一组图片
- (nullable CGImageRef)copyCGImageAtTime:(CMTime)requestedTime actualTime:(nullable CMTime *)actualTime error:(NSError * __nullable * __nullable)outError CF_RETURNS_RETAINED;
- 在指定时间捕捉图片
生成一组图片示例:
1 | self.imageGenerator = // 1 |
显示字幕(视频自带)
显示字幕需要用到
AVMediaSelectionGroup
和AVMediaSelectionOption
两个类
- 初始化 AVAsset 的时候加上 availableMediaCharacteristicsWithMediaSelectionOptions 属性
- AVMediaSelectionOption的该属性会返回一个包含字符串的数组,这些字符串表示可用的媒体特性
- AVMediaCharacteristicLegible (字幕或者隐藏式字幕)
- AVMediaCharacteristicAudible (音频)
- AVMediaCharacteristicVisual (字幕)
- AVMediaSelectionOption的该属性会返回一个包含字符串的数组,这些字符串表示可用的媒体特性
请求可用的媒体特性数据后,调用 AVAsset 的 mediaSelectionGroupForMediaCharacteristic:方法为其传递需要的媒体特性,会返回 AVMediaSelectionGroup ,表示包含的备用媒体轨道
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19NSString *mc = AVMediaCharacteristicLegible; // 1
AVMediaSelectionGroup *group =
[self.asset mediaSelectionGroupForMediaCharacteristic:mc]; // 2
if (group) {
NSMutableArray *subtitles = [NSMutableArray array]; // 3
for (AVMediaSelectionOption *option in group.options) {
NSLog(@" %@ ",option.displayName);
}
}
//输出 ,表示多个字幕轨道
@"English"
@"English Forced"
@"Italian"
@"Italian Forced"
@"Portuguese"
@"Portuguese Forced"
@"Russian"
@"Russian Forced"显示字幕,通过调用 AVPlayerItem 的 selectMediaOption:inMediaSelectionGroup:方法。
1
2
3
4
5
6
7
8
9
10
11
12
13- (void)subtitleSelected:(NSString *)subtitle {
NSString *mc = AVMediaCharacteristicLegible;
AVMediaSelectionGroup *group =
[self.asset mediaSelectionGroupForMediaCharacteristic:mc]; // 1
BOOL selected = NO;
for (AVMediaSelectionOption *option in group.options) {
if ([option.displayName isEqualToString:subtitle]) {
[self.playerItem selectMediaOption:option // 2
inMediaSelectionGroup:group];
}
}
}