iOS提供了MPMoviePlayerController、MPMoviePlayerViewController两个类,可以用来轻松播放视频和网络流媒体\网络音频
提示:网络音频同样使用此控制器播放
YouTobe就是用MPMoviePlayerController实现的
MPMoviePlayerViewController只能全屏播放视频
上述两个类都定义在了MediaPlayer框架中
MPMoviePlayerController可以播放的视频格式包括:H.264、MPEG-4等
⽀持的文件扩展名包括:avi,mkv,mov,m4v,mp4等
可以从苹果官网:http://support.apple.com/kb/HT1425下载一些用来测试的视频文件,文件都比较⼩
提示:MPMoviePlayerController并不⽀支持所有的视频格式,如果要播放不⽀支持的视频格
式,需要借助第三⽅方框架进⾏行解码,如VLC
接下来这个Demo演示了如何使用MPMoviePlayerController来播放视频:
源码下载地址:http://download.csdn.net/detail/liu537192/8579635
效果图:
核心代码:
//
// JLViewController.m
// 01-视频播放
//
// Created by Mac on 15-4-9.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLViewController.h"
#import "JLMoviePlayerController.h"
@interface JLViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@end
@implementation JLViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"主界面";
}
# pragma mark -代理方法
- (void)moviePlayerDidCaptureFinishedWithImage:(UIImage *)image{
if (self.imageView1.image == nil) {
self.imageView1.image = image;
}else{
self.imageView2.image = image;
}
}
/**
* push前作的准备工作
*/
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
// 获取push的目标控制器
JLMoviePlayerController *mpc = segue.destinationViewController;
// 设置目标控制器的代理
mpc.delegate = self;
}
@end
//
// JLMoviePlayerController.h
// 01-视频播放
//
// Created by Mac on 15-4-9.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
@protocol JLMoviePlayerControllerDelegate
@optional
/**
* 截图完成的时候通知代理,并把图片传给代理
*/
- (void)moviePlayerDidCaptureFinishedWithImage:(UIImage *)image;
@end
@interface JLMoviePlayerController : UIViewController
@property (nonatomic, weak)id
delegate;
@end
//
// JLMoviePlayerController.m
// 01-视频播放
//
// Created by Mac on 15-4-9.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import "JLMoviePlayerController.h"
#import
@interface JLMoviePlayerController ()
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;
@end
@implementation JLMoviePlayerController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"视频播放";
[self setupPlayer];
[self addNotification];
}
/**
* 添加对通知的监听
*/
- (void)addNotification{
// 获取通知中心
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
// 添加对播放状态的监听
[nc addObserver:self selector:@selector(stateChanged) name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
// 添加对播放完成的监听
[nc addObserver:self selector:@selector(finished) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
// 添加对进入全屏的监听
[nc addObserver:self selector:@selector(enterFullscreen) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
// 添加对退出全屏的监听
[nc addObserver:self selector:@selector(exitFullscreen) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
// 添加对截图完成的监听
[nc addObserver:self selector:@selector(captureFinished:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];
// 截取视频第6秒和第20秒的截图
// MPMovieTimeOptionExact 精确时间
// MPMovieTimeOptionNearestKeyFrame 大概时间
[self.moviePlayer requestThumbnailImagesAtTimes:@[@(6.0f), @(20.0f)] timeOption:MPMovieTimeOptionNearestKeyFrame];
}
/**
* 设置播放器
*/
- (void)setupPlayer{
// NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"promo_full.mp4" ofType:nil];
// NSURL *movieUrl = [NSURL URLWithString:moviePath];
// 本地视频的url不能用上面两句代码的方式获取。
NSURL *movieUrl = [[NSBundle mainBundle] URLForResource:@"promo_full.mp4" withExtension:nil];
// 设置播放器要播放的内容的url
[self.moviePlayer setContentURL:movieUrl];
// 设置播放器frame
self.moviePlayer.view.frame = self.view.bounds;
// 设置播放器的宽高自动适应屏幕,如果不这样设置,切换横竖屏时,view的大小不会改变。
self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
// 将播放器添加到view
[self.view addSubview:self.moviePlayer.view];
// 播放
[self.moviePlayer play];
}
- (MPMoviePlayerController *)moviePlayer{
if (_moviePlayer == nil) {
_moviePlayer = [[MPMoviePlayerController alloc] init];
}
return _moviePlayer;
}
/**
* 截图完成
*/
- (void)captureFinished:(NSNotification *)notification{
NSLog(@"captureFinished");
if ([self.delegate respondsToSelector:@selector(moviePlayerDidCaptureFinishedWithImage:)]) {
// 获取截取到的图片
UIImage *image = notification.userInfo[MPMoviePlayerThumbnailImageKey];
// 通知代理,并把图片传给代理
[self.delegate moviePlayerDidCaptureFinishedWithImage:image];
}
}
/**
* 退出全屏
*/
- (void)exitFullscreen{
NSLog(@"exitFullscreen");
}
/**
* 进入全屏
*/
- (void)enterFullscreen{
NSLog(@"enterFullscreen");
}
/**
* 播放完毕
*/
- (void)finished{
NSLog(@"finished");
// 播放完毕后,把播放视频的控制从控制器栈中移除(出栈)。
[self.navigationController popViewControllerAnimated:YES];
}
/**
播放状态改变:
MPMoviePlaybackStateStopped, 停止
MPMoviePlaybackStatePlaying, 播放
MPMoviePlaybackStatePaused, 暂停
MPMoviePlaybackStateInterrupted, 中断
MPMoviePlaybackStateSeekingForward, 下一集
MPMoviePlaybackStateSeekingBackward 上一集
*/
- (void)stateChanged{
switch (self.moviePlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
NSLog(@"播放");
break;
case MPMoviePlaybackStatePaused:
NSLog(@"暂停");
break;
case MPMoviePlaybackStateStopped:
NSLog(@"停止");
break;
default:
break;
}
}
#pragma mark -生命周期方法
- (void)dealloc{
NSLog(@"dealloc");
// 移除所有对通知的监听
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end