最近工作中有用到视频播放的内容,分享一些简单的用法给大家(由于网速问题,本例中使用的是本地的资源进行播放,要播放网络上的修改一些URL即可)
1.iOS9之前的视频播放
首先需要导入MediaPlayer
框架. 在iOS9之前视频播放有两种方式.
- 一种是带有View的
MPMoviePlayerViewController
;
// 1. 带有View的控制器 NSURL *url = [[NSBundle mainBundle] URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil]; // 创建视频播放器 MPMoviePlayerViewController *mpvc = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; // 展示 [self presentMoviePlayerViewControllerAnimated:mpvc];
2. 一种是不带View的MPMoviePlayerController
// 1. 不带View的(这里不带view是指控制器的名字中没有带view,只是做个区分,不过它需要设置自身的view) NSURL *url = [[NSBundle mainBundle] URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil]; MPMoviePlayerController *mpc = [[MPMoviePlayerController alloc] initWithContentURL:url];//这里大小是随意设的,要看工作需要 mpc.view.frame = CGRectMake(40, 50, 200, 200); // 设置控制工具栏的样式 mpc.controlStyle = MPMovieControlStyleEmbedded; // 把播放视图添加到控制器的view上 [self.view addSubview:mpc.view]; // 开始播放 [mpc play]; // 强引用 self.mpc = mpc;
3.通过监听播放完的通知来实现自动播放下一个视频
// 注册通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackDidFinishNotification:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
/// 当播放结束了调用该方法 - (void) moviePlayerPlaybackDidFinishNotification:(NSNotification *) notification { NSLog(@"%@",notification.userInfo); MPMovieFinishReason reason = [notification.userInfo[MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue]; // 如果是正常结束的播放下一曲 if (reason == MPMovieFinishReasonPlaybackEnded) { NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil]; self.mpc.contentURL = url; [self.mpc play]; } }
2.iOS9之后的视频播放
iOS9 新增AVKit
框架,新增类AVPlayerViewController
用于视频播放.注意:必须导入两个框架AVKit
和AVFoundation
因为AVPlayerViewController
本身不具备视频播放的能力,必须给他一个AVPlayer
.
代码实现:
//播放视频 //注意点: 1. 必须给他一个播放AVPlayer,而AVPlayer在AVFoundation中,所以需要导入AVFondation框架 // 2. 画中画在iPadAir2和iPadPro才能使用. - (IBAction)play:(id)sender { // 创建视频播放器 AVPlayerViewController *playerVc = [[AVPlayerViewController alloc] init]; // 需要创建一个播放对象赋值给这个控制器 NSURL *URL = [[NSBundle mainBundle] URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil]; // 设置播放器 playerVc.player = [AVPlayer playerWithURL:URL]; [self presentViewController:playerVc animated:YES completion:^{ // 开始播放 [playerVc.player play]; }]; // 设置代理 playerVc.delegate = self; }
补充:画中画的一些常用代理方法
- (void) playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController{ NSLog(@"即将开始画中画"); } - (void) playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController{ NSLog(@"已经开始画中画"); } - (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController{ NSLog(@"即将停止画中画"); } - (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController { NSLog(@"画中画已经停止"); } - (void) playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error { NSLog(@"开启画中画失败:%@",error); } /// 当播放器是modal出来的时候,当画中画的时候,是否要关闭弹出的播放控制器;默认YES - (BOOL) playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart:(AVPlayerViewController *)playerViewController{ NSLog(@"%s",__FUNCTION__); return NO; }