注:用xib拽的,可以去工程里找,这里只写代码部分
可以实现视频播放,可横竖屏切换,可快进快退,暂停
AppDelegate.m
#import "AppDelegate.h"
#import "PlayerViewController.h"
//#import "RootViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// RootViewController *rootVC = [[RootViewController alloc] init];
//
// self.window.rootViewController = rootVC;
PlayerViewController *playerVC = [[PlayerViewController alloc] init];
UINavigationController *naVC = [[UINavigationController alloc] initWithRootViewController:playerVC];
self.window.rootViewController = naVC;
return YES;
}
PlayerViewController.m
#import "PlayerViewController.h"
#define SCREEN_WIDTH self.view.frame.size.width
#define SCREEN_HEIGHT self.view.frame.size.height
#import <AVFoundation/AVFoundation.h>
@interface PlayerViewController ()
/**
* 播放view
*/
@property (weak, nonatomic) IBOutlet UIView *playerView;
/**
* 控制底部的视图
*/
@property (weak, nonatomic) IBOutlet UIView *bottomView;
/**
* 开始按钮
*/
- (IBAction)startBtn:(id)sender;
/**
* 用来控制快进等功能的slider的触发方法
*/
- (IBAction)sliderAction:(id)sender;
/**
* 修改进度内容的进度条
*/
@property (weak, nonatomic) IBOutlet UISlider *progressSlider;
/**
* 显示时间的label
*/
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@property (nonatomic, strong) AVPlayer *player;
@property (nonatomic, strong) AVPlayerItem *playerItem;
@property (nonatomic, strong) AVPlayerLayer *playerLayer;
@property (nonatomic, assign) BOOL isStart;
@property (nonatomic, assign) BOOL isTap;
/**
* 用来记录视频的时长,快进快退的时候需要用到
*/
@property (nonatomic, assign) CGFloat duration;;
@end
@implementation PlayerViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
/**
* 初始化播放器
*/
[self createPlayer];
// 播放
[self.player play];
// 给当前屏幕,添加一个监听横竖屏和视频结束的方法
[self addNotificationCenters];
// 创建一个轻点的手势
[self createTap];
// 对播放速度进行设置
[self addProgress];
self.timeLabel.text = @"00:00/00:00";
self.isStart = YES;
}
#pragma mark -
#pragma mark 添加进度的设置
- (void)addProgress
{
/**
* 1.CMTime:是专门用来表示视频时间的
2.CMTimeMake 是用来创建CMTime的
用法就是CMTimeMake(time,timeScale)
1.time指的是时间,但不是秒,如果想转成秒,需要通过第二个参数来完成
2.timeScale指的是1秒需要多少帧构成,而真正的时间是 time/timeScale
*/
// 设置成(1,1)每秒执行一次
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
// 当前视频的总时间,将CMTime转换成CGFloat
CGFloat durationTime = CMTimeGetSeconds(self.playerItem.duration);
// 当前时间
CGFloat current = CMTimeGetSeconds(self.player.currentTime);
// 倒计时
CGFloat rem = durationTime - current;
// 把时间转换成NSString,在进行赋值
NSString *totalLt = [NSString stringWithFormat:@"%02d:%02d",(int)rem/60,(int)rem%60];
NSString *currentTime = [NSString stringWithFormat:@"%02d:%02d",(int)current/60,(int)current%60];
NSString *resultTime = [NSString stringWithFormat:@"%@/%@",currentTime,totalLt];
self.timeLabel.text = resultTime;
// 让slider也向前移动
self.progressSlider.value = current / durationTime;
// 保存总时长,用于手动快进
self.duration = durationTime;
}];
}
#pragma mark -
#pragma mark 创建轻点手势
- (void)createTap
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.view addGestureRecognizer:tap];
self.isTap = NO;
}
#pragma mark -
#pragma mark 轻点实现视图的出现和隐藏
- (void)tapAction:(UITapGestureRecognizer *)tap
{
if (self.isTap == NO) {
[UIView animateWithDuration:0.5 animations:^{
self.bottomView.alpha = 0;
}];
}else{
[UIView animateWithDuration:0.5 animations:^{
self.bottomView.alpha = 1;
}];
}
self.isTap = !self.isTap;
}
#pragma mark -
#pragma mark 添加监听方法
- (void)addNotificationCenters
{
/**
* 监听当前的视频的播放情况,只要播放结束,就触发指定的方法
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
/**
* 监听当前屏幕的旋转
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenChange:) name: UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}
#pragma mark -
#pragma mark 监听屏幕旋转
- (void)screenChange:(NSNotification *)notification
{
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%ld",orientation);
// 根据横竖屏,分别设置播放器的frame
if (orientation == UIInterfaceOrientationLandscapeLeft) {
NSLog(@"向左横屏");
[self setPlayerLayerFrame];
}else if (orientation == UIInterfaceOrientationLandscapeRight ) {
NSLog(@"向右横屏");
[self setPlayerLayerFrame];
}else if (orientation == UIDeviceOrientationPortrait){
NSLog(@"竖屏");
[self setPortraitFrame];
}
}
#pragma mark -
#pragma mark 设置横屏时候的尺寸
- (void)setPlayerLayerFrame
{
self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);
}
#pragma mark -
#pragma mark 设置竖屏时候的尺寸
- (void)setPortraitFrame
{
self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);
}
#pragma mark -
#pragma mark 播放结束
- (void)movieEnd:(NSNotification *)notification
{
NSLog(@"播放结束了");
}
#pragma mark -
#pragma mark 初始化播放器
- (void)createPlayer
{
NSString *urlStr = [NSString stringWithFormat:@"http://flv2.bn.netease.com/videolib3/1505/24/HYUCE6348/SD/HYUCE6348-mobile.mp4"];
/**
* 对网址进行编码
*/
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:urlStr];
/**
* 根据网址,创建视频项目对象
*/
self.playerItem = [[AVPlayerItem alloc] initWithURL:url];
/**
* 创建视频播放器对象
*/
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];
/**
* 创建一个播放器承载对象,把播放器放到上面
*/
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
/**
* 设置一下承载对象的尺寸
*/
self.playerLayer.frame = CGRectMake(5, 5, SCREEN_WIDTH-10, 290);
/**
* 设置视频的填充方式
*/
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
/**
* 把播放器加到layer层上
*/
[self.playerView.layer insertSublayer:self.playerLayer atIndex:0];
self.playerView.backgroundColor = [UIColor orangeColor];
}
- (IBAction)startBtn:(id)sender
{
if (self.isStart == YES) {
[self.player pause];
}else{
[self.player play];
}
self.isStart = !self.isStart;
}
- (IBAction)sliderAction:(id)sender
{
/**
* 获取当前的时间
*/
double currentTime = self.duration*self.progressSlider.value;
// 设置要进行跳转的时间
CMTime drage = CMTimeMake(currentTime, 1);
// 对player进行设置
[self.player seekToTime:drage completionHandler:^(BOOL finished) {
[self.player play];
}];
}