iOS中 MediaPlayer framework实现视频播放 韩俊强的博客
iOS开发中播放音乐可以使用MPMusicPlayerController类来实现,播放视频可以使用MPMoviePlayerController和MPMoviePlayerViewController类来实现,同时MPMediaPickerController
类可以用于从系统媒体库中选择媒体播放。这几个类都包含与MediaPlayer.framework框架中。
这里主要介绍MediaPlayer.framework
指定根视图:
RootTableViewController *rootTVC = [[RootTableViewController alloc] initWithStyle:UITableViewStylePlain]; UINavigationController *rootNC = [[UINavigationController alloc] initWithRootViewController:rootTVC]; self.window.rootViewController = rootNC;
RootTableViewController.m
设置相关属性:
#import "RootTableViewController.h" #import "TestCell.h" #import "TestModel.h" #import "UIImageView+WebCache.h" #import <MediaPlayer/MediaPlayer.h> @interface RootTableViewController () @property (nonatomic, strong) MPMoviePlayerViewController *mpPVC; @property (nonatomic, strong) NSMutableArray *dataSourceArray; @property (nonatomic, strong) NSIndexPath *selectedIndexPath; @property (nonatomic, assign) CGRect selectedRect; @end @implementation RootTableViewController
调用:
- (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerNib:[UINib nibWithNibName:@"TestCell" bundle:nil] forCellReuseIdentifier:@"testCell"]; self.dataSourceArray = [NSMutableArray array]; [self loadDataAndShow]; }
加载网络数据:
- (void)loadDataAndShow { NSURL *url = [NSURL URLWithString:@"http://c.m.163.com/nc/video/list/V9LG4B3A0/y/1-20.html"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (data != nil) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSArray *array = dict[@"V9LG4B3A0"]; for (NSDictionary *aDict in array) { TestModel *model = [[TestModel alloc] init]; [model setValuesForKeysWithDictionary:aDict]; [self.dataSourceArray addObject:model]; } [self.tableView reloadData]; } else { NSLog(@"%@", [connectionError localizedDescription]); } }]; }
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSourceArray.count; }
返回cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { TestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testCell" forIndexPath:indexPath]; TestModel *model = self.dataSourceArray[indexPath.row]; [cell.movieImageView sd_setImageWithURL:[NSURL URLWithString:model.cover]]; UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; [cell.movieImageView addGestureRecognizer:tapGR]; return cell; }
添加手势:
- (void)tapAction:(UITapGestureRecognizer *)sender { if (self.mpPVC.view) { [self.mpPVC.view removeFromSuperview]; } UIView *view = sender.view; UITableViewCell *cell = (UITableViewCell *)view.superview.superview; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; self.selectedIndexPath = indexPath; TestModel *model = self.dataSourceArray[indexPath.row]; self.mpPVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:model.mp4_url]]; self.mpPVC.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 370); [self.mpPVC.moviePlayer setScalingMode:MPMovieScalingModeAspectFill]; [self.mpPVC.moviePlayer setControlStyle:MPMovieControlStyleEmbedded]; [cell addSubview:self.mpPVC.view]; }
返回高:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 370; }
添加划出屏幕小窗口效果:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:self.selectedIndexPath]; // 当前cell在tableView的坐标 CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.selectedIndexPath]; CGRect rectInWindow = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]]; self.selectedRect = CGRectMake(rectInTableView.origin.x, rectInTableView.origin.y, cell.movieImageView.bounds.size.width + 20, cell.movieImageView.bounds.size.height + 20); if ([self.mpPVC.moviePlayer isPreparedToPlay]) { if (rectInWindow.origin.y <= -370 || rectInWindow.origin.y >= [UIScreen mainScreen].bounds.size.height) { [UIView animateWithDuration:.5 animations:^{ self.mpPVC.view.frame = CGRectMake(self.view.bounds.size.width - 170, self.view.bounds.size.height - 170, 170, 170); [self.view.window addSubview:self.mpPVC.view]; self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleEmbedded; }]; } else { self.mpPVC.view.frame = self.selectedRect; [self.tableView addSubview:self.mpPVC.view]; self.mpPVC.moviePlayer.controlStyle = MPMovieControlStyleDefault; } } }
自定义cell
//.h #import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property (weak, nonatomic) IBOutlet UIImageView *movieImageView; @end //.m - (void)awakeFromNib { self.movieImageView.userInteractionEnabled = YES; }
cell布局如下
添加model类:
//.h #import <Foundation/Foundation.h> @interface TestModel : NSObject @property (nonatomic, copy) NSString *cover; @property (nonatomic, copy) NSString *mp4_url; @end //.m - (void)setValue:(id)value forUndefinedKey:(NSString *)key { }
最终效果:
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
iOS中 MediaPlayer framework实现视频播放 韩俊强的博客的更多相关文章
- iOS中 动态热修补技术JSPatch 韩俊强的博客
.1.4) JSPatch bridge Objective-C and JavaScript. You can call any Objective-C class and method in Ja ...
- iOS中 最新支付宝支付(AliPay) 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 现在的支付方式一般有三种, 支付宝, 微信, 网银. 个人觉得最简单易用的还是支付宝, 微信虽然看起来币支付宝要简单 ...
- iOS中 Realm错误总结整理 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 一.错误信息:Attempting to modify object outside of a write tra ...
- iOS中 断点下载详解 韩俊强的博客
布局如下: 基本拖拉属性: #import "ViewController.h" #import "AFNetworking.h" @interface Vie ...
- HTML5中 基本用法及属性 韩俊强的博客
从今天开始更新H5相关学习:希望大家能一起学习,多学习一门语言,多一门乐趣! 了解Html5: Html5基本属性: <!DOCTYPE html> <html lang=" ...
- iOS开发中的零碎知识点笔记 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 1.关联 objc_setAssociatedObject关联是指把两个对象相互关联起来,使得其中的一个对象作为另外 ...
- iOS中 扫描二维码/生成二维码详解 韩俊强的博客
最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ...
- iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客
近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang 新浪微博 指示根视图: se ...
- iOS中 HTTP/Socket/TCP/IP通信协议具体解释 韩俊强的博客
简介: // OSI(开放式系统互联), 由ISO(国际化标准组织)制定 // 1. 应用层 // 2. 表示层 // 3. 会话层 // 4. 传输层 // 5. 网络层 // 6. 数据链接层 / ...
随机推荐
- vim基本操作
Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版.它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门 ...
- c++指针函数的使用——回调函数
/* 函数指针 函数也是有地址的 所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数.同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活. 函数指针的用途 */ #i ...
- machine learning 之 Neural Network 1
整理自Andrew Ng的machine learning课程week 4. 目录: 为什么要用神经网络 神经网络的模型表示 1 神经网络的模型表示 2 实例1 实例2 多分类问题 1.为什么要用神经 ...
- Hibernate异常之Integer转float(自动类型转换错误)
错误代码: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float at org.hiber ...
- SpringMVC之Ajax与Controller交互
前面学习了拦截器,通过拦截器我们可以拦截请求,做进一步处理之后再往下进行,这里我们使用Ajax的时候会有一个问题就是会把js.css这些静态资源文件也进行了拦截,这样在jsp中就无法引入的静态资源文件 ...
- jboss规则引擎KIE Drools 6.3.0 Final 教程(2)
使用JAVA程序调用规则-运行KIE-DROOLS上的规则 第一步:建立一个MAVEN的Java工程 POM.XML 给出pom.xml文件 <project xmlns="http: ...
- ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation
ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...
- 23 广播服务结合音乐Demo5
MainActivity.java package com.dmy.demo5; import android.app.Activity; import android.content.Broadca ...
- [ExtJS5学习笔记]第三十一节 sencha extjs 5使用cmd生成的工程部署到tomcat服务器
本文地址:http://blog.csdn.net/sushengmiyan/article/details/42940883 本文作者:sushengmiyan ------------------ ...
- EBS总账(GL)模块常用表
select * from gl_sets_of_books 总帐 select * from gl_code_combinations gcc wheregcc.summary_flag='Y ...