KSVideoHelper.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //
  2. // KSVideoHelper.m
  3. // KulexiuForTeacher
  4. //
  5. // Created by 王智 on 2022/4/12.
  6. //
  7. #import "KSVideoHelper.h"
  8. #import <AVFoundation/AVAsset.h>
  9. #import <AVFoundation/AVAssetImageGenerator.h>
  10. #import <AVFoundation/AVTime.h>
  11. #import <SDWebImage/SDImageCache.h>
  12. @implementation KSVideoHelper
  13. + (void)getVideoPreviewImageUrl:(NSString *)videoUrl forImageView:(UIImageView *)imageView placeholder:(UIImage *)placeHolder {
  14. videoUrl = [videoUrl getUrlEndcodeString];
  15. [[SDImageCache sharedImageCache] queryCacheOperationForKey:videoUrl done:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
  16. //是否有缓存图片
  17. if(image){
  18. imageView.image = image;
  19. }else{
  20. //获取视频第一帧
  21. [self getVideoFirstViewImage:videoUrl forImageView:imageView placeHolderImage:placeHolder];
  22. }
  23. }];
  24. }
  25. // 获取视频第一帧
  26. + (void)getVideoFirstViewImage:(NSString *)videoURL forImageView:(UIImageView *)imageView placeHolderImage:(UIImage *)placeHolder {
  27. NSString *url = [videoURL getUrlEndcodeString];
  28. __block UIImage *videoImage;
  29. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  30. AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:url] options:nil];
  31. NSParameterAssert(asset);
  32. AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc] initWithAsset:asset];
  33. assetImageGenerator.appliesPreferredTrackTransform = YES;
  34. assetImageGenerator.apertureMode =AVAssetImageGeneratorApertureModeEncodedPixels;
  35. CGImageRef thumbnailImageRef = NULL;
  36. NSError *thumbnailImageGenerationError = nil;
  37. thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(0, 60)actualTime:NULL error:&thumbnailImageGenerationError];
  38. if(!thumbnailImageRef)
  39. NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);
  40. videoImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage:thumbnailImageRef]: nil;
  41. dispatch_async(dispatch_get_main_queue(), ^{
  42. //主线程更新UI
  43. if(videoImage){
  44. imageView.image = videoImage;
  45. //缓存图片
  46. [[SDImageCache sharedImageCache] storeImage:videoImage forKey:videoURL toDisk:NO completion:^{
  47. }];
  48. }else{
  49. //如果不是视频就设置图片
  50. [imageView sd_setImageWithURL:[NSURL URLWithString:[videoURL getUrlEndcodeString]] placeholderImage:placeHolder];
  51. }
  52. });
  53. });
  54. }
  55. + (void)getVideoDuration:(NSString *)videoUrl displayInLabel:(UILabel *)displayLabel {
  56. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  57. AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:videoUrl] options:nil];
  58. float second = asset.duration.value / asset.duration.timescale;
  59. NSString *durationString = [NSString stringWithFormat:@"%.0f",second];
  60. NSInteger duration = [durationString integerValue];
  61. NSString *timeDesc = @"00:00";
  62. if (duration / 60 > 0) {
  63. NSInteger secondTime = duration % 60;
  64. NSString *secondStr = @"";
  65. if (secondTime < 10) {
  66. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  67. } else {
  68. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  69. }
  70. timeDesc = [NSString stringWithFormat:@"%2ld:%@", duration / 60, secondStr];
  71. }
  72. else {
  73. NSInteger secondTime = duration % 60;
  74. NSString *secondStr = @"";
  75. if (secondTime < 10) {
  76. secondStr = [NSString stringWithFormat:@"0%zd",secondTime];
  77. } else {
  78. secondStr = [NSString stringWithFormat:@"%zd",secondTime];
  79. }
  80. timeDesc = [NSString stringWithFormat:@"00:%@", secondStr];
  81. }
  82. dispatch_async(dispatch_get_main_queue(), ^{
  83. displayLabel.text = timeDesc;
  84. });
  85. });
  86. }
  87. @end