iOS开发之视频播放
1、如何播放视频
iOS提供了MPMoviePlayerController、MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频。
提示:网络音频同样使用此控制器播放。YouTobe就是用MPMoviePlayerController实现的。
MPMoviePlayerViewController只能全屏播放视频。
上述两个类都定义在了MediaPlayer框架中,必须手动添加:

2、MPMoviePlayerController支持的格式
n MPMoviePlayerController
n 继承自NSObject
n 内部有个view可以展示视频内容
n 将该视图添加其他控制器的view上,即可显示视频内容
n MPMoviePlayerController可以播放的视频格式包括:
n H.264、MPEG-4等
n 支持的文件扩展名包括:avi,mkv,mov,m4v,mp4等
n 可以从苹果官网:http://support.apple.com/kb/HT1425下载一些用来测试的视频文件,文件都比较小
n 提示:MPMoviePlayerController并不支持所有的视频格式,如果要播放不支持的视频格式,需要借助第三方框架进行解码,如VLC
n https://github.com/videolan/vlc
3、MPMoviePlayerController的使用
加载视频资源(注意,如果url为nil同样可以加载):
NSAssert(self.url, @"URL不能为空");
[[MPMoviePlayerController alloc] initWithContentURL:self.url];
显示:
[self.view addSubview:self.moviePlayer.view];
通过设置AutoresizingMask属性可以在横竖屏转换时自动调整视图大小
播放:
[self.moviePlayer play];
全屏:
[self.moviePlayer setFullscreen:YES animated:YES];
【备注】MPMoviePlayerController的播放状态是通过通知中心监听的
例如:
#import "MJMoviePlayerViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface MJMoviePlayerViewController ()
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
@end
@implementation MJMoviePlayerViewController
- (MPMoviePlayerController *)moviePlayer
{
if (!_moviePlayer) {
// 负责控制媒体播放的控制器
NSURL *url =
[[NSBundle mainBundle] URLForResource:@"promo_full.mp4" withExtension:nil];
_moviePlayer =
[[MPMoviePlayerController alloc] initWithContentURL:url];
_moviePlayer.view.frame = self.view.bounds;
_moviePlayer.view.autoresizingMask =
UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_moviePlayer.view];
}
return _moviePlayer;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.moviePlayer play];
}
@end
运行结果:

4、常用监听通知事件
状态变化:
MPMoviePlayerPlaybackStateDidChangeNotification
播放结束:
MPMoviePlayerPlaybackDidFinishNotification
退出全屏:
MPMoviePlayerDidExitFullscreenNotification
截屏完成:
MPMoviePlayerThumbnailImageRequestDidFinishNotification
截屏方法:
-requestThumbnailImagesAtTimes:timeOption:
例如:
#import "MJMoviePlayerViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface MJMoviePlayerViewController ()
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
@end
@implementation MJMoviePlayerViewController
- (MPMoviePlayerController *)moviePlayer
{
if (!_moviePlayer) {
// 负责控制媒体播放的控制器
_moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:self.movieURL];
_moviePlayer.view.frame = self.view.bounds;
_moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_moviePlayer.view];
}
return _moviePlayer;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.moviePlayer play];
[self addNotification];
}
- (void)viewDidAppear:(BOOL)animated
{
self.moviePlayer.fullscreen = YES;
}
#pragma mark - 添加通知
- (void)addNotification
{
// 1. 添加播放状态的监听
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(stateChanged) name:
MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
// 2. 播放完成
[nc addObserver:self selector:@selector(finished) name:
MPMoviePlayerPlaybackDidFinishNotification object:nil];
// 3. 全屏
[nc addObserver:self selector:@selector(finished) name:
MPMoviePlayerDidExitFullscreenNotification object:nil];
// 4. 截屏完成通知
[nc addObserver:self selector:@selector(captureFinished:) name:
MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];
// 数组中有多少时间,就通知几次
// MPMovieTimeOptionExact 精确
// MPMovieTimeOptionNearestKeyFrame 大概
[self.moviePlayer requestThumbnailImagesAtTimes:@[@(5.0), @(20.0)] timeOption:MPMovieTimeOptionNearestKeyFrame];
}
- (void)captureFinished:(NSNotification *)notification
{
NSLog(@"%@", notification);
[self.delegate moviePlayerDidCapturedWithImage:notification.userInfo[MPMoviePlayerThumbnailImageKey]];
}
- (void)finished
{
// 1. 删除通知监听
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 2. 返回上级窗体
// 谁申请,谁释放!
[self.delegate moviePlayerDidFinished];
NSLog(@"完成");
}
/**
MPMoviePlaybackStateStopped, 停止
MPMoviePlaybackStatePlaying, 播放
MPMoviePlaybackStatePaused, 暂停
MPMoviePlaybackStateInterrupted, 中断
MPMoviePlaybackStateSeekingForward, 下一个
MPMoviePlaybackStateSeekingBackward 前一个
*/
- (void)stateChanged
{
switch (self.moviePlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
NSLog(@"播放");
break;
case MPMoviePlaybackStatePaused:
NSLog(@"暂停");
break;
case MPMoviePlaybackStateStopped:
// 执行[self.moviePlayer stop]或者前进后退不工作时会触发
NSLog(@"停止");
break;
default:
break;
}
}
@end
iOS开发之视频播放的更多相关文章
- ios开发 MPMoviePlayerController 视频播放器
项目中用到视频播放功能, 写点视频基础部分 MPMoviePlayerController是通过MediaPlayer.frame引入的,可用于播放在iOS支持的所有格式的视频,用起来很简单!!! M ...
- ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)
ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:ht ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- IOS 开发中要注意的事项
1.关于拍摄 TGCameraViewController – 基于 AVFoundation 的自定义相机.样式漂亮,轻量并且可以很容易地集成到 iOS 项目中.不会内存吃紧 2.block 中对控 ...
- 文顶顶iOS开发博客链接整理及部分项目源代码下载
文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...
- iOS开发常见BUG和一些小技巧(ps:耐心看完,很实用)
[385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Created by beyond on 15/6/6. // Copyright ...
- iOS开发人员不容错过的10大工具
内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...
- iOS - 开发类库
开发类库 UI 项目名称 项目信息 1.MJRefresh 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明. ...
随机推荐
- Python爬虫:通过关键字爬取百度图片
使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本) 1.安装python2.7 ---然后在cmd当中输入python,界 ...
- php中 0 与 字符串比较的问题
今天我的技术群里,被一个很不起眼的问题炸出很多基础不稳的phper,就是这么一句 : <?php if(0 == 'yes'){ echo 'yes'; }else{ echo 'no'; } ...
- spring 定时任务 taskScheduler详解
spring 3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态.也可以使用cron表达式设置定时任务. 被执行的类要实现Runnable接口 TaskSche ...
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
- python实现多变量线性回归(Linear Regression with Multiple Variables)
本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...
- java 四则混合运算 计算器
public class Counter { /**用递归算法,把括号内的公式算出然后递归 * @param args */ public static void calculator (St ...
- 如何修改Window系统下PATH路径以及win8下masm32V11
如何修改Window系统下PATH路径 //其实这个都是临时性的, 退出dos窗口就没有用了,只是做个笔记罢了 C:\Users\Administrator> set path=E ...
- 【问题解决】使用自定义控件时,vs停止工作
问题表现:向页面中添加自定义控件时,vs卡住了,随便点击一下,然后窗口未响应,然后用资源管理器看到内存使用在飙升,监视进程会发现就是vs的进程出现了异常 问题的解决:菜鸟D在网上搜了一下,发现一个奇葩 ...
- WP8.1开发中找程序下的Assets文件夹
这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...
- 用Ajax实现自动刷新news功能
这是Ajax应用的一个小实例:在页面中自动刷新功能,比如整个新闻页面中某一个小版块的内容,无需刷新整个页面就可以自动更新: 1.首先创建简单的页面元素: <body> <input ...