iOS 视频动图webp的生成解决方案

使用框架 YImage

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

方案二

- (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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值