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];
}