FUUtility.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //
  2. // FUUtility.m
  3. // FULiveDemo
  4. //
  5. // Created by 项林平 on 2022/8/16.
  6. //
  7. #import "FUUtility.h"
  8. #import <Photos/Photos.h>
  9. @implementation FUUtility
  10. + (void)requestVideoURLFromInfo:(NSDictionary<NSString *,id> *)info resultHandler:(void (^)(NSURL * _Nonnull))handler {
  11. if (info[UIImagePickerControllerReferenceURL]) {
  12. NSURL *refrenceURL = info[UIImagePickerControllerReferenceURL];
  13. PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithALAssetURLs:@[refrenceURL] options:nil];
  14. [[PHImageManager defaultManager] requestAVAssetForVideo:assets.firstObject options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
  15. AVURLAsset *urlAsset = (AVURLAsset *)asset;
  16. !handler ?: handler(urlAsset.URL);
  17. }];
  18. } else if (info[UIImagePickerControllerMediaURL]) {
  19. !handler ?: handler(info[UIImagePickerControllerMediaURL]);
  20. } else {
  21. if (@available(iOS 11.0, *)) {
  22. PHAsset *asset = info[UIImagePickerControllerPHAsset];
  23. [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
  24. AVURLAsset *urlAsset = (AVURLAsset *)asset;
  25. !handler ?: handler(urlAsset.URL);
  26. }];
  27. }
  28. }
  29. }
  30. + (UIImage *)previewImageFromVideoURL:(NSURL *)videoURL preferredTrackTransform:(BOOL)preferred {
  31. if (!videoURL) {
  32. return nil;
  33. }
  34. AVURLAsset *asset = [AVURLAsset assetWithURL:videoURL];
  35. AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
  36. imageGenerator.appliesPreferredTrackTransform = preferred;
  37. CMTime time = CMTimeMakeWithSeconds(0.0, 600);
  38. NSError *error = nil;
  39. CMTime actualTime;
  40. CGImageRef image = [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];
  41. UIImage *videoImage = [[UIImage alloc] initWithCGImage:image];
  42. CGImageRelease(image);
  43. return videoImage;
  44. }
  45. + (UIImage *)lastFrameImageFromVideoURL:(NSURL *)videoURL preferredTrackTransform:(BOOL)preferred {
  46. if (!videoURL) {
  47. return nil;
  48. }
  49. AVURLAsset *asset = [AVURLAsset assetWithURL:videoURL];
  50. AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
  51. imageGenerator.appliesPreferredTrackTransform = preferred;
  52. Float64 lastFrameTime = CMTimeGetSeconds(asset.duration);
  53. CMTime time = CMTimeMakeWithSeconds(lastFrameTime, 600);
  54. NSError *error = nil;
  55. CMTime actualTime;
  56. CGImageRef image = [imageGenerator copyCGImageAtTime:time actualTime:&actualTime error:&error];
  57. UIImage *videoImage = [[UIImage alloc] initWithCGImage:image];
  58. CGImageRelease(image);
  59. return videoImage;
  60. }
  61. @end