OCiOS开发:媒体播放器 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、初始化方法

// 1、遍历初始化
+ (instancetype)layer;

// 2、alloc + init

// 3、根据播放媒体初始化
+ (AVPlayerLayer *)playerLayerWithPlayer:(nullable AVPlayer *)player;

2、常用属性

  • 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;

媒体播放器案例

本案例主要讲解播放视频的使用方法;

效果展示

这里写图片描述

代码示例

#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
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值