123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- //
- // KZVideoPlayer.m
- // KZWeChatSmallVideo_OC
- //
- // Created by HouKangzhu on 16/7/21.
- // Copyright © 2016年 侯康柱. All rights reserved.
- //
- #import "KZVideoPlayer.h"
- #import <AVFoundation/AVFoundation.h>
- @implementation KZVideoPlayer {
- AVPlayer *_player;
-
- UIView *_ctrlView;
- CALayer *_playStatus;
-
- BOOL _isPlaying;
- }
- - (instancetype)initWithFrame:(CGRect)frame videoUrl:(NSURL *)videoUrl{
- if (self = [super initWithFrame:frame]) {
- _autoReplay = YES;
- _videoUrl = videoUrl;
- [self setupSubViews];
- }
- return self;
- }
- - (void)play {
- if (_isPlaying) {
- return;
- }
- [self tapAction];
- }
- - (void)stop {
- if (_isPlaying) {
- [self tapAction];
- }
- }
- - (void)setupSubViews {
- AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:_videoUrl];
- _player = [AVPlayer playerWithPlayerItem:playerItem];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
-
- AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
- playerLayer.frame = self.bounds;
- playerLayer.videoGravity = AVLayerVideoGravityResize;
- [self.layer addSublayer:playerLayer];
-
- _ctrlView = [[UIView alloc] initWithFrame:self.bounds];
- _ctrlView.backgroundColor = [UIColor clearColor];
- [self addSubview:_ctrlView];
-
- UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
- [_ctrlView addGestureRecognizer:tap];
- [self setupStatusView];
- [self tapAction];
- }
- - (void)setupStatusView {
- CGPoint selfCent = CGPointMake(self.bounds.size.width/2+10, self.bounds.size.height/2);
- CGFloat width = 40;
-
- CGMutablePathRef path = CGPathCreateMutable();
- CGPathMoveToPoint(path, nil, selfCent.x - width/2, selfCent.y - width/2);
- CGPathAddLineToPoint(path, nil, selfCent.x - width/2, selfCent.y + width/2);
- CGPathAddLineToPoint(path, nil, selfCent.x + width/2 - 4, selfCent.y);
- CGPathAddLineToPoint(path, nil, selfCent.x - width/2, selfCent.y - width/2);
-
- CGColorRef color = [UIColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 0.5].CGColor;
-
- CAShapeLayer *trackLayer = [CAShapeLayer layer];
- trackLayer.frame = self.bounds;
- trackLayer.strokeColor = [UIColor clearColor].CGColor;
- trackLayer.fillColor = color;
- trackLayer.opacity = 1.0;
- trackLayer.lineCap = kCALineCapRound;
- trackLayer.lineWidth = 1.0;
- trackLayer.path = path;
- [_ctrlView.layer addSublayer:trackLayer];
- _playStatus = trackLayer;
-
- CGPathRelease(path);
- }
- - (void)tapAction {
- if (_isPlaying) {
- [_player pause];
- }
- else {
- [_player play];
- }
- _isPlaying = !_isPlaying;
- _playStatus.hidden = !_playStatus.hidden;
- }
- - (void)playEnd {
-
- if (!_autoReplay) {
- return;
- }
- [_player seekToTime:kCMTimeZero completionHandler:^(BOOL finished) {
- [_player play];
- }];
- }
- - (void)removeFromSuperview {
- [_player.currentItem cancelPendingSeeks];
- [_player.currentItem.asset cancelLoading];
- [[NSNotificationCenter defaultCenter] removeObserver:self ];
- [super removeFromSuperview];
- }
- - (void)dealloc {
- // NSLog(@"player dalloc");
- }
- @end
|