ios——视频 MPMoviePlayerController的使用(支持本地和网络)
视频
MPMoviePlayerController
在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地 视频和网络视频播放。这个类实现了MPMediaPlayback协议,因此具备一般的播放器控制功能,例如播放、暂停、停止等。但是 MPMediaPlayerController自身并不是一个完整的视图控制器,如果要在UI中展示视频需要将view属性添加到界面中。下面列出了 MPMoviePlayerController的常用属性和方法:
| 属性 | 说明 |
| @property (nonatomic, copy) NSURL *contentURL | 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 |
| @property (nonatomic, readonly) UIView *view | 播放器视图,如果要显示视频必须将此视图添加到控制器视图中 |
| @property (nonatomic, readonly) UIView *backgroundView | 播放器背景视图 |
| @property (nonatomic, readonly) MPMoviePlaybackState playbackState | 媒体播放状态,枚举类型: MPMoviePlaybackStateStopped:停止播放 MPMoviePlaybackStatePlaying:正在播放 MPMoviePlaybackStatePaused:暂停 MPMoviePlaybackStateInterrupted:中断 MPMoviePlaybackStateSeekingForward:向前定位 MPMoviePlaybackStateSeekingBackward:向后定位 |
| @property (nonatomic, readonly) MPMovieLoadState loadState | 网络媒体加载状态,枚举类型: MPMovieLoadStateUnknown:位置类型 MPMovieLoadStatePlayable: MPMovieLoadStatePlaythroughOK:这种状态如果shouldAutoPlay为YES将自动播放 MPMovieLoadStateStalled:停滞状态 |
| @property (nonatomic) MPMovieControlStyle controlStyle | 控制面板风格,枚举类型: MPMovieControlStyleNone:无控制面板 MPMovieControlStyleEmbedded:嵌入视频风格 MPMovieControlStyleFullscreen:全屏 MPMovieControlStyleDefault:默认风格 |
| @property (nonatomic) MPMovieRepeatMode repeatMode; | 重复播放模式,枚举类型: MPMovieRepeatModeNone:不重复,默认值 MPMovieRepeatModeOne:重复播放 |
| @property (nonatomic) BOOL shouldAutoplay | 当网络媒体缓存到一定数据时是否自动播放,默认为YES |
| @property (nonatomic, getter=isFullscreen) BOOL fullscreen | 是否全屏展示,默认为NO,注意如果要通过此属性设置全屏必须在视图显示完成后设置,否则无效 |
| @property (nonatomic) MPMovieScalingMode scalingMode | 视频缩放填充模式,枚举类型: MPMovieScalingModeNone:不进行任何缩放 MPMovieScalingModeAspectFit:固定缩放比例并且尽量全部展示视频,不会裁切视频 MPMovieScalingModeAspectFill:固定缩放比例并填充满整个视图展示,可能会裁切视频 MPMovieScalingModeFill:不固定缩放比例压缩填充整个视图,视频不会被裁切但是比例失衡 |
| @property (nonatomic, readonly) BOOL readyForDisplay | 是否有相关媒体被播放 |
| @property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes | 媒体类别,枚举类型: MPMovieMediaTypeMaskNone:未知类型 MPMovieMediaTypeMaskVideo:视频 MPMovieMediaTypeMaskAudio:音频 |
| @property (nonatomic) MPMovieSourceType movieSourceType | 媒体源,枚举类型: MPMovieSourceTypeUnknown:未知来源 MPMovieSourceTypeFile:本地文件 MPMovieSourceTypeStreaming:流媒体(直播或点播) |
| @property (nonatomic, readonly) NSTimeInterval duration | 媒体时长,如果未知则返回0 |
| @property (nonatomic, readonly) NSTimeInterval playableDuration | 媒体可播放时长,主要用于表示网络媒体已下载视频时长 |
| @property (nonatomic, readonly) CGSize naturalSize | 视频实际尺寸,如果未知则返回CGSizeZero |
| @property (nonatomic) NSTimeInterval initialPlaybackTime | 起始播放时间 |
| @property (nonatomic) NSTimeInterval endPlaybackTime | 终止播放时间 |
| @property (nonatomic) BOOL allowsAirPlay | 是否允许无线播放,默认为YES |
| @property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive | 当前媒体是否正在通过AirPlay播放 |
| @property(nonatomic, readonly) BOOL isPreparedToPlay | 是否准备好播放 |
| @property(nonatomic) NSTimeInterval currentPlaybackTime | 当前播放时间,单位:秒 |
| @property(nonatomic) float currentPlaybackRate | 当前播放速度,如果暂停则为0,正常速度为1.0,非0数据表示倍率 |
| 对象方法 | 说明 |
| - (instancetype)initWithContentURL:(NSURL *)url | 使用指定的URL初始化媒体播放控制器对象 |
| - (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated | 设置视频全屏,注意如果要通过此方法设置全屏则必须在其视图显示之后设置,否则无效 |
| - (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option | 获取在指定播放时间的视频缩略图,第一个参数是获取缩略图的时间点数组;第二个参数代表时间点精度,枚举类型: MPMovieTimeOptionNearestKeyFrame:时间点附近 MPMovieTimeOptionExact:准确时间 |
| - (void)cancelAllThumbnailImageRequests | 取消所有缩略图获取请求 |
| - (void)prepareToPlay | 准备播放,加载视频数据到缓存,当调用play方法时如果没有准备好会自动调用此方法 |
| - (void)play | 开始播放 |
| - (void)pause | 暂停播放 |
| - (void)stop | 停止播放 |
| - (void)beginSeekingForward | 向前定位 |
| - (void)beginSeekingBackward | 向后定位 |
| - (void)endSeeking | 停止快进/快退 |
| 通知 | 说明 |
| MPMoviePlayerScalingModeDidChangeNotification | 视频缩放填充模式发生改变 |
| MPMoviePlayerPlaybackDidFinishNotification | 媒体播放完成或用户手动退出,具体完成原因可以通过通知userInfo中的key为MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的对象获取 |
| MPMoviePlayerPlaybackStateDidChangeNotification | 播放状态改变,可配合playbakcState属性获取具体状态 |
| MPMoviePlayerLoadStateDidChangeNotification | 媒体网络加载状态改变 |
| MPMoviePlayerNowPlayingMovieDidChangeNotification | 当前播放的媒体内容发生改变 |
| MPMoviePlayerWillEnterFullscreenNotification | 将要进入全屏 |
| MPMoviePlayerDidEnterFullscreenNotification | 进入全屏后 |
| MPMoviePlayerWillExitFullscreenNotification | 将要退出全屏 |
| MPMoviePlayerDidExitFullscreenNotification | 退出全屏后 |
| MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification | 当媒体开始通过AirPlay播放或者结束AirPlay播放 |
| MPMoviePlayerReadyForDisplayDidChangeNotification | 视频显示状态改变 |
| MPMovieMediaTypesAvailableNotification | 确定了媒体可用类型后 |
| MPMovieSourceTypeAvailableNotification | 确定了媒体来源后 |
| MPMovieDurationAvailableNotification | 确定了媒体播放时长后 |
| MPMovieNaturalSizeAvailableNotification | 确定了媒体的实际尺寸后 |
| MPMoviePlayerThumbnailImageRequestDidFinishNotification | 缩略图请求完成之后 |
| MPMediaPlaybackIsPreparedToPlayDidChangeNotification | 做好播放准备后 |
注意MPMediaPlayerController的状态等信息并不是通过代理来和外界交互的,而是通过通知中心,因此从上面的列表中可以看到常
用的一些通知。由于MPMoviePlayerController本身对于媒体播放做了深度的封装,使用起来就相当简单:创建
MPMoviePlayerController对象,设置frame属性,将MPMoviePlayerController的view添加到控制器视
图中。
实现效果如下:
#import <AVKit/AVKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//视频播放控制器
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// NSURL *url = [NSURL URLWithString:@"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4"];
self.view.backgroundColor = [UIColor whiteColor];
//播放
[self.moviePlayer play];
//添加通知
[self addNotification];
}
/**
* 取得本地文件路径
*
* @return 文件路径
*/
-(NSURL *)getFileUrl{
NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
NSURL *url=[NSURL fileURLWithPath:urlStr];
return url;
}
/**
* 取得网络文件路径
*
* @return 文件路径
*/
-(NSURL *)getNetworkUrl{
NSString *urlStr = @"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
return url;
}
-(MPMoviePlayerController *)moviePlayer{
if (!_moviePlayer) {
NSURL *url = [self getNetworkUrl];
_moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:url];
_moviePlayer.view.frame = self.view.bounds;
_moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_moviePlayer.view];
}
return _moviePlayer;
}
/**
* 添加通知监控媒体播放控制器状态
*/
-(void)addNotification{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
}
/**
* 播放状态改变,注意播放完成时的状态是暂停
*
* @param notification 通知对象
*/
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
switch (self.moviePlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
NSLog(@"正在播放...");
break;
case MPMoviePlaybackStatePaused:
NSLog(@"暂停播放.");
break;
case MPMoviePlaybackStateStopped:
NSLog(@"停止播放.");
break;
default:
NSLog(@"播放状态:%li",self.moviePlayer.playbackState);
break;
}
}
/**
* 播放完成
*
* @param notification 通知对象
*/
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
NSLog(@"播放完成.%li",self.moviePlayer.playbackState);
}
-(void)dealloc{
//移除所有通知监控
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
由于于开始升级了ios9,不管是模拟器还是真机播放都是黑屏,郁闷了好久好久,后来打印:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
在plist文件设置了允许网络请求不安全,就可以了,详细做法请看我的文章:适配一栏关于ios9 的变化。
ios——视频 MPMoviePlayerController的使用(支持本地和网络)的更多相关文章
- iOS - 使用MPMoviePlayerController播放在线视频
一 MPMoviePlayerController 简介 在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频 ...
- iOS开发系列- 视频MPMoviePlayerController
MPMoviePlayerController 在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频 ...
- IOS 播放视频 MPMoviePlayerController
在unity游戏的开头播放视频 , 根据需求 , 最后决定用 MPMoviePlayerController 来实现播放, 实现如下: by Tin 需要在AppController.mm的 Open ...
- 浅谈iOS视频开发
浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...
- iOS视频编辑SDK
IOS视频编辑SDK接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1080x72 ...
- iOS 视频开发学习
原文:浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我 ...
- iOS视频开发经验
iOS视频开发经验 手机比PC的优势除了便携外,我认为最重要的就是可以快速方便的创作多媒体作品.照片分享,语音输入,视频录制,地理位置.一个成功的手机APP从产品形态上都有这其中的一项或多项,比如in ...
- iOS - 视频开发
视频实质: 纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件.1秒内出现的图 ...
- Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案
本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...
随机推荐
- 分享jstl实现分页,类似百度分页
<c:if test=" ${requestScope.curPage <= 0}"> </ c:if> < c:if test=" ...
- [转载] 关于PreparedStatement.addBatch()方法
Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接(打电话拨号) Connecti ...
- C#中Dictionary,Hashtable,List的比较及分析
一. Dictionary与Hashtable Dictionary与Hashtable都是.Net Framework中的字典类,能够根据键快速查找值 二者的特性大体上是相同的,有时可以把Dicti ...
- Python常见数据结构--列表
列表 Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片.加.乘.检查成员. 此外,Python已经内置确定序列的长度以及确定最大和最下的元素的方法. ...
- DLL分类
使用def文件简化dll导出 VS查看DLL接口
- jQuery Form 表单提交插件-----ajaxForm() 的应用
Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.ajaxForm() 介绍 ajaxForm ...
- Ubuntu升级内核
看到微软开源.兼容.豁达,很高兴,今天研究一下Docker,查看Ubuntu内核版本,发现2.3有点低,不符合当前版本. 最低内核版本要求3.10. 升级Ubuntu内核. 首先 下载内核 网站htt ...
- hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
view code//hdu 3987 #include <iostream> #include <cstdio> #include <algorithm> #in ...
- Android中的Shape使用总结
参考:http://www.cnblogs.com/gzggyy/archive/2013/05/17/3083218.html 在Android程序开发中,我们经常会去用到Shape这个东西去定义各 ...
- NP完全问题 NP-Completeness
原创翻译加学习笔记,方便国人学习算法知识! 原文链接http://www.geeksforgeeks.org/np-completeness-set-1/ 我们已经找到很多很高效的算法来解决很难得问题 ...