ios:短视频源码生成webp动图客户端解决方案

简介: 最近要求做一个类似抖音将短视频生成动图在列表进行展示的需求,生成动图最大的好处是用户在列表能够最直观地预览到短视频的大致内容,虽然这个是个用户体验的加分项,但是如果我们不能处理好图片占用空间及清晰度问题,也会带来副作用。
最近要求做一个类似抖音将短视频生成动图在列表进行展示的需求,生成动图最大的好处是用户在列表能够最直观地预览到短视频的大致内容,虽然这个是个用户体验的加分项,但是如果我们不能处理好图片占用空间及清晰度问题,也会带来副作用。

那么,我们该如何权衡呢?
Gif or Webp?

要想使用动图并且图片足够小,当然是用Webp了,图1是gif和webp的对比,可见webp节省了不少空间!这里有篇介绍Webp的经典文章,有兴趣的朋友可以了解下:浓缩的精华!从零开始带你认识最新的图片格式WEBP。

截取视频帧
截取视频一帧关键代码如下:

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
//下面两个值设为0表示精确取帧,否则系统会有优化取出来的帧时间间隔不对等

generator.requestedTimeToleranceAfter = kCMTimeZero;
generator.requestedTimeToleranceBefore = kCMTimeZero;

生成Webp
这里推荐一个功能强大的iOS 图像框架:YYImage。
使用YYImageEncoder可以很方便的生成gif或webp动图,实例代码:

YYImageEncoder *gifEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
gifEncoder.loopCount=0;
gifEncoder.quality=0.8;
[gifEncoder addImage:img duration:0.1];
[gifEncoder encodeToFile:filePath];

至此,2个关键技术点讲完了,不妨试试截取几帧生成一个webp试试手......
当你惊喜的发现图片已经生成的同时,也会惊讶的发现图片占用空间依然很大啊。
继续优化
要想尽可能的优化图片空间,只有从两个方面入手:
1、尽可能减少图片帧数
2、尽可能压缩图片
针对第一点,以及参考抖音的效果,我的方案如下:
总共截取9帧图片,前5帧从视频的0.5秒开始,每间隔0.1秒截取一帧;然后倒序再截取4帧,从而形成倒序播放的效果。
针对第二点,首先对图片大小按比例进行裁剪,以最大边长不超过480为依据进行等比压缩,然后设置0.8的有损压缩。
最终方案:
  • (void)saveToWebpByVideoPath:(NSURL)videoUrl webpFilePath:(NSString)webpFilePath{

    YYImageEncoder *gifEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
    gifEncoder.loopCount=0;
    gifEncoder.quality=0.8;
    AVURLAsset*asset = [[AVURLAssetalloc]initWithURL:videoUrloptions:nil];
    int64_t scale = asset.duration.timescale;
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform = YES;
    //下面两个值设为0表示精确取帧,否则系统会有优化取出来的帧时间间隔不对等
    generator.requestedTimeToleranceAfter = kCMTimeZero;
    generator.requestedTimeToleranceBefore = kCMTimeZero;
    for(inti =0; i <=4; i++) {

    CGFloatstarttime = i*0.1+0.5;
    CMTimetime =CMTimeMakeWithSeconds(starttime, (int)scale);
    NSError*error =nil;
    CMTimeactualTime;
    CGImageRefimage = [generatorcopyCGImageAtTime:timeactualTime:&actualTimeerror:&error];
    UIImage* img = [UIImageimageWithCGImage:image];
    img = [selfresizeToMaxHeight:480img:img];
    [gifEncoderaddImage:imgduration:0.1];
    CGImageRelease(image);

    }
    for(inti=3; i>=0; i--) {

    CGFloatstarttime = i*0.1+0.5;
    CMTimetime =CMTimeMakeWithSeconds(starttime, (int)scale);
    NSError*error =nil;
    CMTimeactualTime;
    CGImageRefimage = [generatorcopyCGImageAtTime:timeactualTime:&actualTimeerror:&error];
    UIImage* img = [UIImageimageWithCGImage:image];
    img = [selfresizeToMaxHeight:480img:img];
    [gifEncoderaddImage:imgduration:0.1];
    CGImageRelease(image);

    }
    
    [gifEncoderencodeToFile:webpFilePath];
    NSLog(@"生成webp成功!");

    }

  • (UIImage)resizeToMaxHeight:(CGFloat)height img:(UIImage)img{

    if(img.size.width

    if(img.size.height>height) {

    CGSizenewSize =CGSizeMake(height*1.0*img.size.width/img.size.height, height);
    img = [imgyy_imageByResizeToSize:newSize contentMode:UIViewContentModeScaleToFill];

    }

    }
    else{

    if(img.size.width>height) {

    CGSizenewSize =CGSizeMake(height,img.size.height*height*1.0/img.size.width);
    img = [imgyy_imageByResizeToSize:newSize contentMode:UIViewContentModeScaleToFill];

    }

    }
    returnimg;

    }

相关文章
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
测试技术 开发工具 iOS开发
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
这篇文章是iOS自动化测试方案的第三部分,介绍了在没有MacOS系统条件下,如何使用WDA(WebDriverAgent)结合Python客户端库facebook-wda和tidevice工具,在Windows系统上实现iOS应用的自动化测试,包括环境准备、问题解决和扩展应用的详细步骤。
2820 1
iOS自动化测试方案(三):WDA+iOS自动化测试解决方案
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
329 7
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
502 8
|
前端开发 开发工具 Android开发
探索安卓与iOS应用开发:跨平台解决方案的崛起
【8月更文挑战第27天】在移动设备日益普及的今天,安卓和iOS系统占据了市场的主导地位。开发者们面临着一个重要问题:是选择专注于单一平台,还是寻找一种能够同时覆盖两大系统的解决方案?本文将探讨跨平台开发工具的优势,分析它们如何改变了移动应用的开发格局,并分享一些实用的开发技巧。无论你是新手还是资深开发者,这篇文章都将为你提供有价值的见解和建议。
|
前端开发 JavaScript Android开发
探索Android和iOS开发中的跨平台解决方案
【8月更文挑战第1天】随着移动应用市场的不断扩张,开发者面临一个共同的挑战——如何高效地为多个平台创建和维护应用程序。本文将深入探讨跨平台开发工具,特别是Flutter和React Native,通过比较它们的优势和限制,并辅以实际代码示例,揭示这些工具如何帮助开发者在保持高性能的同时,实现代码的最大化重用。
|
存储 Web App开发 Android开发
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
1351 1
iOS不支持WebP格式图片解决方案和iPhone 7及其后硬件拍照的HEIC格式图片
|
前端开发 JavaScript Android开发
安卓与iOS开发中的跨平台解决方案
【8月更文挑战第24天】在移动应用开发领域,安卓和iOS两大平台占据了主导地位。然而,为这两个平台分别开发和维护应用会带来额外的时间和成本。本文将探讨跨平台开发的概念、优势以及流行的跨平台框架,如React Native和Flutter,并分析它们如何解决多平台开发的挑战。
|
Linux 数据库 iOS开发
超级签名源码/超级签/ios分发/签名端本地linux服务器完成签名
该系统完全在linux下运行,不存在使用第三方收费工具,市面上很多系统都是使用的是第三方收费系统,例如:某心签名工具,某测侠等,不开源而且需要每年交费,这种系统只是在这些工具的基础上套了一层壳。请需要系统的放大你们的眼睛。
268 0
|
iOS开发
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
iOS16.1系统由于一个系统弹窗无法取消,导致屏幕卡死无法关机问题及解决方案
2094 0