iOS开发中用最简单的代码实现一个播放器

使用系统框架

  #import <AVFoundation/AVFoundation.h>

使用类

  @property (nonatomic, strong) AVPlayer *player;
  @property (nonatomic, strong) AVPlayerLayer *playerLayer;
  @property (nonatomic, strong) AVPlayerItem * item;
  @property (nonatomic, strong) AVURLAsset *asset;

创建一个视频播放器

1.自定义视频播放器继承自UIView
2.创建一个AVPlayerLayer对象playerLayer

     #pragma mark --- 懒加载
 - (AVPlayerLayer *)playerLayer{
    if (_playerLayer == nil) {
    _playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
     _playerLayer.backgroundColor = [UIColor blueColor].CGColor;
       }
    return _playerLayer;
}
- (AVPlayer *)player{
if (_player == nil) {
    _player = [[AVPlayer alloc] init];
}
return _player;
}

3.将playerLayer添加到自定义播放器的layer上

    [self.layer addSublayer:self.playerLayer];

4.在自定义播放器上添加播放/暂停按钮、进度条、播放时间、全屏按钮等
5.实现播放视频、全屏显示等一系列功能。

#pragma mark --- 播放、暂停
- (void)playOrPause:(UIButton*)btn{
NSLog(@"播放....");
btn.selected = !btn.selected;
[self addTimeObsever];
if (@available(iOS 10.0, *)) {
    if (self.player.timeControlStatus == AVPlayerTimeControlStatusPaused) {
        [_playBtn setImage:[UIImage imageNamed:@"暂停"] forState:UIControlStateNormal];
        [self.player play];
    } else if (self.player.timeControlStatus == AVPlayerTimeControlStatusPlaying) {
        [_playBtn setImage:[UIImage imageNamed:@"播放"] forState:UIControlStateNormal];
        [self.player pause];
    }
} else {
    // Fallback on earlier versions
    if (btn.selected == YES) {
        [_playBtn setImage:[UIImage imageNamed:@"暂停"] forState:UIControlStateNormal];
        [self.player play];
    }else{
        [_playBtn setImage:[UIImage imageNamed:@"播放"] forState:UIControlStateNormal];
        [self.player pause];
    }
}
}
- (void)playWithVideoURL:(NSURL *)videoURL{
AVURLAsset * asset = [AVURLAsset assetWithURL:videoURL];
AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];
[self.player replaceCurrentItemWithPlayerItem:item];
[item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:NULL];
_item = item;
_asset = asset;
}

 #pragma mark --- 对播放器的状态进行监听
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSTimeInterval totalTime = CMTimeGetSeconds(_asset.duration);
if ([keyPath isEqualToString:@"status"]) { // 检测播放器状态
    AVPlayerStatus status = [[change objectForKey:@"new"] intValue];
    if (status == AVPlayerStatusFailed) {
        NSLog(@"资源不存在...");
    }else if (status == AVPlayerStatusUnknown){
        NSLog(@"发生未知错误...");
    }else if (status == AVPlayerStatusReadyToPlay){
        NSLog(@"达到播放状态...");
        _slider.maximumValue = totalTime;
        _allTimeLbl.text = [self stringWithTime:totalTime];
    }
}
}  

#pragma mark --- 屏幕发生旋转调用的方法
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
[super traitCollectionDidChange:previousTraitCollection];

if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) { // 转至竖屏
    [self.videoView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(self.view);
        make.top.equalTo(self.view.mas_top).offset(100);
        make.height.equalTo(@(200));
    }];
} else if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) { // 转至横屏
    [self.videoView mas_remakeConstraints:^(MASConstraintMaker *make) {
        if (kSystemVersionFloat > 11.0) {
            make.left.bottom.right.top.equalTo(self.view.mas_safeAreaLayoutGuide);
        }else{
            make.left.bottom.right.top.equalTo(self.view);
        }            
    }];
}
}

注意

1.如果你在点击全屏按钮的时候并没有实现全屏,那可能是因为你设置的屏幕只能是竖屏


0.竖屏.png

这种情况需要我们再点击全屏的时候让屏幕能够旋转
我们需要实现AppDelegate中的一个代理方法

  - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
// 设置是否支持横屏
if (self.isShouAutoRotate) {
    NSLog(@"支持各个屏幕方向...");
    return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationMaskPortrait;
}

我们可以去设置isShouAutoRotate这个属性,通过设置该属性控制屏幕是否能进行旋转。

详细看demohttps://gitee.com/liangsenliangsen/watch_videos.git
****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 这个星期我感冒了 重感冒 鼻塞流鼻涕打喷嚏 这星期也知道他有女朋友了 他发的微博 看来也不过如此 男人 人性 也不过如此
    小卡卡爱阅读 170评论 0 0
  • 你承认自己是流水线上生产出来的零件吗? 我承认!但我不屈服! 把自己从温室里扔出去,仍到雪地里,就像岑谷地里的菜蔬...
    我不是零件阅读 822评论 0 4
  • viewControllers:// The current view controller stack. 如何一...
    天空没有太阳阅读 730评论 0 51
  • 1、苏州汤包:周末的早餐,要认真对待,啊,想吃小笼包,去吃吧,苏州汤包+蟹粉汤包,一杯豆浆,两人餐,满足。 2、青...
    Morning小土豆阅读 189评论 0 1