iOS中 MediaPlayer framework实现视频播放

版权声明:本文为博主原创文章,未经博主允许不得转载。

  iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController 类可以用于从系统媒体库中选择媒体播放。这几个类都包含与MediaPlayer.framework框架中。

这里主要介绍MediaPlayer.framework

指定根视图:

[objc] view plain copy

  1. RootTableViewController *rootTVC = [[RootTableViewController alloc] initWithStyle:UITableViewStylePlain];  
  2. UINavigationController *rootNC = [[UINavigationController alloc] initWithRootViewController:rootTVC];  
  3. self.window.rootViewController = rootNC;  

RootTableViewController.m

设置相关属性:

[objc] view plain copy

  1. #import "RootTableViewController.h"  
  2. #import "TestCell.h"  
  3. #import "TestModel.h"  
  4. #import "UIImageView+WebCache.h"  
  5. #import <MediaPlayer/MediaPlayer.h>  
  6.   
  7. @interface RootTableViewController ()  
  8.   
  9. @property (nonatomic, strong) MPMoviePlayerViewController *mpPVC;  
  10.   
  11. @property (nonatomic, strong) NSMutableArray *dataSourceArray;  
  12.   
  13. @property (nonatomic, strong) NSIndexPath *selectedIndexPath;  
  14.   
  15. @property (nonatomic, assign) CGRect selectedRect;  
  16.   
  17. @end  
  18.   
  19. @implementation RootTableViewController  

调用:

[objc] view plain copy

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.       
  5.     [self.tableView registerNib:[UINib nibWithNibName:@"TestCell" bundle:nil] forCellReuseIdentifier:@"testCell"];  
  6.     self.dataSourceArray = [NSMutableArray array];  
  7.       
  8.     [self loadDataAndShow];  
  9.   
  10. }  

加载网络数据:

[objc] view plain copy

  1. - (void)loadDataAndShow  
  2. {  
  3.     NSURL *url = [NSURL URLWithString:@"http://c.m.163.com/nc/video/list/V9LG4B3A0/y/1-20.html"];  
  4.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
  5.     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
  6.           
  7.         if (data != nil) {  
  8.             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];  
  9.             NSArray *array = dict[@"V9LG4B3A0"];  
  10.             for (NSDictionary *aDict in array) {  
  11.                 TestModel *model = [[TestModel alloc] init];  
  12.                 [model setValuesForKeysWithDictionary:aDict];  
  13.                 [self.dataSourceArray addObject:model];  
  14.             }  
  15.               
  16.             [self.tableView reloadData];  
  17.         } else {  
  18.             NSLog(@"%@", [connectionError localizedDescription]);  
  19.         }  
  20.           
  21.     }];  
  22. }  

#pragma mark - Table view data source

[objc] view plain copy

  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  2. {  
  3.     return 1;  
  4. }  
  5.   
  6. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  7. {  
  8.     return self.dataSourceArray.count;  
  9. }  

返回cell

[objc] view plain copy

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     TestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testCell" forIndexPath:indexPath];  
  4.     TestModel *model = self.dataSourceArray[indexPath.row];  
  5.     [cell.movieImageView sd_setImageWithURL:[NSURL URLWithString:model.cover]];  
  6.       
  7.     UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];  
  8.     [cell.movieImageView addGestureRecognizer:tapGR];  
  9.       
  10.     return cell;  
  11. }  

添加手势:

[objc] view plain copy

  1. - (void)tapAction:(UITapGestureRecognizer *)sender  
  2. {  
  3.     if (self.mpPVC.view) {  
  4.         [self.mpPVC.view removeFromSuperview];  
  5.     }  
  6.     UIView *view = sender.view;  
  7.     UITableViewCell *cell = (UITableViewCell *)view.superview.superview;  
  8.     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];  
  9.     self.selectedIndexPath = indexPath;  
  10.     TestModel *model = self.dataSourceArray[indexPath.row];  
  11.     self.mpPVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:model.mp4_url]];  
  12.       
  13.     self.mpPVC.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 370);  
  14.     [self.mpPVC.moviePlayer setScalingMode:MPMovieScalingModeAspectFill];  
  15.     [self.mpPVC.moviePlayer setControlStyle:MPMovieControlStyleEmbedded];  
  16.     [cell addSubview:self.mpPVC.view];  
  17.       
  18.       
  19. }  

返回高:

[objc] view plain copy

  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     return 370;  
  4. }  

添加划出屏幕小窗口效果:

[objc] view plain copy

  1. - (void)scrollViewDidScroll:(UIScrollView *)scrollView  
  2. {  
  3.     TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:self.selectedIndexPath];  
  4.     // 当前cell在tableView的坐标  
  5.     CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.selectedIndexPath];  
  6.     CGRect rectInWindow = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]];  
  7.     self.selectedRect = CGRectMake(rectInTableView.origin.x, rectInTableView.origin.y, cell.movieImageView.bounds.size.width + 20, cell.movieImageView.bounds.size.height + 20);  
  8.       
  9.       
  10.     if ([self.mpPVC.moviePlayer isPreparedToPlay]) {  
  11.         if (rectInWindow.origin.y <= -370 || rectInWindow.origin.y >= [UIScreen mainScreen].bounds.size.height) {  
  12.             [UIView animateWithDuration:.5 animations:^{  
  13.                  
  14.                 self.mpPVC.view.frame = CGRectMake(self.view.bounds.size.width - 170, self.view.bounds.size.height - 170, 170, 170);  
  15.                 [self.view.window addSubview:self.mpPVC.view];  
  16.                 self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;  
  17.                   
  18.                   
  19.             }];  
  20.         } else {  
  21.             self.mpPVC.view.frame = self.selectedRect;  
  22.             [self.tableView addSubview:self.mpPVC.view];  
  23.             self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleDefault;  
  24.         }  
  25.     }  
  26.       
  27. }  

自定义cell

[objc] view plain copy

  1. //.h  
  2. #import <UIKit/UIKit.h>  
  3.   
  4. @interface TestCell : UITableViewCell  
  5.   
  6. @property (weak, nonatomic) IBOutlet UIImageView *movieImageView;  
  7.   
  8. @end  
  9.   
  10. //.m  
  11. - (void)awakeFromNib  
  12. {  
  13.     self.movieImageView.userInteractionEnabled = YES;  
  14. }  

cell布局如下

添加model类:

[objc] view plain copy

  1. //.h  
  2. #import <Foundation/Foundation.h>  
  3.   
  4. @interface TestModel : NSObject  
  5.   
  6. @property (nonatomic, copy) NSString *cover;  
  7. @property (nonatomic, copy) NSString *mp4_url;  
  8.   
  9. @end  
  10.   
  11. //.m  
  12. - (void)setValue:(id)value forUndefinedKey:(NSString *)key  
  13. {  
  14.       
  15. }  

最终效果:

每日更新关注:http://weibo.com/hanjunqiang  新浪微博

http://blog.csdn.net/qq_31810357/article/details/49893439

时间: 2024-10-29 15:12:59

iOS中 MediaPlayer framework实现视频播放的相关文章

iOS中 MediaPlayer framework实现视频播放 韩俊强的博客

  iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController 类可以用于从系统媒体库中选择媒体播放.这几个类都包含与MediaPlayer.framework框架中. 这里主要介绍MediaPlayer.framework 指定根视图: RootTableViewController *roo

iOS中制作可复用的框架Framework

iOS中制作可复用的框架Framework         在iOS开发中,我们时常会使用一些我们封装好的管理类,框架类,方法类等,我们在实现这些文件时,可能还会依赖一些第三方库或者系统库.如果每次我们复用这些代码时,都要将关联的这些东西进行导入,甚至还要进行arc和mrc的编译设置,会浪费我们很大的精力.除此之外,如果项目需要多人合作,你可能也并不希望你的源代码暴漏在所有人的面前,这个时候,我们就可以使用静态库或者动态库的方式来对我们的代码进行包装,便于复用.静态库的制作方法在一篇旧的博客中有

iOS中 Framework静态库的创建和使用遇到的那些坑 韩俊强的博客

前言 网上关于Framework制作的教程数不胜数,然而都过于陈旧,最新的也是使用Xcode7的教程,而且有些设置也只给出步骤,并没有给出原因,而且按照有些教程制作出的framework还有些问题,所以我把自己制作framework的过程记录下来,并且使用的是最新的Xcode8环境.本次制作framework,包含AFN,FMDB第三方,.a文件,xib,Bundle文件,还有Category分类,几乎制作和使用framework遇到的所有坑都被我遇到了,所以,此篇博客在我这属于干货,特此分享给

iOS中 MPMoviePlayer 实现视频音频播放

版权声明:本文为博主原创文章,未经博主允许不得转载. iOS播放视频文件一般使用 MPMoviePlayerViewController 和 MPMoviePlayerController.前者是一个view,后者是个Controller.区别就是 MPMoviePlayerViewController里面包含了一个MPMoviePlayerController    注意:MPMoviePlayerViewController 必须   presentMoviePlayerViewContro

iOS中 MPMoviePlayer 实现视频音频播放 作者:韩俊强

ios播放视频文件一般使用 MPMoviePlayerViewController 和 MPMoviePlayerController.前者是一个view,后者是个Controller.区别就是 MPMoviePlayerViewController里面包含了一个MPMoviePlayerController    注意:MPMoviePlayerViewController 必须   presentMoviePlayerViewControllerAnimated方式添加,否则Done按钮是不

iOS中 流媒体播放和下载

      每日更新关注:http://weibo.com/hanjunqiang  新浪微博  iOS中关于流媒体的简介:介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放,而渐进式下载不必等到全部下载完成后再播放,它可以一边下载一边播放,在完成播放内容之后,整个文件会保存在手机上. 实时流媒体 实时流媒体是一边接收数据包一边播放,本地不保留文件副本,实时流式传输总是实时传送,可以实时实况转播,支持随机访问,用户可以快进或者快退以观看前面或后面的内容.

iOS 中正则表达式使用方法汇总

iOS 中正则表达式使用方法汇总 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 某种语言中的正则工具算是木桶,而这个工具处理的是正则表达式,算是水,那么水很多,无论是淡水还是咸水,或是雨水,至

iOS中崩溃调试的使用和技巧总结 韩俊强的博客

 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的. 现在网上有很多关于解析崩溃信息的博客,但是大多质量参差不齐,或者有些细节没有注意到.今天写一篇博客总结一下我对崩溃调试的使用和技巧,如果有哪些错误或遗漏,还请指点,谢谢! 获取崩溃信息 在iOS中获取崩溃信息的方式有很多,比较常见的是

iOS中的动画

摘要 本文主要介绍核iOS中的动画:核心动画Core Animation, UIView动画, Block动画, UIImageView的帧动画. 核心动画Core Animation UIView动画 Block动画 UIImageView的帧动画 目录[-] iOS中的动画   Core Animation CAAnimation: CAPropertyAnimation   CAKeyframeAnimation CATransition UIView动画 Block动画 UIImageV