两种视频播放形式和 视频截图

#import "ViewController.h"

#import <MediaPlayer/MediaPlayer.h>

#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

@property(nonatomic,weak)UIImageView  *image;

@property(nonatomic,strong)MPMoviePlayerController*controll;

@property(nonatomic,weak) UIView *avView;

@property(nonatomic,strong)AVAssetImageGenerator*gener;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

UIButton *btn=[[UIButton alloc]init];

[btn setTitle:@"model出视频控制器" forState:UIControlStateNormal];

btn.backgroundColor=[UIColor grayColor];

btn.frame=CGRectMake(10, 50, 150, 50);

[self.view addSubview:btn];

[btn addTarget:self action:@selector(btnModelController) forControlEvents:UIControlEventTouchUpInside];

UIButton *btn1=[[UIButton alloc]init];

[btn1 setTitle:@"视图上显示视频" forState:UIControlStateNormal];

btn1.backgroundColor=[UIColor grayColor];

btn1.frame=CGRectMake(200, 50, 150, 50);

[self.view addSubview:btn1];

[btn1 addTarget:self action:@selector(btnShowInCurrentController) forControlEvents:UIControlEventTouchUpInside];

UIButton *btn2=[[UIButton alloc]init];

[btn2 setTitle:@"点击截图" forState:UIControlStateNormal];

btn2.backgroundColor=[UIColor grayColor];

btn2.frame=CGRectMake(self.view.bounds.size.width/2+20, 110, 100,100);

[self.view addSubview:btn2];

[btn2 addTarget:self action:@selector(cutImage) forControlEvents:UIControlEventTouchUpInside];

UIImageView *image=[[UIImageView alloc]init];

image.frame=CGRectMake(0, 110, self.view.bounds.size.width/2, self.view.bounds.size.width/2);

[self.view addSubview:image];

image.backgroundColor=[UIColor grayColor];

self.image=image;

UIView *avView=[[UIView alloc]init];

avView.frame=CGRectMake(0, 110+ self.view.bounds.size.width/2,self.view.bounds.size.width ,self.view.bounds.size.height-110-self.view.bounds.size.width/2);

avView.backgroundColor=[UIColor greenColor];

[self.view addSubview:avView];

self.avView=avView;

}

//model出来的控制器

-(void)btnModelController

{

NSURL *url=[NSURL fileURLWithPath: [[NSBundle mainBundle]pathForResource:@"Alizee_La_Isla_Bonita.mp4" ofType:nil]];

MPMoviePlayerViewController *vc=[[MPMoviePlayerViewController alloc]initWithContentURL:url];

[self presentViewController:vc animated:YES completion:nil];

}

-(void)btnShowInCurrentController

{

NSURL *url=[NSURL fileURLWithPath: [[NSBundle mainBundle]pathForResource:@"Alizee_La_Isla_Bonita.mp4" ofType:nil]];

self.controll=[[MPMoviePlayerController alloc]initWithContentURL:url];

[self.avView addSubview:self.controll.view];

self.controll.view.frame=self.avView.bounds;

//播放

[self.controll play];

}

//截图视频中某一时刻的图片

-(void)cutImage

{

NSURL *url=[NSURL fileURLWithPath: [[NSBundle mainBundle]pathForResource:@"Alizee_La_Isla_Bonita.mp4" ofType:nil]];

//获取资源

AVAsset *asset=[AVAsset assetWithURL:url];

//建立图片生成器

AVAssetImageGenerator*gener=[[AVAssetImageGenerator alloc]initWithAsset:asset];

self.gener=gener;

//获取此刻播放进度

NSTimeInterval time= [self.controll currentPlaybackTime];

CMTime cTime=CMTimeMake(time, 1.0);

NSValue *value=[NSValue valueWithCMTime:cTime];

//截图

[gener generateCGImagesAsynchronouslyForTimes:@[value] completionHandler:^(CMTime requestedTime, CGImageRef images, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {

//添加到主队列有问题,主线程没问题

dispatch_async(dispatch_get_main_queue(), ^{

UIImage *needImage=[UIImage imageWithCGImage:images];

[self.image setImage:needImage];

});

}];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

@end

时间: 2024-12-28 21:32:49

两种视频播放形式和 视频截图的相关文章

Android开发之onClick事件的两种主要形式

第一种也是最常用的形式:通过为onClick事件添加监听器,来激发当按钮被单击时应该处理的事件.如: btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "" + "通过为onClick()事件添加监听器的方式&quo

javascript中字符串的两种定义形式

1.var s = "this is a string";  var t = "this is also a string"; s.test = 20; 2.var s = new String("this is a string"); var t = new String("this is also a string");  s.test = 20; 这两种方式有何区别? 第一种方式定义的test为s.t以及将来的所用此种形

WCF-异步调用和两种客户端形式

当发布一个服务端之后,客户端可以通过服务端的元数据,用VS2010添加服务引用的方式生成对应的代码.并且可以选择生成相应的异步操作. WCF实现代码,Add操作延时5秒后再返回结果. [ServiceContract] public interface ICalculator { [OperationContract] int Add(int x, int y); } [ServiceBehavior] public class Cal : ICalculator { public int Ad

响应式布局的两种实现形式

所谓的响应式布局,就是设计一个网站的时候,让它满足能同时适应不同的端口,而不用对不同端口设计不同的网页. 实现方式:采用百分比自适应布局 1.原生代码实现. 在国内目前设计网页的时候,一般会分成PC端和移动端两套页面,但在一定的情况下,必须满足只设计一个页面的情况下,满足不同端口都能正常使用, 因此会用用到自适应的方法. 用原生代码实现的根本在于媒体查询@media的设置. @media screen 可以查询当前浏览器的尺寸,因此可采用该方法对同一个页面设置不同的CSS样式,来满足不同分辨率要

Java线程的两种实现形式

一.创建线程的第一种方式:继承Thread类 class Demo extends Thread{ @Override public void run() { super.run(); for(int i=0;i<20;i++) System.out.println(Thread.currentThread()+"...."+i); } } public class ThreadDemo1 { public static void main(String[] args){ Dem

Oracle的sql语句的两种判断形式

判断当前列同时改动当前列 判断一个情况改动其他值 一类情况详解:实现的是当num这一列的值为3时,就显示好 以此类推 1)case num when 3 then '好' when 1 then '不好' else '还行' end taskresult 红色字是给所判断的这个列名的别名 可以不写 如果num 是一个复杂的公式的时候起别名比较方便 2)case when num = 3 then '好' When num = 1 then '不好' else '还行' end 这个方法效果同上

C++:C++的两种多态形式

1 // 2 // main.cpp 3 // Test.cpp 4 // 5 // Created by mac on 15/8/11. 6 // Copyright (c) 2015年 bjsxt. All rights reserved. 7 // 8 #include<iostream> 9 #include<cstring> 10 using namespace std; 11 class Person //基类Person 12 { 13 private: 14 str

js函数的两种定义形式,函数的实参列表arguments/形参列表函数名

1.声明式函数:function test(){}; 2.表达式函数:var test=function(){} 例:function test(a,b){} test(2,3,4) ->函数的形参和实参是可变的 函数内参数参数列表: 1.实参列表:在函数内用arguments表示,如上例:arguments=[2,3,4] 2.在函数内test.length表示形参列表长度 原文地址:https://www.cnblogs.com/fangming/p/8847650.html

java基础——Collections.sort的两种用法

Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式: public static <T extends Comparable<? super T>> void sort(List<T> list) { list.sort(null); } public static <T> void sort(List<T> list, Comparator<? super T> c) {