美文网首页
ios - 获取视频第一桢(异步执行,不会阻塞主线程)

ios - 获取视频第一桢(异步执行,不会阻塞主线程)

作者: 温柔vs先生 | 来源:发表于2023-04-23 18:20 被阅读0次
    
    #pragma mark ----------------异步获取视频第一帧---------------------------------
    +(void)getVideoImageWithVideoURL:(NSURL *)videoURL atTime:(NSTimeInterval)time result:(void (^)(UIImage* image))block
    {
        //先从缓存中查找是否有图片
    
         
        NSString * key=[[videoURL.absoluteString lastPathComponent] stringByDeletingPathExtension];
        NSString *filePath = [[GlobalFunc getHistoryCachePath:@"FirstImages"] stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png",key]];
        UIImage *memoryImage =  [UIImage imageWithContentsOfFile:filePath];
        if (memoryImage)
        {
              block(memoryImage);
               return;
        }
         //如果都不存在,开启异步线程截取对应时间点的画面,转成图片缓存至磁盘
         
             AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
             AVAssetImageGenerator *assetGen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
             NSMutableArray *times = [NSMutableArray array];
            CMTime inTime = CMTimeMake(1, 25); //第i帧  帧率
                 // CMTime inTime=CMTimeMakeWithSeconds(duratuon+i/totalFrames, fps);
            NSValue *timeValue = [NSValue valueWithCMTime:inTime];
            [times addObject:timeValue];
             [assetGen generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
          
                
                 switch (result) {
                     case AVAssetImageGeneratorCancelled:
                         NSLog(@"Cancelled");
                         break;
                     case AVAssetImageGeneratorFailed:
                         NSLog(@"Failed");
                         break;
                     case AVAssetImageGeneratorSucceeded: {
                         NSLog(@"videoURL:%@",videoURL);
                         UIImage *thumbnailImage=[UIImage imageWithCGImage:image];
                         [asset cancelLoading];
                         dispatch_sync(dispatch_get_main_queue(), ^{
                             block(thumbnailImage);
                             NSData *imgData = UIImagePNGRepresentation([UIImage imageWithCGImage:image]);
                             [imgData writeToFile:filePath atomically:YES];
                         });
    
                         
                     }
                         break;
                 }
             }];
    
    }
    

    这个方法多次调用阻塞主线程

    // 获取视频第一帧图片
    +(UIImage *)getVideoFirstViewImage:(NSURL *)path
    {
      
      AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:path options:nil];
      AVAssetImageGenerator *assetGen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
      assetGen.appliesPreferredTrackTransform = YES;
      CMTime time = CMTimeMakeWithSeconds(0.0, 600);
      NSError *error = nil;
      CMTime actualTime;
      CGImageRef image = [assetGen copyCGImageAtTime:time actualTime:&actualTime error:&error];
      UIImage *videoImage = [[UIImage alloc] initWithCGImage:image];
      CGImageRelease(image);
       return videoImage;
    }
    

    相关文章

      网友评论

          本文标题:ios - 获取视频第一桢(异步执行,不会阻塞主线程)

          本文链接:https://www.haomeiwen.com/subject/tndyjdtx.html