AVFoundation下的视频分帧处理
//
// ViewController.m
// VideoFrame
//
// Created by wiseman on 16/1/27.
// Copyright (c) 2016年 wiseman. All rights reserved.
// #import "ViewController.h"
#import <AVFoundation/AVFoundation.h> @interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *myCollectionView;
@property (weak, nonatomic) IBOutlet UICollectionViewFlowLayout *myFlowLayout; @property(nonatomic,strong) NSMutableArray *Arr; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//注册cell
static NSString *ID = @"mycell";
[self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:ID]; self.myFlowLayout.itemSize = CGSizeMake((self.view.bounds.size.width-)/, (self.view.bounds.size.width-)/); [self getVideoFrame];
} #pragma mark - Array
-(NSMutableArray *)Arr{
if (!_Arr) {
_Arr = [NSMutableArray array];
}
return _Arr;
} #pragma mark - GetVideoFrame
-(void)getVideoFrame{
//1.本地mp4的地址
NSString *path = [[NSBundle mainBundle] pathForResource:@"ddd" ofType:@"mp4"];
//2.URL
NSURL *pathURL = [NSURL fileURLWithPath:path];
//3.Setting
//3.1初始化asset对象
AVURLAsset *videoAsset = [[AVURLAsset alloc]initWithURL:pathURL options:nil];
//3.2 获取总视频的长度 = 总帧数 / 每秒的帧数
long videoSumTime = videoAsset.duration.value / videoAsset.duration.timescale;
//3.3 根据人眼每秒24帧图像,计算出每秒24帧情况下的总帧数
long eyeSumValue = videoSumTime * ;
//总帧数 / 块数
long kuai = videoAsset.duration.value / eyeSumValue;
//4.创建AVAssetImageGenerator对象
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc]initWithAsset:videoAsset];
generator.maximumSize = self.view.frame.size;
generator.appliesPreferredTrackTransform = YES;
generator.requestedTimeToleranceBefore = kCMTimeZero;
generator.requestedTimeToleranceAfter = kCMTimeZero;
//5. 添加需要帧数的时间集合
NSMutableArray *arr1 = [NSMutableArray array];
for (int i = ; i < eyeSumValue; i ++) {
CMTime time = CMTimeMake(i * kuai, videoAsset.duration.timescale);
NSValue *value = [NSValue valueWithCMTime:time];
[arr1 addObject:value];
} static long count = ;
[generator generateCGImagesAsynchronouslyForTimes:arr1 completionHandler:^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
// NSString *requestedTimeString = (NSString *)
// CFBridgingRelease(CMTimeCopyDescription(NULL, requestedTime));
// NSString *actualTimeString = (NSString *)
// CFBridgingRelease(CMTimeCopyDescription(NULL, actualTime));
// NSLog(@"Requested: %@; actual %@", requestedTimeString, actualTimeString);
if (result == AVAssetImageGeneratorSucceeded) {
count++;
NSLog(@"%ld",count);
[self.Arr addObject:[UIImage imageWithCGImage:im]];
if (count == eyeSumValue) {
[self.myCollectionView reloadData];
}
} if (result == AVAssetImageGeneratorFailed) {
NSLog(@"Failed with error: %@", [error localizedDescription]);
} if (result == AVAssetImageGeneratorCancelled) {
NSLog(@"AVAssetImageGeneratorCancelled");
}
}]; } #pragma mark - UICollectionViewDataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return self.Arr.count;
} - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"mycell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
if (!cell) {
cell = [[UICollectionViewCell alloc]init];
} UIImageView *imgView = [[UIImageView alloc]initWithFrame:cell.bounds];
imgView.image = self.Arr[indexPath.row];
[cell.contentView addSubview:imgView]; return cell;
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
AVFoundation下的视频分帧处理的更多相关文章
- HTTP2.0的二进制分帧
1.帧的类型: 在二进制分帧的结构中,头部有8个字节(64Bit),其中有一个字节(8Bit)来标志帧的类型: HTTP2.0规定了如下帧类型: DATA: 用于传输HTTP消息体 HEADERS:用 ...
- PHP分帧后台模板页面css样式,js引入方法
一,首先把下载好的分帧后台模板放到对应的目录中,HTML显示页面放到View目录中,CSS和JS.img图片等公共资源放到include目录中 二.然后开始准备更改CSS和JS , img路径操作:( ...
- C#视频取帧图
由于项目里页面有许多视频资料需要展示给用户查看,因此需要做一个视频列表,原设计是列表显示视频第一帧图,但实际上很多视频第一帧是纯黑底色. 于是想到用js利用canvas截图,最后发现由于浏览器跨域限制 ...
- Java截取视频首帧并旋转正向
package test; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Image; import j ...
- Android之使用MediaMetadataRetriever类获取视频第一帧
一.首先,来介绍一下MediaMetadataRetriever类,此类位于android.media包下,这里,先附上可查看此类的API地址:MediaMetadataRetriever类.大家能够 ...
- 在使用TCP协议进行消息发送时,对消息分帧
成帧与解析 阅读 <java TCP/IP Socket 编程>第三章笔记 成帧技术(frame)是解决如何在接收端定位消息的首尾位置的问题.在进行数据收发时,必须指定消息接收者如何确定何 ...
- python视频与帧图片的相互转化,以及查看视频分辨率
1.拆分视频为帧图片 import cv2 def video2frame(videos_path,frames_save_path,time_interval): vidcap = cv2.Vide ...
- Android 视频播放器切换到下个视频时残留上个视频画面的解决办法
最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面. 这是怎么回事? 我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...
- HTML的窗口分帧
下面通过一个后台管理的部分设计来说明窗口分帧 frameset.html代码 <!-- <frameset>标签(常用来做后台管理界面) 属性:rows(行).cols(列).可以使 ...
随机推荐
- 手动添加PopMenu出现的问题
最近在github上找了个比较酷的弹出菜单PopMenu用来做分享页面,demo下载运行OK,于是拖进项目中,一编译就呵呵了.... 一看demo目录,原来这还还引用了其他库,于是把pod下面的pop ...
- 利用requestjs优化响应式移动端js加载
html: <script data-main="main" src="require.js"></script> main.js re ...
- appnium框架以及源码研究
android4.0后,google提供了uiautomator来进行自动化方案,appium在高版本android上就是基于这个,4.0下是基于selendroid. appium相当于一个中转站, ...
- jquery中get传输方法实现读取xml文件
xml文件: <?xml version="1.0" encoding="gb2312"?> <china> <province ...
- Python语法基础(长期)
os.mkdir和os.mkdirs的区别? 前者如果"中间路径"不存在,会抛出异常,后者则会自动创建中间路径. map(function, iterable) 对于可迭代函数`` ...
- SharpZipLib.dll 压缩文件,可以应用于MVC, webform. C# windows application 等等地方
Nuget 安装:Install-Package ICSharpCode.SharpZipLib.dll private void WriteZipFile(string[] filesToZip, ...
- angularjs各版本下载
下载网址:https://code.angularjs.org/1.2.14/
- Hibernate 异常 集锦
异常1.Error parsing JNDI name [foo] 异常信息摘要: org.hibernate.engine.jndi.JndiException: Error parsing JND ...
- sqlserver跨数据库与跨服务器使用
sqlserver跨数据库与跨服务器使用 日常数据库编程中经常会遇到需要跨数据库和跨服务器的情况,本文总结解决方法,具体如下: 工具/原料 SQLSERVER 数据库 方法/步骤 跨数据库使用比较 ...
- js基础 2