您的位置:首页 > 产品设计 > 产品经理

视频播放MPMoviePlayerViewController

2016-11-08 15:26 393 查看
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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: