/**
* iOS中视频播放 可以使用AVPlayer
AVPlayer:不仅可以播放音频,还可播放视频;支持播放网络音频.
AVAudioPlayer:支持本地音频播放
*/
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//获取播放网址
NSURL *url = [NSURL URLWithString:@"http://video.weibo.com/show?fid=1034:c2b460554bd8334dcefa9ad4e03a8c79"];
/*AVPlayerItem 可以获取视频的信息,如播放当前时长,总时长等等
状态 status属性:
AVPlayerItemStatusUnknown, 播放器未知问题
AVPlayerItemStatusReadyToPlay, 代表可以播放 可以调用play
AVPlayerItemStatusFailed 代表视频无法播放
loadedTimeRanges: 已缓存的进度
监测该属性 展示更新UI上的缓存进度.
*/
//根据网址创建AVPlayerItem
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
playerItem.status;
playerItem.loadedTimeRanges;
//监听item的status属性 KVO
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//创建播放器对象
_player = [AVPlayer playerWithPlayerItem:playerItem];
/**
* 单独使用AVPlayer时无法显示视频的(该类并非真正的视图)
需要将视图层添加到AVPlayerLayer中
最后将layer添加到父视图的layer上.
*/
//1.创建 AVPlayerLayer对象
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:_player];
//2.设置对应属性
//设置视图层的frame
layer.frame = CGRectMake(30, 200, self.view.bounds.size.width - 60, 300);
//设置背景色
layer.backgroundColor = [UIColor blackColor].CGColor;
//设置图层的填充方式:
/** AVLayerVideoGravityResize 视频会被拉伸填充播放界面的边界
* AVLayerVideoGravityResizeAspect (默认)保持视频的宽高比,且自动适应播放界面的边界.
* AVLayerVideoGravityResizeAspectFill 保持视频的宽高比,填充图层的边界.
*/
layer.videoGravity = AVLayerVideoGravityResizeAspect;
//添加到播放界面的layer层
[self.view.layer addSublayer:layer];
}
- (IBAction)handlePlay:(id)sender {
[self.player play];
}
- (IBAction)handlePause:(id)sender {
[self.player pause];
}
#pragma KVO 回调方法
//监听对象的status属性发生变化时的回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%@ %@",object,change);
//获取播放的资源对象
AVPlayerItem *item = object;
//代表可以播放了
if (item.status == AVPlayerStatusReadyToPlay) {
//获取总时长 duration (CMTime类型)
/*CMTime
value:一共多少帧
timescale:每秒多少帧
*/
float total = item.duration.value / item.duration.timescale;
NSLog(@"%f",total);
}
}