您的位置:首页 > 其它

简易视频播放器

2016-01-14 22:02 323 查看

注:用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:AVPlayerItemDidPlay
4000
ToEndTimeNotification 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];
}];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: