UI:媒体播放器 AVPlayer 与 AVPlayerViewController

简介

  • AVPlayer是一个可以播放任何格式的全功能影音播放器,使用AVPlayer需导入AVFoundation.h。
  • 支持视频格式: WMV,AVI,MKV,RMVB,RM,XVID,MP4,3GP,MPG等。
  • 支持音频格式:MP3,WMA,RM,ACC,OGG,APE,FLAC,FLV等。
  • 在开发中,单纯使用AVPlayer类是无法显示视频的,要将视频层添加至- AVPlayerLayer中,这样才能将视频显示出来。
  • AVPlayer并未提供视频操作组件,需用户自定义。

初始化方法

+ (instancetype)playerWithURL:(NSURL *)URL;

+ (instancetype)playerWithPlayerItem:(AVPlayerItem *)item;

- (instancetype)initWithURL:(NSURL *)URL;

- (instancetype)initWithPlayerItem:(AVPlayerItem *)item;

常用属性

  • status:获取播放媒体状态
  • rate:设置播放速度

常用方法

// 1、播放
- (void)play;

// 2、暂停
- (void)pause;

AVPlayerLayer

AVPlayerLayer主要用于显示视频
  • 初始化方法
// 1、遍历初始化
+ (instancetype)layer;

// 2、alloc + init

// 3、根据播放媒体初始化
+ (AVPlayerLayer *)playerLayerWithPlayer:(nullable AVPlayer *)player;
  • 常用属性
    bounds:设置播放矩形区域;
    position:设置播放区域中心点位置;
    videoGravity:设置拉伸模式
    player:设置播放媒体

AVPlayerViewController

  • AVPlayerViewController提供了默认的可视化控制界面,要使用AVPlayerViewController需导入AVKit.h。
  • AVPlayerViewController整合了一个完整的播放器,可以作为控制器进行操作显示。
  • AVPlayerViewController可以支持播放本地及网络视频文件,支持以下格式:.mov、.mp4、.mpv、.3gp。
常用属性
  • player:设置播放器
  • showsPlaybackControls:设置是否显示媒体播放组件,默认YES
  • videoGravity:设置视频拉伸模式
  • allowsPictureInPicturePlayback:设置是否允许画中画回放,默认YES
  • delegate:设置代理
AVPlayerViewControllerDelegate
// 1、即将开始画中画
- (void)playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController;

// 2、开始画中画
- (void)playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController;

// 3、画中画失败
- (void)playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error;

// 4、即将结束画中画
- (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController;

// 5、结束画中画
- (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController;
Demo
#import "ViewController.h"
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>

enum {
    DirectPlayBtnTag = 10,
    FullScreenPlayBtnTag
};

@interface ViewController () <AVPlayerViewControllerDelegate> {
    AVPlayer *_player; /**< 媒体播放器 */
    AVPlayerViewController *_playerViewController; /**< 媒体播放控制器 */

}

@property (nonatomic, strong) UIButton *directPlayBtn;     /**< 直接播放按钮 */
@property (nonatomic, strong) UIButton *fullscreenPlayBtn; /**< 全屏播放 */

@property (nonatomic, strong) AVPlayer *player; /**< 媒体播放器 */
@property (nonatomic, strong) AVPlayerViewController *playerViewController; /**< 媒体播放控制器 */

- (void)initializeUserInterface; /**< 初始化用户界面 */

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initializeUserInterface];
}

#pragma mark *** Initialize methods ***

- (void)initializeUserInterface {
    self.title = @"音乐播放器";
    self.view.backgroundColor = [UIColor whiteColor];

    // 加载视图
    [self.view addSubview:self.directPlayBtn];
    [self.view addSubview:self.fullscreenPlayBtn];
}

#pragma mark *** Events ***
- (void)respondsToButton:(UIButton *)sender {
    switch (sender.tag) {
            // 直接播放
        case DirectPlayBtnTag: {

            if (_player) {
                [_player pause];
                _player = nil;
            }

            if (_playerViewController) {
                [_playerViewController removeFromParentViewController];
                [_playerViewController.view removeFromSuperview];
                _playerViewController = nil;
            }

            // 1、获取媒体资源地址
            NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"宣传资料.mp4"];
            NSURL *sourceMovieURL = [NSURL fileURLWithPath:path];

            // 2、创建AVPlayerItem
            AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:sourceMovieURL];
            // 3、根据AVPlayerItem创建媒体播放器
            _player = [AVPlayer playerWithPlayerItem:playerItem];
            // 4、创建AVPlayerLayer,用于呈现视频
            AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
            // 5、设置显示大小和位置
            playerLayer.bounds = CGRectMake(0, 0, 350, 300);
            playerLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), 64 + CGRectGetMidY(playerLayer.bounds) + 30);
            // 6、设置拉伸模式
            playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
            // 7、获取播放持续时间
            NSLog(@"%lld", playerItem.duration.value);
            [_player play];
            [self.view.layer addSublayer:playerLayer];
        }
            break;
            // 全屏播放
        case FullScreenPlayBtnTag: {

            if (_player) {
                [_player pause];
                _player = nil;
            }

            // 初始化URL资源地址

            // 获取网络资源地址
            // + (nullable instancetype)URLWithString:(NSString *)URLString;

            // 1、获取本地资源地址
            NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"宣传资料.mp4"]];
            // 2、初始化媒体播放控制器
            if (_playerViewController) {
                _playerViewController = nil;
            }
            // 3、配置媒体播放控制器
            _playerViewController = [[AVPlayerViewController alloc]  init];
            // 设置媒体源数据
            _playerViewController.player = [AVPlayer playerWithURL:url];
            // 设置拉伸模式
            _playerViewController.videoGravity = AVLayerVideoGravityResizeAspect;
            // 设置是否显示媒体播放组件
            _playerViewController.showsPlaybackControls = YES;
            // 设置大力
            _playerViewController.delegate = self;
            // 播放视频
            [_playerViewController.player play];
            // 设置媒体播放器视图大小
            _playerViewController.view.bounds = CGRectMake(0, 0, 350, 300);
            _playerViewController.view.center = CGPointMake(CGRectGetMidX(self.view.bounds), 64 + CGRectGetMidY(_playerViewController.view.bounds) + 30);
            // 4、推送播放
            // 推送至媒体播放器进行播放
            // [self presentViewController:_playerViewController animated:YES completion:nil];
            // 直接在本视图控制器播放
            [self addChildViewController:_playerViewController];
            [self.view addSubview:_playerViewController.view];

        }
            break;

        default:
            break;
    }
}

#pragma mark *** AVPlayerViewControllerDelegate ***
- (void)playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}

- (void)playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}

- (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}

- (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}

- (void)playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error {
    NSLog(@"%@", NSStringFromSelector(_cmd));
}
#pragma mark *** Getters ***
- (UIButton *)directPlayBtn {
    if (!_directPlayBtn) {
        _directPlayBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        _directPlayBtn.bounds = CGRectMake(0, 0, 100, 40);
        _directPlayBtn.center = CGPointMake(CGRectGetMidX(self.view.bounds) - CGRectGetMidX(_directPlayBtn.bounds), CGRectGetMidY(self.view.bounds) + 100);
        _directPlayBtn.tag = DirectPlayBtnTag;
        [_directPlayBtn setTitle:@"直接播放" forState:UIControlStateNormal];
        [_directPlayBtn addTarget:self action:@selector(respondsToButton:) forControlEvents:UIControlEventTouchUpInside];
    }
     return _directPlayBtn;
}

- (UIButton *)fullscreenPlayBtn {
    if (!_fullscreenPlayBtn) {
        _fullscreenPlayBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        _fullscreenPlayBtn.bounds = CGRectMake(0, 0, 100, 30);
        _fullscreenPlayBtn.center = CGPointMake(CGRectGetMidX(self.view.bounds) + CGRectGetMidX(_fullscreenPlayBtn.bounds), CGRectGetMidY(self.view.bounds) + 100);
        _fullscreenPlayBtn.tag = FullScreenPlayBtnTag;
        [_fullscreenPlayBtn setTitle:@"全屏播放" forState:UIControlStateNormal];
        [_fullscreenPlayBtn addTarget:self action:@selector(respondsToButton:) forControlEvents:UIControlEventTouchUpInside];

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

推荐阅读更多精彩内容