视频播放MPMoviePlayerViewController

https://github.com/potato512/SYAVPlayer

使用MPMoviePlayerViewController进行视频播放

注意:

1、iOS9版本及以上版本已经弃用网络视频的播放了,所以MPMoviePlayerViewController现在大部分只是用作本地视频的播放,当然也并不是完全不能播放网络视频。

2、要想实现既能播放本地视频,又能播放网络视频,同时又能根据需求定制播放界面,可以采用其他的播放framework(如AVFoundation中的AVPlayer)。

3、在使用网络视频地址,或本地视频地址时,注意NSURL的使用方法:

(3-1)网络视频地址(URLWithString):

NSURL *networkUrl = [NSURL URLWithString:@"xxxxxx"];

(3-2)本地视频地址(fileURLWithPath):

NSURL *localUrl = [NSURL fileURLWithPath:@"xxxxxx"];


// 导入头文件
#import <MediaPlayer/MediaPlayer.h>
@property (nonatomic, strong) MPMoviePlayerViewController *moviePlayerController;
- (void)movieNotification
{
    // 添加通知中心
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector: @selector(moviePlayingDone)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:nil];
}
// 播放事件
- (void)moviePlayingDone
{
    NSLog(@"播放完成");
    // 方法1
    // [self.moviePlayerController.view removeFromSuperview];
    // 方法2
    [self.moviePlayerController.moviePlayer stop];
    [self dismissMoviePlayerViewControllerAnimated];
    
    self.moviePlayerController = nil;
}
- (void)moviePlay:(NSString *)filePath
{
    // 方法1
    if (filePath)
    {
        NSURL *movieUrl = [NSURL fileURLWithPath:filePath];
        
        if (movieUrl)
        {
            self.moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:movieUrl];
            
            MPMoviePlayerController *moviePlayer = [self.moviePlayerController moviePlayer];
            moviePlayer.movieSourceType = MPMovieSourceTypeFile;
            // 控制播放行为
            moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
            // 控制影片的尺寸
            moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
            // 准备播放
            [moviePlayer prepareToPlay];
            // 播放
            [moviePlayer play];
            
            // 在当前view上添加视频的视图
            // 方法1
            // [[[UIApplication sharedApplication] keyWindow] addSubview:moviePlayerView.view];
            // 方法2
            [self presentMoviePlayerViewControllerAnimated:self.moviePlayerController];
        }
    }
}
// 按钮播放事件
- (void)startPlay:(UIBarButtonItem *)button
{
    // 获取不到视频文件路径??(添加方法不当。因复制粘贴到项目文件夹,然后再添加文件到项目)
    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"3gp"];

    [self moviePlay:moviePath];    
}


封装类使用

// h文件
#import <Foundation/Foundation.h>

// 导入头文件
#import <MediaPlayer/MediaPlayer.h>

@interface MPMoviePlayer : NSObject

/// 创建单例
+ (MPMoviePlayer *)shareMPMoviePlayer;

/// 播放视频(网络视频,或本地视频)
- (void)playWithFilePath:(NSString *)filePath target:(id)target;

@end
// m文件
#import "MPMoviePlayer.h"

@interface MPMoviePlayer ()

@property (nonatomic, retain) MPMoviePlayerViewController *playerViewController;
@property (nonatomic, strong) MPMoviePlayerController *playerController;
@property (nonatomic, strong) NSURL *playerUrl;
@property (nonatomic, strong) UIViewController *controller;

@end

@implementation MPMoviePlayer

#pragma mark - 生命周期

// 初始化
- (id)init
{
    self = [super init];
    if (self)
    {

    }
    
    return self;
}

// 内存管理
- (void)dealloc
{
    NSLog(@"dealloc");
    
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    
    [self.playerController stop];
}

#pragma mark - 单例

/// 创建单例
+ (MPMoviePlayer *)shareMPMoviePlayer
{
    static MPMoviePlayer *sharedManager;
    if (sharedManager == nil)
    {
        @synchronized (self) {
            sharedManager = [[self alloc] init];
            assert(sharedManager != nil);
        }
    }
    return sharedManager;
}

#pragma mark - 通知

- (void)addNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:nil];
}

- (void)movieFinishedCallback:(NSNotification *)aNotification
{
    NSLog(@"movieFinishedCallback");


//    [UIView animateWithDuration:0.3 animations:^{
//        CGRect rect = self.playerViewController.view.frame;
//        rect.origin.y = [UIScreen mainScreen].bounds.size.height;
//        self.playerViewController.view.frame = rect;
//    } completion:^(BOOL finished) {
//        [self.playerViewController.view removeFromSuperview];
//    }];

    
    [self.playerController stop];
    [self.controller dismissMoviePlayerViewControllerAnimated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

#pragma mark - 视频播放

/// 播放视频(网络地址,或本地路径,或本地文件名称)
- (void)playWithFilePath:(NSString *)filePath target:(id)target
{
    if (!filePath || 0 >= filePath.length || !target)
    {
        return;
    }

    self.controller = target;
    
    if ([filePath hasPrefix:@"https://"] || [filePath hasPrefix:@"http://"])
    {
        // 是否是网络文件
        self.playerUrl = [NSURL URLWithString:filePath];
        
        self.playerController.movieSourceType = MPMovieSourceTypeStreaming;
    }
    else
    {
        // 是否存在本地视频文件
        NSString *fileName = [self fileNameWithFile:filePath];
        NSString *fileType = [self fileTypeWithFile:filePath];
        NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType];
        if ([[NSFileManager defaultManager] fileExistsAtPath:path])
        {
            self.playerUrl = [NSURL fileURLWithPath:filePath];
            
            self.playerController.movieSourceType = MPMovieSourceTypeFile;
        }
    }
    
    if (self.playerUrl)
    {
//        [self.playerController prepareToPlay];
//        [self.playerController play];
//        [self addNotification];
//        // 在当前view上添加视频的视图
//        __block CGRect rect = self.playerViewController.view.frame;
//        rect.origin.y = [UIScreen mainScreen].bounds.size.height;
//        self.playerViewController.view.frame = rect;
//        [[[UIApplication sharedApplication] keyWindow] addSubview:self.playerViewController.view];
//        [UIView animateWithDuration:0.3 animations:^{
//            rect = self.playerViewController.view.frame;
//            rect.origin.y = 0.0;
//            self.playerViewController.view.frame = rect;
//        } completion:^(BOOL finished) {
//            
//        }];

        
        [self addNotification];
        [self.controller presentMoviePlayerViewControllerAnimated:self.playerViewController];

        [self.playerController prepareToPlay];
        [self.playerController play];
    }
}

#pragma mark - 获取文件名称、文件类型

- (NSString *)fileNameWithFile:(NSString *)file
{
    NSString *name = file;
    
    if (file && 0 < file.length)
    {
        NSRange range = [name rangeOfString:@"/" options:NSBackwardsSearch];
        if (range.location != NSNotFound)
        {
            name = [file substringFromIndex:(range.location + range.length)];
        }
    }
    
    NSRange range = [name rangeOfString:@"." options:NSBackwardsSearch];
    if (range.location != NSNotFound)
    {
        name = [name substringToIndex:range.location];
    }
    
    return name;
}

- (NSString *)fileTypeWithFile:(NSString *)file
{
    if (file && 0 < file.length)
    {
        NSRange range = [file rangeOfString:@"." options:NSBackwardsSearch];
        if (range.location != NSNotFound)
        {
            NSString *type = [file substringFromIndex:range.location + range.length];
            return type;
        }
        return nil;
    }
    return nil;
}

#pragma mark - getter

- (MPMoviePlayerViewController *)playerViewController
{
    if (_playerViewController == nil)
    {
        _playerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:self.playerUrl];
    }
    
    return _playerViewController;
}

- (MPMoviePlayerController *)playerController
{
    if (_playerController == nil)
    {
        _playerController = self.playerViewController.moviePlayer;
   
        // 控制播放行为
        _playerController.controlStyle = MPMovieControlStyleFullscreen;
        // 控制影片的尺寸
        _playerController.scalingMode = MPMovieScalingModeAspectFit;
        // 自动播放
        _playerController.shouldAutoplay = YES;
    }
    
    return _playerController;
}

@end



// 使用
// 步骤1 添加头文件
// 导入封装方法头文件
#import "MPMoviePlayer.h"

// 步骤2 实现
// 按钮播放事件
- (void)startPlay:(UIBarButtonItem *)button
{
    // 本地视频文件
//    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"mp4"];
    //网络视频文件
    NSString *moviePath = @"http://devimages.apple.com/iphone/samples/bipbop/gear4/prog_index.m3u8";
    
    [[MPMoviePlayer shareMPMoviePlayer] playWithFilePath:moviePath target:self];
    
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值