文档章节

ios获取视频某一帧

H
 HeroHY
发布于 2017/05/03 10:59
字数 772
阅读 700
收藏 0
iOS

精选30+云产品,助力企业轻松上云!>>>

项目要求根据服务器返回的视频和秒数,生成该视频的预览图。

网上一搜关键词 “iOS 视频 帧” 结果都是:iOS如何获取视频的第一帧。

但是如果我不想要第一帧,要第s秒的第x帧怎么办?

先贴如何获取第一帧的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (UIImage*) getVideoPreViewImage
{
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:nil];
    AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    [asset release];
    gen.appliesPreferredTrackTransform = YES;
    CMTime time = CMTimeMakeWithSeconds(0.0, 600);
    NSError *error = nil;
    CMTime actualTime;
    CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
    UIImage *img = [[[UIImage alloc] initWithCGImage:image] autorelease];
    CGImageRelease(image);
    [gen release];
    return img;
}

这是很不求甚解的做法,有好多问题都没有考虑到。

一般来说,如果我们打算求第x秒 看如上代码,想都不用想的就去把

1
CMTime time = CMTimeMakeWithSeconds(0.0, 600);

改成想要的时间了,但是,跑一下就会发现差强人意。

为什么呢?

我们先要说CMTime 是什么东西。

CMTime

CMTime 是一个用来描述视频时间的结构体。

他有两个构造函数: * CMTimeMake * CMTimeMakeWithSeconds

这两个的区别是 * CMTimeMake(a,b) a当前第几帧, b每秒钟多少帧.当前播放时间a/b * CMTimeMakeWithSeconds(a,b) a当前时间,b每秒钟多少帧.

我们引用例子来说明它:

  • CMTimeMakeWithSeconds
1
2
3
4
Float64 seconds = 5;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);

OUTPUT: {3000/600 = 5.000}

代表当前时间为5s,视频一共有3000帧,一秒钟600帧

  • CMTimeMake
1
2
3
4
int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);

OUTPUT: {10000/600 = 16.667}

代表时间为16.667s, 视频一共1000帧,每秒600帧

其实,在我们这里,我们关心的只有最后那个总时间。 换句话说,我们把那个(0, 600)换成(x, 600) 是没问题的… = =!

requestedTimeTolerance

那么为什么,效果差了这么多呢? 我们可以把

1
2
3
CGImageRef image = [gen copyCGImageAtTime:time
                                   actualTime:&actualTime
                                        error:&error];

返回的 actualTime 输出一下

1
CMTimeShow(actualTime)

就会发现时间差的很远。 这是为什么呢。

首先他的 actualTime 使用的 fps * 1000 当每秒的帧率。 顺路普及下fps的获取方法

1
float fps = [[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];

然后我们来思考为什么要有 requestTime 和 actualTime 呢? 开始我对这个api 很困惑: 为什么我request的时间 不等于 actual

后来查了一下文档。

当你想要一个时间点的某一帧的时候,他会在一个范围内找,如果有缓存,或者有在索引内的关键帧,就直接返回,从而优化性能。

这个定义范围的API就是 requestedTimeToleranceAfter 和 requestedTimeToleranceBefore

如果我们要精确时间,那么只需要

1
2
 gen.requestedTimeToleranceAfter = kCMTimeZero;
 gen.requestedTimeToleranceBefore = kCMTimeZero;

 

0

H
粉丝 3
博文 162
码字总数 86832
作品 0
海淀
私信 提问
加载中
此博客有 1 条评论,请先登录后再查看。
阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的...

迷你芊宝宝
2019/03/05
2
0
阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的...

阿里云官方博客
2019/03/05
10
0
WWDC 2018 What's New in Cocoa Touch

Framework Updates Performance: Scrolling iOS中的Scrolling基本遵循同样的模式:We load content to be displayed into the views and then we're just moving that content around。大多数......

雨_树
2018/07/16
0
0
阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的...

阿里云云栖社区
2019/02/15
0
0
阿里云移动端播放器高级功能---截图和音频波形

基本介绍 如果用户对视频播放中的某一帧画面特别感兴趣,可以使用截图功能将这一帧视频保存起来。另外有一种场景想知道是否有声音,或者想感知声音的大小震动频率等,可以通过显示一个声音的...

zhaowei121
2019/03/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python 二十三大实践、编码建议和技巧

点击上方“测试开发技术”,选择设为“设为星标” 优质文章,第一时间送达! 近期推文: 2019年下,测试开发技术精选合集 软件测试工程师必备:如何做好接口测试? 阅读全文大概需要 10分钟。...

狂师
02/12
16
0
大佬评清华Jittor,这是怎样一个深度学习框架?

点击上方“机器学习与生成对抗网络”,关注"星标" 获取有趣、好玩的前沿干货! 如何评价清华大学发布的自研深度学习框架-计图(Jittor)? 2020年3月20日,清华自研的深度学习框架,正式对外开...

AI_bryant8
03/21
15
0
MySQL 中 ACID 底层内部实现原理详解

“ ACID 事务底层内部实现原理” Hello,大家好。我是公众号“ 八点半技术站 ”的小编-Bruce.D。 今天是周二(2020-03-24),还是那句俗语 “一日之计在于晨” ,因此分享给大家的是 「mysql...

八点半的Bruce丶D
03/24
13
0
利用Makisu构建容器镜像

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 本系列文章深入研究了容器镜像构建的最新技术。我们已经介绍了Podman和Buildah、I...

osc_8exjk9uk
19分钟前
13
0
业务代码耗时操作优化

前几天我把我们小程序登录接口性能优化了,优化之前登录接口响应时间大概是 300 ms 左右,优化后的响应时间大概在 70 ms 左右。我们小程序登录接口涉及到的业务操作除了基本的登录验证功能外...

python6666
2019/11/17
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部